当前的tkmybatis插件,默认的批量插入功能,是需要自动生成主键的(tk.mybatis.mapper.common.special.InsertListMapper),不能通过调用者自己指派主键的形式。经过分析和改造后,在原来InsertListMapper的形式上,额外扩展了允许自己指派主键的批量插入。代码如下:
第一步:创建InsertListExtMapper接口,注意接口上要增加@RegisterMapper注解
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.poi.ss.formula.functions.T;
import tk.mybatis.mapper.provider.SpecialProvider;
import java.util.List;
@tk.mybatis.mapper.annotation.RegisterMapper
public interface InsertListExtMapper<T> {
/**
* 批量插入全部字段,包括主键
* @param recordList 数据列表
* @return
*/
@InsertProvider(type = SpecialSqlExtProvider.class, method = "dynamicSQL")
int insertListAllFied(List<? extends T> recordList);
}
第二步:创建SpecialSqlExtProvider类,用于提供动态批量语句的生成
import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import java.util.Set;
/**
* 专用sql扩展提供者。扩展tk.mybatis类。
*/
public class SpecialSqlExtProvider extends MapperTemplate {
public SpecialSqlExtProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
/**
* 批量插入所有字段,包括主键。
*
* @param ms
*/
public String insertListAllFied(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
//开始拼sql
StringBuilder sql = new StringBuilder();
sql.append("<bind name=\"listNotEmptyCheck\" value=\"@tk.mybatis.mapper.util.OGNL@notEmptyCollectionCheck(list, '" + ms.getId() + " 方法参数为空')\"/>");
sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.insertColumns(entityClass, false, false, false));
sql.append(" VALUES ");
sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
//获取全部列
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
for (EntityColumn column : columnList) {
if (column.isInsertable()) {
sql.append(column.getColumnHolder("record") + ",");
}
}
sql.append("</trim>");
sql.append("</foreach>");
// 反射把MappedStatement中的设置主键名
EntityHelper.setKeyProperties(EntityHelper.getPKColumns(entityClass), ms);
return sql.toString();
}
}
第三步:将需要使用的Mapper接口继承InsertListExtMapper接口:
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.special.InsertListMapper;
/**
* Description: 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加
*/
public interface MyMapper<T> extends BaseMapper<T>, ConditionMapper<T>, IdsMapper<T>, InsertListMapper<T>, InsertListExtMapper<T> {
}
然后启动,运行即可。