Mybatis的update更新批量与普通解决方式对比

目录
  • 需求前提:
  • 1.第一种:应该是效率最低的更新
  • 2.通过批量更新
    • xml改造
  • 注意事项:使用set导致逗号出现的问题
    • < trim>节点标签解读:

需求前提:

通过其他库里面查询出一条数据,并且对另外一个库中的oederId进行更新里面的内容
注意:使用批量update时连接数据库的语句需要添加allowMultiQueries=true

jdbc:mysql://127.0.0.1:3306/tb?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&allowMultiQueries=true

1.第一种:应该是效率最低的更新

查询出来直接进行update修改语句

2.通过批量更新

通过查询匹配存在表里面的数据,就把需要更新的数据添加到一个集合中去,在xml使用foreach来更新数据,如果需要插入的数据太长可能存在一些问题,那我们我们把需要插入的集合进行分批插入,这样也不至于update语句连起来太长了

通过subList方法来截取插入的数量,我们按照500条进行分批插入.

使用该方法必须使用左父右子的形式才能使用父类的方法.

List< T > uptbDtos=new ArrayList<>();

xml改造

    <update id="updateOrderXqlDatas">
        <foreach collection="list" index="index" item="item" separator=";" open="" close="">
            UPDATE tb_taobao_order
            <set>
                <if test="item.wxid != null"> wxid  = #{item.wxid},</if>
                <if test="item.wxname != null"> wxname  = #{item.wxname}</if>
            </set>
            WHERE
            TRADE_ID = #{item.tradeid,jdbcType=VARCHAR}
        </foreach>

    </update>

输出的sql语句:

update tb_taobao_order set wxid='1' ,wxname='哈哈哈'
where TRADE_ID='5456';update tb_taobao_order set wxid='2' ,wxname='哈哈哈2'
where TRADE_ID='5458';

会以这种形式拼接起来然后在一起运行!和第一种的区别在于,第一种是单条update的运行提交!

注意事项:使用set导致逗号出现的问题

如果修改多个值的时候使用需要使用逗号分隔,都是会有一种情况如果对象的值是null那么使用if标签的值就不会会被插入,这样就会出现一个问题,如果对象里面的wxname是null那么插入的语句会变成:update tb_taobao_order set wxid='1' , where TRADE_ID='5456';你会发现wxid=‘1’ 后面跟着一个逗号这样的sql肯定会报错的!**

解决这一个问题:我们把set标签更改掉换成trim标签

  <foreach collection="list" index="index" item="item" separator=";" open="" close="">
            UPDATE tb_taobao_order
            <trim prefix="set" suffixOverrides=",">
                <if test="item.wxid != null"> wxid  = #{item.wxid},</if>
                <if test="item.wxname != null"> wxname  = #{item.wxname}</if>
            </trim>
            WHERE
            TRADE_ID = #{item.tradeid,jdbcType=VARCHAR}
</foreach>

< trim>节点标签解读:

属性:

prefix:trim包含的内容前加上某些前缀

suffix:trim包含的内容后面添加后缀

prefixOverrides:内容首部的某些内容去掉

suffixOverrides:内容的尾部的某些内容去掉

好了修改好后,运行程序开始同步数据

同步时间从原来的1020秒变成现在的16秒速度提升多少呀

没有进行批量更新的时间!

以上就是Mybatis的update更新批量与普通解决方式对比的详细内容,更多关于Mybatis update更新批量普通对比的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决mybatis批量更新(update foreach)失败的问题

    如下所示: <!--批量更新报表 --> <update id="updateIssueByBatch" parameterType="java.util.List"> <foreach collection="issueList" item="item" index="index" separator=";"> update sys_issue &l

  • mybatis执行update批量更新时报错的解决方案

    目录 执行update批量更新时报错 在使用Mybatis批量更新时 定义Mapper Dao接口中定义 最后在service中调用 同时执行多条sql的办法 执行update失败问题 说下原因 解决办法 执行update批量更新时报错 在使用Mybatis 批量更新时 想要批量更新时通常在mapper中这么写: 定义Mapper  Dao接口中定义 最后在service中调用 生成的sql直接放到mysql中运行完全没有问题,但是mybatis执行的时候却会报错: <span style=&quo

  • Mybatis中使用updateBatch进行批量更新

    背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新.(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的就是一次性更新所有数据).两种方式各有利弊,下面将会对两种方式的利弊做简要分析,主要介绍第二种方式在mybatis中的实现. 逐条更新 这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控,更新失败或成功,从什么内容更新到什么内容,都可以在逻辑代码

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • Mybatis的update更新批量与普通解决方式对比

    目录 需求前提: 1.第一种:应该是效率最低的更新 2.通过批量更新 xml改造 注意事项:使用set导致逗号出现的问题 < trim>节点标签解读: 需求前提: 通过其他库里面查询出一条数据,并且对另外一个库中的oederId进行更新里面的内容注意:使用批量update时连接数据库的语句需要添加allowMultiQueries=true jdbc:mysql://127.0.0.1:3306/tb?useUnicode=true&characterEncoding=utf-8&am

  • django model的update时auto_now不被更新的原因及解决方式

    gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """基类,提供共同信息,不会创建真实的table""" class Meta: # 声明自己为抽象基类 abstract = True # 下面表示先根据更新时间gmt_modify降序排序,如果更新时间相同,再根据创建时间gmt_create降序排序 ordering = ['-g

  • mybatis-plus update更新操作的三种方式(小结)

    目录 1.@ 根据id更新 2.@ 条件构造器作为参数进行更新 3.@ lambda构造器 mybatisplus update语句为null时没有拼接上去 1.@ 根据id更新 User user = new User(); user.setUserId(1); user.setAge(29); userMapper.updateById(user); 2.@ 条件构造器作为参数进行更新 //把名字为rhb的用户年龄更新为18,其他属性不变 UpdateWrapper<User> updat

  • 解决Mybatis返回update后影响的行数问题

    主要在JDBC链接中加入这个参数即可: useAffectedRows=true 补充知识:mybatis批量update,返回行数为-1 mybatis批量更新返回结果为1,是由于mybatis的defaultExExecutorType引起的, 它有三个执行器:SIMPLE 就是普通的执行器:REUSE 执行器会重用预处理语句(prepared statements): BATCH 执行器将重用语句并执行批量更新. BATCH可以批量更新操作,缓存SQL以提高性能,缺陷就是无法获取updat

  • 详解mybatis 批量更新数据两种方法效率对比

    上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMulti

  • Mybatis传入List实现批量更新的示例代码

    Dao层写法 /** * 批量更新新库存 * @param list * @return */ int updateNewStock(@Param(value = "list") List<GreenBeanMsg> list); xml具体实现代码 <update id="updateNewStock" parameterType="java.util.List"> <foreach collection=&quo

  • mybatis update更新字段的使用操作

    多个mapper方法,更新单字段 说实话不太推荐,因为如果有10个字段要更新,难道写10个方法. 但是实际中很多人都这么写. 通用mapper方法,java代码控制字段 特点是一个mapper方法包含所有字段,不为空的就update. 但是需要控制入参,一般有2中方式: new 一个对象然后set id和要改的字段 如果字段多比较费劲,需要一个一个set. 查询出对象,然后set要改的字段 这2种方式差不多,就是代码看起来不一样. 特别注意,定位字段不要加if 要更新的字段加if没有什么问题 但

  • Mybatis执行update失败的解决

    Mybatis执行update失败 今天在进行分布式重构项目的时候碰到一个问题,在执行sql的时候只有update不能成功,其他语句都可以正常执行,报错如下: 版本:org.mybatis:mybatis:3.4.5 接口 @UpdateProvider(type = ManagerProvider.class, method = "updateManager") int updateManager(Manager manager) throws Exception; 报错信息 Loa

  • Mybatis中updateBatch实现批量更新

    目录 一.更新多条数据,每条数据都不一样 1.逐条更新(java实现) 2.逐条更新(mybatis实现) 3.sql批量更新(主力实现) 4.批量更新(单个字段,传参list),实际是sql批量更新的简化版本而已 5.sql批量更新(通过insert实现) 二.更新多条数据,更新的内容一样. 1.传map/传String 2.传map/传list 一.更新多条数据,每条数据都不一样 背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新.(2)一次性更新所有数据(

  • Mybatis中如何进行批量更新(updateBatch)

    目录 背景描述 逐条更新  sql批量更新 背景描述 通常如果需要一次更新多条数据有两个方式: (1)在业务代码中循环遍历逐条更新. (2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的就是一次性更新所有数据).两种方式各有利弊,下面将会对两种方式的利弊做简要分析,主要介绍第二种方式在mybatis中的实现. 逐条更新  这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控,更新失败

随机推荐