mybatisplus通用 Duplicate

准备工作见上一篇批量插入

通过 Duplicate 进行批量插入或修改

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import org.apache.ibatis.executor.keygen.KeyGenerator;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author  xiu
 * @date  2022/5/19 22:27
 * @description
 */
public class MyDuplicateSelectiveMethod extends AbstractMethod {

    public MyDuplicateSelectiveMethod(String methodName) {
        super(methodName);
    }

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        KeyGenerator keyGenerator = new NoKeyGenerator();
        String sqlScript = "<script>\nINSERT INTO %s %s VALUES %s %s \n</script>";
        String columnScript = SqlScriptUtils.convertTrim(getAllInsertSqlColumnMaybeIf(tableInfo), "(", ")", (String) null, ",");
        String valuesScript = getAllInsertSqlPropertyMaybeIf(tableInfo);
        String sqlDuplicate = sqlDuplicate(tableInfo);
        String sql = String.format(sqlScript, tableInfo.getTableName(), columnScript, valuesScript, sqlDuplicate);


        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, sqlSource, new NoKeyGenerator(), null, null);

    }

    /**
     * sqlDuplicate
     *
     * @return
     */
    private String sqlDuplicate(TableInfo tableInfo) {
        StringBuilder sqlDuplicate = new StringBuilder();
        sqlDuplicate.append(" ON DUPLICATE KEY UPDATE ");
        sqlDuplicate.append(" <trim suffixOverrides=\",\"> ");

        List<TableFieldInfo> fieldList = tableInfo.getFieldList();

        fieldList.forEach((tempColumn) -> {
            sqlDuplicate.append("<if test=\"null != list[0].");
            sqlDuplicate.append(tempColumn.getProperty());
            sqlDuplicate.append("\">");
            sqlDuplicate.append(tempColumn.getColumn());
            sqlDuplicate.append(" = values(");
            sqlDuplicate.append(tempColumn.getColumn());
            sqlDuplicate.append("),</if>");
        });
        sqlDuplicate.append("</trim>");
        return sqlDuplicate.toString();
    }

    /**
     * 复写方法
     *
     * @param tableInfo
     * @return
     */
    private String getAllInsertSqlColumnMaybeIf(TableInfo tableInfo) {
        return tableInfo.getKeyInsertSqlColumn(false, true) + (String) tableInfo.getFieldList().stream().map(tableFieldInfo -> {

            String sqlScript = tableFieldInfo.getInsertSqlColumn();
            String property = "list[0]." + tableFieldInfo.getProperty();
            FieldStrategy fieldStrategy = tableFieldInfo.getInsertStrategy();

            if (fieldStrategy == FieldStrategy.NEVER) {
                return null;
            } else if (fieldStrategy == FieldStrategy.IGNORED) {
                return sqlScript;
            } else {
                return fieldStrategy == FieldStrategy.NOT_EMPTY && tableFieldInfo.isCharSequence() ? SqlScriptUtils.convertIf(sqlScript, String.format("%s != null and %s != ''", property, property), false) : SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", property), false);
            }
        }).filter(Objects::nonNull).collect(Collectors.joining("\n"));
    }

    /**
     * 复写insert
     *
     * @param tableInfo
     * @return
     */
    public String getAllInsertSqlPropertyMaybeIf(TableInfo tableInfo) {
        String newPrefix = "list[0].";
        String insertSql = tableInfo.getKeyInsertSqlProperty(false, "record.", true) + (String) tableInfo.getFieldList().stream().map((tableFieldInfo) -> {

            String sqlScript = "#{record." + tableFieldInfo.getProperty() + "},";
            String property = newPrefix + tableFieldInfo.getProperty();
            FieldStrategy fieldStrategy = tableFieldInfo.getInsertStrategy();

            if (fieldStrategy == FieldStrategy.NEVER) {
                return null;
            } else if (fieldStrategy == FieldStrategy.IGNORED) {
                return sqlScript;
            } else {
                return fieldStrategy == FieldStrategy.NOT_EMPTY && tableFieldInfo.isCharSequence() ? SqlScriptUtils.convertIf(sqlScript, String.format("%s != null and %s != ''", property, property), false) : SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", property), false);
            }

        }).filter(Objects::nonNull).collect(Collectors.joining("\n"));

        StringBuilder sql = new StringBuilder();
        sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");
        sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
        sql.append(insertSql);
        sql.append("</trim>");
        sql.append("</foreach>");
        return sql.toString();
    }

}

然后就能通过myDuplicateSelective进行操作啦


版权声明:本文为sinat_40761705原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。