文档章节

mybatis 实现批量更新

村东邹师傅
 村东邹师傅
发布于 2015/04/23 11:12
字数 1138
阅读 6130
收藏 6
点赞 1
评论 0

更新单条记录

 

1
UPDATE course SET name = 'course1' WHERE id = 'id1';

   更新多条记录的同一个字段为同一个值

 

1
UPDATE course SET name = 'course1' WHERE id in ('id1', 'id2', 'id3);    

 

更新多条记录为多个字段为不同的值

比较普通的写法,是通过循环,依次执行update语句。

Mybatis写法如下:

 

1
2
3
4
5
6
7
8
9
<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update course
        <set>
            name=${item.name}
        </set>
        where id = ${item.id}
    </foreach>      
</update>

 

一条记录update一次,性能比较差,容易造成阻塞。

MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

1
2
3
4
5
6
7
8
9
10
11
12
UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    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)

 

 

这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。

在Mybatis中的配置则如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<update id="updateBatch" parameterType="list">
            update course
            <trim prefix="set" suffixOverrides=",">
             <trim prefix="peopleId =case" suffix="end,">
                 <foreach collection="list" item="i" index="index">
                         <if test="i.peopleId!=null">
                          when id=#{i.id} then #{i.peopleId}
                         </if>
                 </foreach>
              </trim>
              <trim prefix=" roadgridid =case" suffix="end,">
                 <foreach collection="list" item="i" index="index">
                         <if test="i.roadgridid!=null">
                          when id=#{i.id} then #{i.roadgridid}
                         </if>
                 </foreach>
              </trim>
              
              <trim prefix="type =case" suffix="end," >
                 <foreach collection="list" item="i" index="index">
                         <if test="i.type!=null">
                          when id=#{i.id} then #{i.type}
                         </if>
                 </foreach>
              </trim>
       <trim prefix="unitsid =case" suffix="end," >
                  <foreach collection="list" item="i" index="index">
                          <if test="i.unitsid!=null">
                           when id=#{i.id} then #{i.unitsid}
                          </if>
                  </foreach>
           </trim>
             </trim>
            where
            <foreach collection="list" separator="or" item="i" index="index" >
              id=#{i.id}
          </foreach>
</update>

 

注:

 

MyBatis的foreach语句详解

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
下面分别来看看上述三种情况的示例代码:
1.单参数List的类型: 
    <select id="dynamicForeachTest" resultType="Blog"> 
        select * from t_blog where id in 
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> 
            #{item} 
        </foreach> 
    </select> 
上述collection的值为list,对应的Mapper是这样的 
public List<Blog> dynamicForeachTest(List<Integer> ids); 
测试代码: 
    @Test 
    public void dynamicForeachTest() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
        BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
        List<Integer> ids = new ArrayList<Integer>(); 
        ids.add(1); 
        ids.add(3); 
        ids.add(6); 
        List<Blog> blogs = blogMapper.dynamicForeachTest(ids); 
        for (Blog blog : blogs) 
            System.out.println(blog); 
        session.close(); 
    } 
2.单参数array数组的类型: 
    <select id="dynamicForeach2Test" resultType="Blog"> 
        select * from t_blog where id in 
        <foreach collection="array" index="index" item="item" open="(" separator="," close=")"> 
            #{item} 
        </foreach> 
    </select> 
上述collection为array,对应的Mapper代码: 
public List<Blog> dynamicForeach2Test(int[] ids); 
对应的测试代码: 
    @Test 
    public void dynamicForeach2Test() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
        BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
        int[] ids = new int[] {1,3,6,9}; 
        List<Blog> blogs = blogMapper.dynamicForeach2Test(ids); 
        for (Blog blog : blogs) 
            System.out.println(blog); 
        session.close(); 
    } 
3.自己把参数封装成Map的类型 
    <select id="dynamicForeach3Test" resultType="Blog"> 
        select * from t_blog where title like "%"#{title}"%" and id in 
        <foreach collection="ids" index="index" item="item" open="(" separator="," close=")"> 
            #{item} 
        </foreach> 
    </select> 
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码: 
public List<Blog> dynamicForeach3Test(Map<String, Object> params); 
对应测试代码: 
    @Test 
    public void dynamicForeach3Test() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
        BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
        final List<Integer> ids = new ArrayList<Integer>(); 
        ids.add(1); 
        ids.add(2); 
        ids.add(3); 
        ids.add(6); 
        ids.add(7); 
        ids.add(9); 
        Map<String, Object> params = new HashMap<String, Object>(); 
        params.put("ids", ids); 
        params.put("title", "中国"); 
        List<Blog> blogs = blogMapper.dynamicForeach3Test(params); 
        for (Blog blog : blogs) 
            System.out.println(blog); 
        session.close(); 
    } 

© 著作权归作者所有

共有 人打赏支持
村东邹师傅
粉丝 8
博文 15
码字总数 25501
作品 0
朝阳
程序员
Mybatis-Plus 1.2.11 发布,MyBatis 增强工具包

Mybatis-Plus 1.2.11 发布了,Mybatis-Plus是一款MyBatis的增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。Mybatis-Plus 启动注入非...

青苗 ⋅ 2016/04/18 ⋅ 7

Mybatis之批量更新操作

更新单条记录 UPDATE course SET name = 'course1' WHERE id = 'id1'; 更新多条记录的同一个字段为同一个值 UPDATE course SET name = 'course1' WHERE id in ('id1', 'id2', 'id3); 更新多条......

陈佳庆 ⋅ 2014/10/29 ⋅ 8

EasyMybatis 1.2.0 发布,支持枚举类型字段

EasyMybatis 1.2.0 已发布,此次更新的内容有: 启用驼峰下划线转换。javaBean中的字段是驼峰形式,映射到数据库字段会转换成下划线形式。 doc 支持枚举类型字段。javaBean中可以定义枚举类型...

tanghc ⋅ 2017/09/12 ⋅ 3

Mybatis 通用Crud

前言(说明) 源码地址:https://github.com/LittleNewbie/portal mybatis版本 3.2.6 mybatis crud 较为简陋,请移步至mybatis jpa :https://my.oschina.net/LittleNewbie/blog/895198 实现功能......

LittleNewbie ⋅ 2016/11/11 ⋅ 4

EasyMybatis 1.2.2 发布,重要性能优化

EasyMybatais 1.2.2 发布,此次更新内容如下: 优化启动速度:#IF8NF 新增mapperSaveDir配置:指定mapper文件存放路径。因为easymybatis是直接将mapper内容注入到内存当中,开发人员无感知,...

tanghc ⋅ 2017/09/22 ⋅ 3

巧用sql事半功倍

在mybatis里,曾经踩过几次坑,也用了一些mysql的技巧来应用数据库的功能减少编码的复杂性,尤其是批量操作,下面配合mybatis的应用总结一下4个小技巧(1 传0值 2 批量insert 3 批量update ...

灰袍甘道夫 ⋅ 2017/11/15 ⋅ 0

mysql批量插入以及批量更新

一、mysql批量插入 1.SQL语句: 2.注意事项: 3.案例(使用java和mybatis): java代码: mybatis的xml代码: 二、mysql批量更新 1.SQL语句: 2.注意事项: 3.案例(使用java和mybatis): ...

有钱有爱 ⋅ 2016/10/25 ⋅ 0

MyBatis学习 之 七、mybatis各种数据库的批量修改

                                MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了。本篇仅记录批量update操作的sql语句,懂得SQL语句...

无信不立 ⋅ 2016/03/21 ⋅ 0

mybatis 批量Update(1)

尽量少用或者不用此方法,因为此方法实际上是根据你的记录数,然后组装出N条更新语句, 当然如果你的数据量很少,那就勉强用一下吧 推荐使用的方法见另一篇博客 mybatis 批量Update(2) 这个批量更...

太黑_thj ⋅ 2016/07/18 ⋅ 0

Mybatis插入/删除批处理

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 在操作数据库时,经常会碰到批量插入、批量删除的情况,直接执行SQL语句还好做一点,当使用Mybatis进行批量插入、批量删除时会有一些问题...

Quincuntial ⋅ 2016/11/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 33分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 43分钟前 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部