All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.org.atool.fluent.mybatis.base.crud.BatchCrudImpl Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.base.crud;

import cn.org.atool.fluent.mybatis.base.BatchCrud;
import cn.org.atool.fluent.mybatis.base.IEntity;
import cn.org.atool.fluent.mybatis.base.IRefs;
import cn.org.atool.fluent.mybatis.segment.BaseWrapper;
import cn.org.atool.fluent.mybatis.segment.WhereBase;
import cn.org.atool.fluent.mybatis.segment.model.WrapperData;
import lombok.Getter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.org.atool.fluent.mybatis.utility.MybatisUtil.assertNotNull;
import static java.lang.String.format;

/**
 * 批量增删改语句构造实现
 *
 * @author wudarui
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class BatchCrudImpl implements BatchCrud {
    @Getter
    protected final WrapperData wrapperData = new WrapperData();

    private final List list = new ArrayList<>();

    public String batchSql() {
        return String.join(";\n", list);
    }

    @Override
    public BatchCrud addUpdate(IBaseUpdate... updates) {
        for (IBaseUpdate updater : updates) {
            if (!(updater instanceof BaseWrapper)) {
                throw new IllegalArgumentException("the updater should be instance of BaseWrapper");
            }
            BaseSqlProvider provider = this.findSqlProvider(updater.getWrapperData().getEntityClass());
            String sql = provider.buildUpdaterSql(updater.getWrapperData());
            updater.getWrapperData().sharedParameter(wrapperData);
            list.add(sql);
        }
        return this;
    }

    @Override
    public BatchCrud addDelete(IBaseQuery... deletes) {
        for (IBaseQuery query : deletes) {
            if (!(query instanceof BaseWrapper)) {
                throw new IllegalArgumentException("the query should be instance of BaseWrapper");
            }
            BaseSqlProvider provider = this.findSqlProvider(query.getWrapperData().getEntityClass());
            String sql = provider.buildDeleteSql(query.getWrapperData(), false);
            query.getWrapperData().sharedParameter(wrapperData);
            list.add(sql);
        }
        return this;
    }

    private static final Map SQL_PROVIDER_MAP = new HashMap<>();

    private BaseSqlProvider findSqlProvider(Class klass) {
        if (SQL_PROVIDER_MAP.containsKey(klass)) {
            return SQL_PROVIDER_MAP.get(klass);
        }
        synchronized (SQL_PROVIDER_MAP) {
            if (SQL_PROVIDER_MAP.containsKey(klass)) {
                return SQL_PROVIDER_MAP.get(klass);
            }
            String klassName = buildSqlProviderClassName(klass);
            try {
                Class providerKlass = Class.forName(klassName);
                BaseSqlProvider provider = (BaseSqlProvider) providerKlass.getDeclaredConstructor().newInstance();
                SQL_PROVIDER_MAP.put(klass, provider);
                return provider;
            } catch (Exception e) {
                throw new RuntimeException("findSqlProvider[" + klassName + "] error:" + e.getMessage(), e);
            }
        }
    }

    private String buildSqlProviderClassName(Class klass) {
        String pack = klass.getPackage().getName();
        pack = pack.substring(0, pack.length() - ".entity".length()) + ".helper";
        String name = klass.getSimpleName();
        name = name.substring(0, name.length() - "Entity".length()) + "SqlProvider";
        return pack + "." + name;
    }

    private static final String ENTITY_LIST_KEY = "list";

    @Override
    public BatchCrud addInsert(IEntity... entities) {
        for (IEntity entity : entities) {
            if (entity == null) {
                continue;
            }
            if (!wrapperData.getParameters().containsKey(ENTITY_LIST_KEY)) {
                wrapperData.getParameters().put(ENTITY_LIST_KEY, new ArrayList<>());
            }
            BaseSqlProvider provider = this.findSqlProvider(entity.getClass());
            List values = (List) wrapperData.getParameters().get(ENTITY_LIST_KEY);
            int index = values.size();
            values.add(entity);
            String prefix = format("ew.wrapperData.parameters.%s[%d].", ENTITY_LIST_KEY, index);
            String sql = provider.buildInsertSql(prefix, entity, entity.findPk() != null);
            list.add(sql);
        }
        return this;
    }

    @Override
    public BatchCrud addInsertSelect(String insertTable, String[] fields, IQuery query) {
        assertNotNull("query", query);
        query.getWrapperData().sharedParameter(wrapperData);
        String sql = BaseSqlProvider.buildInsertSelect(IRefs.instance().defaultDbType(), insertTable, fields, query);
        list.add(sql);
        return this;
    }

    @Override
    public WhereBase where() {
        throw new IllegalStateException("not supported by BatchUpdater.");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy