文档章节

mybatis 实现批量更新

村东邹师傅
 村东邹师傅
发布于 2015/04/23 11:12
字数 1138
阅读 6237
收藏 6

更新单条记录

 

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
2.1K
7
EasyMybatis 1.2.0 发布,支持枚举类型字段

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

tanghc
2017/09/12
740
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
929
4
EasyMybatis 1.2.2 发布,重要性能优化

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

tanghc
2017/09/22
1K
3
SPring整合Mybatis配置--Mysql批量更新坑

mybatis 批量更新sql写完运行报错,但是一看sql是正确的; 那么就得考虑下是不是配置上不支持批量更新操作了,mybatis 调用mysql完成批量更新是需要我们去手动设置,打开这个开关的。 true是...

胖猫警长
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
3
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部