千家信息网

Mybatis批量更新实体对象的方式是什么

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这期内容当中小编将会给大家带来有关Mybatis批量更新实体对象的方式是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Mybatis批量更新实体对象(1)Dao
千家信息网最后更新 2025年11月08日Mybatis批量更新实体对象的方式是什么

这期内容当中小编将会给大家带来有关Mybatis批量更新实体对象的方式是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Mybatis批量更新实体对象

(1)Dao层接口

/**     * 根据更新采购计划(批量)     * @param plans     */    void batchUpdatePlan(List plans);

(2)Mapper.xml 文件

                        comId = #{item.comId} AND id = #{item.id}                    UPDATE pub_purchase_plan                                                         WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.warehouseId}                                                                             WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.productId}                                                                             WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.amount}                                                                             WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.deleted}                                                                             WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.price}                                                                             WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.type}                                             

Mybatis批量更新数据三种方法效率对比

探讨批量更新数据三种写法的效率问题

实现方式有三种

  • 1、用for循环通过循环传过来的参数集合,循环出N条sql

  • 2、用mysql的case when 条件判断变相的进行批量更新

  • 3、用ON DUPLICATE KEY UPDATE进行批量更新

下面进行实现。

注意第一种方法要想成功,需要在db链接url后面带一个参数 &allowMultiQueries=true

即: jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMultiQueries=true

其实这种东西写过来写过去就是差不多一样的代码,不做重复的赘述,直接上代码。

                              update standard_relation                                                standard_from_uuid = #{item.standardFromUuid,jdbcType=VARCHAR},                                                    standard_to_uuid = #{item.standardToUuid,jdbcType=VARCHAR},                                                    gmt_modified = #{item.gmtModified,jdbcType=TIMESTAMP},                                        where id = #{item.id,jdbcType=BIGINT}                             update standard_relation                                                                                when id=#{i.id} then #{i.standardFromUuid}                                                                                                                        when id=#{i.id} then #{i.standardToUuid}                                                                                                                        when id=#{i.id} then #{i.gmtModified}                                                                where                    id=#{i.id}            批量更新第三种方法,用ON DUPLICATE KEY UPDATE         insert into standard_relation(id,relation_type, standard_from_uuid,        standard_to_uuid, relation_score, stat,        last_process_id, is_deleted, gmt_created,        gmt_modified,relation_desc)VALUES                    (#{item.id,jdbcType=BIGINT},#{item.relationType,jdbcType=VARCHAR}, #{item.standardFromUuid,jdbcType=VARCHAR},            #{item.standardToUuid,jdbcType=VARCHAR}, #{item.relationScore,jdbcType=DECIMAL}, #{item.stat,jdbcType=TINYINT},            #{item.lastProcessId,jdbcType=BIGINT}, #{item.isDeleted,jdbcType=TINYINT}, #{item.gmtCreated,jdbcType=TIMESTAMP},            #{item.gmtModified,jdbcType=TIMESTAMP},#{item.relationDesc,jdbcType=VARCHAR})                ON DUPLICATE KEY UPDATE        id=VALUES(id),relation_type = VALUES(relation_type),standard_from_uuid = VALUES(standard_from_uuid),standard_to_uuid = VALUES(standard_to_uuid),        relation_score = VALUES(relation_score),stat = VALUES(stat),last_process_id = VALUES(last_process_id),        is_deleted = VALUES(is_deleted),gmt_created = VALUES(gmt_created),        gmt_modified = VALUES(gmt_modified),relation_desc = VALUES(relation_desc)    
 @Override    public void updateStandardRelations() {        List list=standardRelationMapper.selectByStandardUuid("xiemingjieupdate");        for(StandardRelation tmp:list){            tmp.setStandardFromUuid(tmp.getStandardFromUuid()+"update");            tmp.setStandardToUuid(tmp.getStandardToUuid()+"update");        }        long begin=System.currentTimeMillis();        standardRelationManager.updateBatch(list);        long end=System.currentTimeMillis();        System.out.print("当前的批量更新的方法用时"+(end-begin)+"ms");    }

sql语句for循环效率其实相当高的,因为它仅仅有一个循环体,只不过最后update语句比较多,量大了就有可能造成sql阻塞。

case when虽然最后只会有一条更新语句,但是xml中的循环体有点多,每一个case when 都要循环一遍list集合,所以大批量拼sql的时候会比较慢,所以效率问题严重。使用的时候建议分批插入。

duplicate key update可以看出来是最快的,但是一般大公司都禁用,公司一般都禁止使用replace into和INSERT INTO … ON DUPLICATE KEY UPDATE,这种sql有可能会造成数据丢失和主从上表的自增id值不一致。而且用这个更新时,记得一定要加上id,而且values()括号里面放的是数据库字段,不是java对象的属性字段。

根据效率,安全方面综合考虑,选择适合的很重要。

上述就是小编为大家分享的Mybatis批量更新实体对象的方式是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

更新 循环 效率 对象 数据 方法 实体 方式 语句 代码 公司 内容 参数 字段 就是 循环体 时候 问题 分析 最快 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 移动云服务器安全防护服务 目前业界主流的软件开发方法 网络安全单兵作战是填写题吗 湖北前端软件开发怎么样 网络安全法规定 留存日志 网信办检查网络安全 网络安全法的实施标志着我国 天津图腾服务器机柜报价 网络安全 责任制 路由正常但是服务器不通 剑灵网通一区服务器 网络安全工作亮点总结 软件工程数据库中级 广州八爪鱼网络技术有限公司 医院网络安全技术人员职责 基于多态的软件开发 为什么网络安全是重大的战略问题 平台软件开发工作 青岛海尔软件开发招聘信息 邮储软件开发中心笔试考什么 饥荒服务器管理员放哪里 网络安全脆弱性管理 产品信息怎么存入数据库 江苏新华网络技术有限公司 小米盒子网络安全性 java访问数据库用什么 锦程希望网络技术公司 数据库中汇总是不是分组 南阳东山网络技术服务有限公司 宁波软件开发薪资水平
0