mybatis执行批量更新update

转载 2017年03月29日 16:25:59

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


批量更新

mysql更新语句很简单,更新一条数据的某个字段,一般这样写:

复制代码 代码如下:

UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

如果更新同一字段为同一个值,mysql也很简单,修改下where即可:

复制代码 代码如下:

 UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');
 

这里注意 ‘other_values' 是一个逗号(,)分隔的字符串,如:1,2,3

那如果更新多条数据为不同的值,可能很多人会这样写:

复制代码 代码如下:

foreach ($display_order as $id => $ordinal) {
    $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";
    mysql_query($sql);
}

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

复制代码 代码如下:

UPDATE mytable
    SET myfield = CASE id
        WHEN 1 THEN 'value'
        WHEN 2 THEN 'value'
        WHEN 3 THEN 'value'
    END
WHERE id IN (1,2,3)

这里使用了case when 这个小技巧来实现批量更新。
举个例子:

复制代码 代码如下:

UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END
WHERE id IN (1,2,3)

这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

如果更新多个值的话,只需要稍加修改:

复制代码 代码如下:

UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END,
    title = CASE id
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)
到这里,已经完成一条mysql语句更新多条记录了。




update table set column='...' where id in (1,2,3)l
这样的sql就可以了。Mybatis中这样写就行
<update id="batchUpdateStudentWithMap" parameterType="java.util.Map" >
    UPDATE STUDENT SET name = #{name} WHERE id IN
    <foreach collection="idList" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</update>
      但是这样的需求很少,一般是有个集合,每个元素中的值是不一样的,然后需要一次性更新。一般的处理方式是使用for循环。这样的效率较低,当数据量大时,期望有种一次性插入的操作。如果使用的是mysql,有
insert into table (aa,bb,cc) values(xx,xx,xx),(oo,oo,oo) on duplicate key update
replace into table (aa,bb,cc) values(xxx,xxx,xxx),(ooo,ooo,ooo),(ccc,ccc,ccc) 
两种方式可以处理。
      当前数据库是oracle,可以使用case when来拼成一长串sql处理
UPDATE mytable
    SET myfield = CASE id
        WHEN 1 THEN 'value'
        WHEN 2 THEN 'value'
        WHEN 3 THEN 'value'
    END
WHERE id IN (1,2,3)
实际上这种方式对于mysql也有效。
      最开始的时候,想着写一系列并列的更新语句就可以了
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";"
  open="" close="">
  update REGION_CODE set
    CODE=#{item.Code,jdbcType=VARCHAR},
    NAME=#{item.Name,jdbcType=VARCHAR}
    where ID = #{item.id,jdbcType=DECIMAL}
</foreach>
</update>
这样直接报错,因为Mybatis映射文件中的sql语句不允许 ; 符号。按照可行的case when处理方式,Mybatis映射文件书写方式如下:
<update id="updateBatch" parameterType="java.util.List">
  update REGION_CODE set
    CODE=
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
      when #{item.id,jdbcType=DECIMAL} then #{item.Code,jdbcType=VARCHAR}
  </foreach>
  ,NAME=
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
      when #{item.id,jdbcType=DECIMAL} then #{item.Name,jdbcType=VARCHAR}
  </foreach>
  where ID in
  <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
      #{item.id,jdbcType=DECIMAL}
  </foreach>
</update>
      至此,批量更新功能完成。
 
--------------------------------------------------------------------------------------------------------------------------------
 
原mybatis执行批量更新batch update 的方法(oracle,mysql)

oracle数据库:

1
2
3
4
5
6
7
8
9
10
11
<code class="hljs tcl"><<span class="hljs-keyword">updateid=<span class="hljs-string">"batchUpdate" parameterType=<span class="hljs-string">"java.util.List">
      
       <<span class="hljs-keyword">foreach collection=<span class="hljs-string">"list"item=<span class="hljs-string">"item"index=<span class="hljs-string">"index"<span class="hljs-keyword">open=<span class="hljs-string">"begin"<span class="hljs-keyword">close=<span class="hljs-string">"end;"separator=<span class="hljs-string">";">
                <span class="hljs-keyword">updatetest
                <<span class="hljs-keyword">set>
                  test=${item.test}+<span class="hljs-number">1
                </<span class="hljs-keyword">set>
                whereid = ${item.id}
       </<span class="hljs-keyword">foreach>
          
    </<span class="hljs-keyword">update><br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

mysql数据库:

mysql数据库采用一下写法即可执行,但是数据库连接必须配置:&allowMultiQueries=true

例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&allowMultiQueries=true

1
2
3
4
5
6
7
8
9
10
11
<code class="hljs tcl"><<span class="hljs-keyword">updateid=<span class="hljs-string">"batchUpdate" parameterType=<span class="hljs-string">"java.util.List">
      
          <<span class="hljs-keyword">foreach collection=<span class="hljs-string">"list"item=<span class="hljs-string">"item"index=<span class="hljs-string">"index"<span class="hljs-keyword">open=<span class="hljs-string">""<span class="hljs-keyword">close=<span class="hljs-string">""separator=<span class="hljs-string">";">
                <span class="hljs-keyword">updatetest
                <<span class="hljs-keyword">set>
                  test=${item.test}+<span class="hljs-number">1
                </<span class="hljs-keyword">set>
                whereid = ${item.id}
         </<span class="hljs-keyword">foreach>
          
    </<span class="hljs-keyword">update><br><br><br>------------------------------------------------------------------------------------------------------------------------------<br><br>https://my.oschina.net/zouqun/blog/405424<br><br>--------------------------------------------------------------------------------------------------------------------------------<br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
 文章转载自:http://www.jb51.net/article/41852.htm
                         http://www.cnblogs.com/hyq0002013/p/6077847.html
   

Mybatis中进行批量更新(updateBatch)

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

Mybatis批量更新数据

第一种方式:
  • tolcf
  • tolcf
  • 2014年09月11日 23:34
  • 85915

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

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

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

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

mybatis+mysql的批量更新

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

mybatis的批量插入与更新

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

mybatis执行批量更新update

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

MyBatis批量新增和更新

之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢。使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升。博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新增...
  • u013142781
  • u013142781
  • 2016年05月16日 16:58
  • 10156

Mybatis批量插入、更新

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

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

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

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