mybatis中提供新增、修改、删除等,但是批量导入的方法是只支出数据库表主键为自增的,如果需要用到的地方很多,就很不方便,所以这个提供自定义一个mapper以支持非自增数据库的批量新增
以前的做法:
在mapper文件中定义接口,然后在xml文件中定义下列代码,但是如果业务中很多类都需要批量导入,这样重复工作过多,很是繁琐。
<insert id="batchInsert">
INSERT INTO features_petition (
id,
name
)
VALUES
<foreach collection="recordLists" item="record" separator=",">
(
#{record.id},
#{record.name}
)
</foreach>
</insert>
1、定义接口
SpecialBatchMapper
@RegisterMapper
public interface SpecialBatchMapper<T> {
/**
* 批量插入数据库,所有字段都插入,包括主键
* @param recordList
*
* @return
*/
@Options(useGeneratedKeys = true, keyProperty = "id")
@InsertProvider(type = SpecialBatchProvider.class, method = "insertListUseAllCols")
int insertListUseAllCols(List<T> recordList);
2、定义构造sql
SpecialBatchProvider
public class SpecialBatchProvider extends MapperTemplate {
public SpecialBatchProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
public String insertListUseAllCols(MappedStatement ms) {
Class<?> entityClass = getEntityClass(ms);
//开始拼sql
StringBuilder sql = new StringBuilder();
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>");
return sql.toString();
}
}
3、使用方法
1、在原有的MyMapper中继承该接口
在该mapper中即可操作批量导入,主键为自定义(自带的是只支持主键自增)
假如有一个userMapper集成MyMapper,使用方法就是
userMapper.insertListUseAllCols(List<User> users)
2、在tk.mybatis中重新构建jar包,导入
参考:https://blog.csdn.net/donkeyboy001/article/details/86903969