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的批量更新操作完成。

MySQL字符串函数:字符串截取

MySQL 字符串截取函数:left(), right(), substring(), substring_index()。还有 mid(), substr()。其中,mid(), substr() ...
  • semial
  • semial
  • 2015年09月14日 17:20
  • 2620

详解Hadoop核心架构

Hadoop核心架构 通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoo...

mybatis的批量插入与更新

一:Oracle数据库 1:批量插入     insert into RECIPEDETAIL (RDID, ROID, TYPE,        NAME, MEDIWEIGHT, MEDINUM...
  • jackyxwr
  • jackyxwr
  • 2016年01月27日 11:48
  • 21318

【java项目实践】mybatis执行update批量更新时报错

在使用Mybatis 批量更新时,想要批量更新时通常在mapper中这么写: 定义Mapper  Dao接口中定义: 最后在service中调用: 生成的sql直接放到mysql中运行完全...

Mybatis批量插入、更新

今天研究了一下Mybatis的foreach,研究过程中发现有几点比较重要,记录下来。 第一个:foreach的collection属性 如果参数是List,那就写list,如果是数组,就写array...

Mybatis多条件批量更新

Mybatis多条件批量更新在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句。foreach元素的属性主要有 item,index,collection,open,separ...

mybatis如何实现批量更新和插入新增实例详解(附SQL以及mapper配置)

mybatis如何实现批量更新和插入新增实例详解(附SQL以及mapper配置) 本系列示例sql均在Mysql中验证过Mybatis批量插入、批量修改批量插入 step1:创建DB表...

mybatis执行批量更新update

Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/。目前想批量更新,如果update的值是相同的话...

Mybatis+Oracle进行数据的批量插入和更新

Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事...
  • w_y_t_
  • w_y_t_
  • 2016年05月15日 11:04
  • 6098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mybatis的批量更新
举报原因:
原因补充:

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