我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

Mybatis批量更新实体对象

(1)Dao层接口

    void batchUpdatePlan(List<PubPurchasePlan> plans);

(2)Mapper.xml 文件

<sql id="batchUpdatePlanCondition">    <where>        <foreach collection="list" item="item" open="( " separator=") or (" close=" )">            comId = #{item.comId} AND id = #{item.id}        </foreach>    </where></sql><update id="batchUpdatePlan" parameterType="list">        UPDATE pub_purchase_plan        <trim prefix="set" suffixOverrides=",">            <trim prefix="warehouseId=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                    WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.warehouseId}                 </foreach>            </trim>            <trim prefix="productId=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                   WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.productId}                 </foreach>            </trim>            <trim prefix="amount=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                   WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.amount}                 </foreach>            </trim>            <trim prefix="deleted=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                   WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.deleted}                 </foreach>            </trim>            <trim prefix="price=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                   WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.price}                 </foreach>            </trim>            <trim prefix="type=case" suffix="end,">                 <foreach collection="list" item="item" index="index">                   WHEN comId = #{item.comId} AND id = #{item.id} THEN #{item.type}                 </foreach>            </trim>        </trim>        <include refid="batchUpdatePlanCondition"/></update>

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

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

实现方式有三种

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

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

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

下面进行实现。

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

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

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

     <!-- 批量更新第一种方法,通过接收传进来的参数list进行循环着组装sql -->     <update id="updateBatch" parameterType="java.util.List" >        <foreach collection="list" item="item" index="index" open="" close="" separator=";">            update standard_relation            <set >                <if test="item.standardFromUuid != null" >                    standard_from_uuid = #{item.standardFromUuid,jdbcType=VARCHAR},                </if>                <if test="item.standardToUuid != null" >                    standard_to_uuid = #{item.standardToUuid,jdbcType=VARCHAR},                </if>                <if test="item.gmtModified != null" >                    gmt_modified = #{item.gmtModified,jdbcType=TIMESTAMP},                </if>            </set>            where id = #{item.id,jdbcType=BIGINT}        </foreach>    </update>     <!-- 批量更新第二种方法,通过 case when语句变相的进行批量更新 -->    <update id="updateBatch" parameterType="java.util.List" >        update standard_relation        <trim prefix="set" suffixOverrides=",">            <trim prefix="standard_from_uuid =case" suffix="end,">                <foreach collection="list" item="i" index="index">                    <if test="i.standardFromUuid!=null">                        when id=#{i.id} then #{i.standardFromUuid}                    </if>                </foreach>            </trim>            <trim prefix="standard_to_uuid =case" suffix="end,">                <foreach collection="list" item="i" index="index">                    <if test="i.standardToUuid!=null">                        when id=#{i.id} then #{i.standardToUuid}                    </if>                </foreach>            </trim>            <trim prefix="gmt_modified =case" suffix="end,">                <foreach collection="list" item="i" index="index">                    <if test="i.gmtModified!=null">                        when id=#{i.id} then #{i.gmtModified}                    </if>                </foreach>            </trim>        </trim>        where        <foreach collection="list" separator="or" item="i" index="index" >            id=#{i.id}        </foreach>    </update>批量更新第三种方法,用ON DUPLICATE KEY UPDATE <insert id="updateBatch" parameterType="java.util.List">        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        <foreach collection="list" item="item" index="index" separator=",">            (#{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})        </foreach>        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)    </insert>
 @Override    public void updateStandardRelations() {        List<StandardRelation> 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");    }

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

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批量更新实体对象的方式是什么

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这期内容当中小编将会给大家带来有关Mybatis批量更新实体对象的方式是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Mybatis批量更新实体对象(1)Dao层接口/** * 根据更新采购计
2023-06-21

pgsql的批量更新方法是什么

在 PostgreSQL 中,可以使用 UPDATE 语句来实现批量更新。可以通过 WHERE 子句来指定要更新的记录,也可以通过使用子查询来更新符合条件的记录。例如,以下是一个简单的批量更新示例,将表中所有 age 大于 30 的记录的
pgsql的批量更新方法是什么
2024-05-10

Mybatis执行多条语句/批量更新的方法是什么

本篇内容主要讲解“Mybatis执行多条语句/批量更新的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mybatis执行多条语句/批量更新的方法是什么”吧!Mybatis执行多条语句/
2023-07-05

Hibernate批量更新和批量删除的方法是什么

这篇文章主要介绍“Hibernate批量更新和批量删除的方法是什么”,在日常操作中,相信很多人在Hibernate批量更新和批量删除的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate
2023-06-17

MySQL中批量更新的方法是什么

在MySQL中,可以使用以下方法来进行批量更新数据:使用UPDATE语句和IN子句:可以通过使用UPDATE语句和IN子句来更新满足条件的多条记录。例如:UPDATE table_name SET column1 = value1 WHER
MySQL中批量更新的方法是什么
2024-04-18

plsql批量更新数据的方法是什么

在PL/SQL中,批量更新数据通常使用FORALL语句。FORALL语句允许一次性更新多行数据,从而提高了效率。具体方法如下:1. 声明一个与被更新表对应的记录集类型和一个与记录集类型对应的变量。2. 使用BULK COLLECT语句将需要
2023-10-12

java批量更新数据的方法是什么

在Java中,可以使用以下方法来批量更新数据:1. 使用JDBC批处理:通过JDBC的批处理功能,可以一次性将多条SQL语句发送到数据库执行。可以使用`PreparedStatement`对象的`addBatch()`方法将多个SQL语句添
2023-09-11

sqlsugar批量更新数据的方法是什么

SQLSugar可以使用批量更新数据的方法是通过UpdateRange方法来实现。该方法可以接收一个包含多个实体的List集合作为参数,然后将这些实体一次性更新到数据库中。示例如下:List entities = new
sqlsugar批量更新数据的方法是什么
2024-04-09

oracle按条件批量更新的方法是什么

Oracle按条件批量更新的方法是使用UPDATE语句结合WHERE子句来指定更新的条件。以下是更新语法的一般格式:```sqlUPDATE table_nameSET column1 = value1, column2 = value2,
2023-09-13

java实体对象转map的方法是什么

Java实体对象转Map的方法有以下几种:1. 使用Java反射机制:通过使用Java的反射机制,可以获取实体对象的所有字段和对应的值,然后将它们存储在一个Map中。```javapublic static Map objectToMap
2023-09-16

java判断实体对象为空的方法是什么

Java判断实体对象是否为空的方法有多种方式,以下是其中一些常用的方法:1. 使用if语句判断对象是否为空:```javaif (object == null) {// 实体对象为空} else {// 实体对象不为空}```2. 使用eq
2023-09-16

json多层嵌套转化实体类对象的方法是什么

要将多层嵌套的JSON转化为实体类对象,可以使用以下方法:1. 创建对应的实体类对象,包括多层嵌套的属性。2. 使用JSON解析库(如Jackson、Gson等)将JSON字符串解析为一个Map对象。3. 遍历Map对象,取出每个键值对。对
2023-08-12

Spring Boot中单例类实现对象的注入方式是什么

本篇内容介绍了“Spring Boot中单例类实现对象的注入方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring Boot
2023-06-20

VNPY参数优化功能v1版本中的更新参数批量生成方法是什么

本篇文章给大家分享的是有关VNPY参数优化功能v1版本中的更新参数批量生成方法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。VNPY的参数优化功能,是策略优化的重要功能。
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录