mybatis-plus根据指定字段批量删除修改
方案一
手写sql
- 这个就不说了,就是因为不想手写sql 所以才有这篇博客
方案二
手动获取sqlsessiontemplate 就是把mybatis plus 干的事自己干了
// 这种方法就是把mybatis的活在干一遍,还是一条一条处理的.只是共用一个session连接
@autowired
private sqlsessiontemplate sqlsessiontemplate;
// 新获取一个模式为batch,自动提交为false的session
sqlsession session = sqlsessiontemplate.getsqlsessionfactory().opensession(executortype.batch,false);
static final batch_size = 1000;
// xxxmapper 为 对应的mapper文件
xxxmapper xxmapper = session.getmapper(xxxmapper.class);
int size = updatelist.size();
try {
for(int i=0; i < size; i++) {
// updatebyxxx 写好的单条数据的方法
xxmapper.updatebyxxx(updatelist.get(i));
if(i % batch_size == 0 || i == size-1){
//手动每1000个一提交,提交后无法回滚
session.commit();
//清理缓存,防止溢出
session.clearcache();
}
}
}catch (exception e) {
session.rollback();
} finally {
session.close();
}
方案三
重写 executebatch 方法
// mybatis plus 源码
@transactional(rollbackfor = exception.class)
@override
public boolean updatebatchbyid(collection<t> entitylist, int batchsize) {
string sqlstatement = getsqlstatement(sqlmethod.update_by_id);
return executebatch(entitylist, batchsize, (sqlsession, entity) -> {
mappermethod.parammap<t> param = new mappermethod.parammap<>();
param.put(constants.entity, entity);
sqlsession.update(sqlstatement, param);
});
}
mybatis plus 的 executebatch

参考 mybatis plus 的updatebatchbyid 方法.
- 调用处:
//删除方法 deletelist 是要删除的主键list
list<string> deletelist = new arraylist<>();
dao.batchdelete(deletelist, delete -> new querywrapper<string>().eq("xx", delete));
// 修改方法 obj 代码表对象
list<obj> updatelist = new arraylist<>();
dao.batchupdate(updatelist, update -> new lambdaquerywrapper<obj>()
.eq(obj::getproductid, update.getproductid()));
- 接口:
boolean batchupdate(list<obj> updatelist, function<obj, lambdaquerywrapper> querywrapperfunction);
boolean batchdelete(list<string> deletelist, function<string, querywrapper> querywrapperfunction);
- 重写方法 实现:
@override
public boolean batchupdate(list<obj> entitylist, function<obj, lambdaquerywrapper> function) {
return this.executebatch(entitylist, default_batch_size, (sqlsession, entity) -> {
parammap param = new parammap();
param.put(constants.entity, entity);
param.put(constants.wrapper, function.apply(entity));
sqlsession.update(this.getsqlstatement(sqlmethod.update), param);
});
}
@override
public boolean batchdelete(list<string> deletelist, function<string, querywrapper> function) {
return this.executebatch(deletelist, default_batch_size, (sqlsession, entity) -> {
parammap param = new parammap();
param.put(constants.entity, entity);
param.put(constants.wrapper, function.apply(entity));
sqlsession.delete(this.getsqlstatement(sqlmethod.delete), param);
});
}
// 也可以传入一个lambdaupdatewrapper 来制定更新
@override
public boolean batchupdate2(list<contproductabstractlocaldo> entitylist, function<contproductabstractlocaldo, lambdaupdatewrapper> function) {
return this.executebatch(entitylist, default_batch_size, (sqlsession, entity) -> {
parammap param = new parammap();
param.put(constants.entity, null);
param.put(constants.wrapper, function.apply(entity));
sqlsession.update(this.getsqlstatement(sqlmethod.update), param);
});
}
示例 : 指定执行的sql 和字段
private lambdaupdatewrapper<obj> getupdatewrapper(objupdate) {
retur new lambdaupdatewrapper<obj>()
.eq(obj::getxx, update.xx())
.set(obj::getxxx, update.xxxx());
总结
这种写法其实批量的效率还是比较慢的,如果对性能没有要求,并且还不想手写sql的,可以试一试。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论