package cn.lili.mybatis.mybatisplus.external;
|
|
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.core.enums.SqlMethod;
|
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.metadata.TableInfoHelper;
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
|
import lombok.Setter;
|
import lombok.experimental.Accessors;
|
import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
|
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.function.Predicate;
|
|
public class InsertIgnoreBatchAllColumn extends AbstractMethod {
|
|
private static final String MAPPER_METHOD = "insertIgnoreBatchAllColumn";
|
private static final long serialVersionUID = 9014932405041929700L;
|
|
@Setter
|
@Accessors(chain = true)
|
private Predicate<TableFieldInfo> predicate;
|
|
protected InsertIgnoreBatchAllColumn(String methodName) {
|
super(methodName);
|
}
|
|
@SuppressWarnings("Duplicates")
|
@Override
|
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
KeyGenerator keyGenerator = new NoKeyGenerator();
|
SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
|
String sqlTemplate = "<script>\nINSERT IGNORE INTO %s %s VALUES %s\n</script>";
|
|
List<TableFieldInfo> fieldList = tableInfo.getFieldList();
|
String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(true, "", false) +
|
this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY);
|
String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;
|
String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(true, ENTITY_DOT, false) +
|
this.filterTableFieldInfo(fieldList, predicate, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY);
|
insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET;
|
String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA);
|
String keyProperty = null;
|
String keyColumn = null;
|
// 表包含主键处理逻辑,如果不包含主键当普通字段处理
|
if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
|
if (tableInfo.getIdType() == IdType.AUTO) {
|
/* 自增主键 */
|
keyGenerator = new Jdbc3KeyGenerator();
|
keyProperty = tableInfo.getKeyProperty();
|
keyColumn = tableInfo.getKeyColumn();
|
} else {
|
if (null != tableInfo.getKeySequence()) {
|
keyGenerator = TableInfoHelper.genKeyGenerator(sqlMethod.getMethod(), tableInfo, builderAssistant);
|
keyProperty = tableInfo.getKeyProperty();
|
keyColumn = tableInfo.getKeyColumn();
|
}
|
}
|
}
|
String sql = String.format(sqlTemplate, tableInfo.getTableName(), columnScript, valuesScript);
|
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
return this.addInsertMappedStatement(mapperClass, modelClass, MAPPER_METHOD, sqlSource, keyGenerator, keyProperty, keyColumn);
|
}
|
}
|