当前位置: 代码网 > it编程>编程语言>Java > mybatis-plus根据指定字段批量,删除、修改实现过程

mybatis-plus根据指定字段批量,删除、修改实现过程

2026年04月23日 Java 我要评论
mybatis-plus根据指定字段批量删除修改方案一手写sql这个就不说了,就是因为不想手写sql 所以才有这篇博客方案二手动获取sqlsessiontemplate 就是把mybatis plus

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的,可以试一试。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com