千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这期内容当中小编将会给大家带来有关Mybatis批量更新实体对象的方式是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Mybatis批量更新实体对象(1)Dao
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 蓝思科技飞鸽互联网 互联网金融监管科技数据 互联网科技金融公司 深圳互联网络科技有限公司 万易互联网科技有限公司 新浪科技互联网 滨湖区互联网智能科技产品供应 济南和联互联网科技有限公司 互联网科技产品 须眉科技是互联网公司吗 昭通互联网科技选哪家 银川新华互联网科技学校联系电话 深圳艾果互联网通讯科技 佛山市拉法互联网科技有限公司 互联网数据科技专业 科技互联网的核心竞争力 互联网科技包装股份有限公司上市 神州科技互联网有限公司 长沙渺峰互联网科技有限公司 保山互联网科技靠谱吗 互联网最新的科技有限公司 万易互联网科技有限公司 奇士达互联网科技 天下捷融互联网科技 苏州大垚互联网科技 深圳市运趣互联网科技有限公司 互联网科技商业 恒生互联网科技指数跳水 迪庆互联网科技招生 2021世界互联网领先科技成果发布
0