mybatis 扩展 批量插入
场景
mybatis plus 中有批量插入的方法 saveBatch
, 不过这个最后 还是循环遍历插入,其实还有其他方式, 给 BaseMapper中增加另一个批量插入的方法 insertBatchSomeColumn
, 其实 mybatis plus 早就 实现了,只不过没有在 BaseMapper中加入
InsertBatchSomeColumn实现
就是拼接成如 insert into table (c1,c2) values(v1,v2),(v11,v22)
这种SQL
ExtBaseMapper
自定义 ExtBaseMapper
java
public interface ExtBaseMapper<T> extends BaseMapper<T> {
/**
* 批量插入: insertBatchSomeColumn 名称和 InsertBatchSomeColumn 中 getMethod 方法相同
* @param list
*/
void insertBatchSomeColumn(@Param("list") List<T> list);
}
重写 DefaultSqlInjector
java
public class ExtSqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}
依赖注入
java
@Bean
public ExtSqlInjector extSqlInjector(){
return new ExtSqlInjector();
}
注意,把 ExtBaseMapper
放在 mapperscan 包下
java
public interface UserMapper extends ExtBaseMapper<ReservationDeviceConfigModel> {
}
测试
java
public void addBatch() {
List<UserModel> list = new ArrayList<>();
for (int i = 0; i < 2; i++) {
UserModel m = new UserModel();
m.setServerUrl("teset"+i);
list.add(m);
}
baseMapper.insertBatchSomeColumn(list);
System.out.println(JSON.toJSONString(list));
}
结果
bash
INSERT INTO t_reservation_device_config (server_url,create_time,update_time) VALUES
('teset0',null,null)
,
('teset1',null,null)
[{"id":2,"serverUrl":"teset0"},{"id":3,"serverUrl":"teset1"}]
可以发现 批量插入成功,并返回了自增 Id