package com.terra.system.extend;
|
|
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
|
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
import com.terra.system.entity.all.StaticData;
|
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
|
import org.apache.ibatis.mapping.MappedStatement;
|
import org.apache.ibatis.mapping.SqlSource;
|
|
/**
|
* 批量插入方法
|
* @author WWW
|
*/
|
@SuppressWarnings("ALL")
|
public class InsertBatchMethod extends AbstractMethod {
|
/**
|
* insert into user(id, name, age) values (1, "a", 17), (2, "b", 18);
|
* <script>
|
* insert into user(id, name, age) values
|
* <foreach collection="list" item="item" index="index" open="(" separator="),(" close=")">
|
* #{item.id}, #{item.name}, #{item.age}
|
* </foreach>
|
* </script>
|
*/
|
@Override
|
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
final String sql = "<script>insert into %s %s values %s</script>";
|
final String fieldSql = prepareFieldSql(tableInfo);
|
final String valueSql = prepareValuesSql(tableInfo);
|
final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
|
|
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
|
|
// 第三个参数必须和RootMapper的自定义方法名一致
|
return this.addInsertMappedStatement(mapperClass, modelClass, "insertBatch", sqlSource, new NoKeyGenerator(), null, null);
|
}
|
|
private String prepareFieldSql(TableInfo tableInfo) {
|
StringBuilder fieldSql = new StringBuilder();
|
// fieldSql.append(tableInfo.getKeyColumn()).append(",")
|
// tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(","))
|
for (TableFieldInfo f : tableInfo.getFieldList()) {
|
if (StaticData.INSERT_EXCLUDE_FIELDS.contains(f.getProperty())) {
|
continue;
|
}
|
|
fieldSql.append(f.getColumn()).append(",");
|
}
|
|
fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
|
fieldSql.insert(0, "(");
|
fieldSql.append(")");
|
|
return fieldSql.toString();
|
}
|
|
private String prepareValuesSql(TableInfo tableInfo) {
|
final StringBuilder valueSql = new StringBuilder();
|
valueSql.append("<foreach collection=\"list\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
|
// valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},")
|
// tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"))
|
for (TableFieldInfo f : tableInfo.getFieldList()) {
|
if (StaticData.INSERT_EXCLUDE_FIELDS.contains(f.getProperty())) {
|
continue;
|
}
|
|
valueSql.append("geom".equals(f.getProperty()) ? "${item." : "#{item.").append(f.getProperty()).append("},");
|
}
|
|
valueSql.delete(valueSql.length() - 1, valueSql.length());
|
valueSql.append("</foreach>");
|
|
return valueSql.toString();
|
}
|
}
|