Mybatis的批量更新

原创 2015年07月09日 17:16:04
今天遇到一个问题,在mybatis 里面执行批量更新操作的问题。
mybatis本身没有提供对于批量操作的接口。所以对于批量的操作都需要自己写。
正常情况下,批量的插入,都是执行一条Sql 比如:
 <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true">  
   <selectKey keyProperty="id" order="AFTER" resultType="long">  
       SELECT  
       LAST_INSERT_ID()  
   </selectKey>
     insert into lable_tag_log (author, operate_sence, 
     comment, update_time, create_time
     )
 values 
     <foreach collection="list" index="index" item="item" separator=",">  
    (#{item.author,jdbcType=VARCHAR}, #{item.operateSence,jdbcType=VARCHAR}, 
     #{item.comment,jdbcType=VARCHAR}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.createTime,jdbcType=TIMESTAMP}
     )
    </foreach>  
</insert>

mybatis会将代码翻译成:insert into lable_tag_log (author, operate_sence, comment, update_time, create_time ) values (?, ?, ?, ?, ? ) , (?, ?, ?, ?, ? )
底层执行的是一条sql代码。
但是在执行批量更新的时候,由于更新的方式不同,结构也有有所不同;
<update id="batchUpdate" parameterType="java.util.List">


    <foreach collection="list" item="item" index="index" open="" close="" separator=";"> 
       update lable_type 
      <set>
      <if test="item.lableTypeName != null">
        lable_type_name = #{item.lableTypeName,jdbcType=VARCHAR},
      </if>
      <if test="item.ifCanRepeat != null">
        if_can_repeat = #{item.ifCanRepeat,jdbcType=INTEGER},
      </if>
      <if test="item.author != null">
        author = #{item.author,jdbcType=VARCHAR},
      </if>
      <if test="item.status != null">
        status = #{item.status,jdbcType=INTEGER},
      </if>
      <if test="item.comment != null">
        comment = #{item.comment,jdbcType=VARCHAR},
      </if>
      <if test="item.updateTime != null">
        update_time = #{item.updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="item.createTime != null">
        create_time = #{item.createTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where id = #{item.id,jdbcType=INTEGER}
    </foreach>
  </update>
批量更新的时候,一次执行的过程中会执行多条sql代码,每条update之间用“;”分割,如下:
update lable_type SET lable_type_name = ?, author = ?, comment = ?, update_time = ? where id = ? ; 
update lable_type SET lable_type_name = ?, author = ?, status = ?, comment = ?, update_time = ? where id = ?
在执行的时候,由于执行了多条sql代码,在mysql的一次连接的时候,默认的预处理的statement执行一条sql,如果发现有多条执行的sql就会抛异常(个人理解)
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manu
al that corresponds to your MySQL server version for the right syntax to use near 'update lable_info...........'
这里面的解决办法就是:在MySQL的连接字符串URL连接中设置allowMultiQueries参数置为true。(只有MySQL Connector/J 3.1.1以上版本才支持)
url=jdbc:mysql://rds2mazmjavuruy.mysql.rds.aliyuncs.com/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true
但是值得注意的是 allowMultiQueries 是一个mysql对外提供的连接api里的一个参数
在Spring的xml文件中 需要将 “&”符号修改成“&amp;”
到此spring mybatis的批量更新操作完成。

Mybatis中进行批量更新(updateBatch)

背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到数据库端,在业务代码端展现的...
  • xyjawq1
  • xyjawq1
  • 2017年07月02日 16:17
  • 30966

mybatis+mysql的批量更新

mybatis+mysql的批量更新
  • qq13398600329
  • qq13398600329
  • 2017年05月16日 10:09
  • 2496

mybatis批量更新的两种实现方式

一:当要更新的内容是不样的 mapper.xml文件,后台传入一个对象集合,另外如果是mysql数据库,一点在配置文件上加上&allowMultiQueries=true,这样才可以执行多条sql ...
  • pangliang_csdn
  • pangliang_csdn
  • 2017年04月01日 16:35
  • 2761

mybatis学习之路----批量更新数据两种方法效率对比

点滴记载,点滴进步,愿自己更上一层楼。
  • xu1916659422
  • xu1916659422
  • 2017年09月13日 21:58
  • 5451

mybatis执行批量更新update

mybatis执行批量更新update Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/。目...
  • twj13162380953
  • twj13162380953
  • 2017年03月13日 16:53
  • 3347

MyBatis中进行批量更新(MySQL数据库)

一、简介在程序开发过程中,往往会遇到需要更新一批数据(批量更新)的情况,这种情况通常有两种方法进行解决。这两种方法各有优点与缺点,这就需要我们根据实际业务需要进行取舍。二、操作1、逐条更新(不推荐)直...
  • u014682573
  • u014682573
  • 2017年12月25日 10:52
  • 193

mybatis批量增、删、改(更新)操作oracle和mysql批量写法小记

前言:用mybatis也好几年了,mybatis在批量的增删操作也写起来也是比较简单的,只有批量更新这一块是特别坑,特此记录。 注:本文主要用来记录oracle和mysql数据库在使用mybatis的...
  • eguid_1
  • eguid_1
  • 2017年02月26日 19:26
  • 751

Mybatis根据id批量更新

控制层: /** * 产品下架 */ @RequestMapping(value = "/shelfDown", method = RequestMethod.POST ) pu...
  • LVAmber
  • LVAmber
  • 2018年01月10日 16:40
  • 82

mybatis 传入map 进行批量更新操作示例

定义dao接口 void modifyHostId(@Param("hostIds") Map hostIds) throws SQLException; ma...
  • woyuchengxian1111
  • woyuchengxian1111
  • 2017年11月17日 13:46
  • 364

mybatis 的批量操作,查询、更新、插入

mybatis 的批量更新 主要依靠 foreach 标签拼接sql 实现批量操作。第一种方法,拼装成一条sql
 update raw_event
 set status = 1
 where i...
  • u012373815
  • u012373815
  • 2017年02月14日 00:09
  • 1967
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mybatis的批量更新
举报原因:
原因补充:

(最多只允许输入30个字)