首页 > 数据库 >数据库批量更新

数据库批量更新

时间:2024-04-18 14:25:13浏览次数:28  
标签:批量 数据库 List ids 更新 blog add session id

原文地址:https://www.cnblogs.com/exmyth/p/5757137.html

 

mybatis 实现批量更新

 

更新单条记录

 

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();  
    } 

标签:批量,数据库,List,ids,更新,blog,add,session,id
From: https://www.cnblogs.com/xianz666/p/18143402

相关文章

  • blender python api 使用脚本批量对obj物体进行渲染(obj所在目录要有与之对应的mtl文件
     代码:importbpy#导入Blender的PythonAPI接口importpathlib#导入pathlib模块,用于操作文件路径#设置OBJ文件所在的目录路径obj_root=pathlib.Path('D:\\ceshi')#注意Windows路径中的斜杠需要转义#取消选择场景中的所有物体,以便导入时不会与已选择的物体冲......
  • 利用python脚本对邮箱密码进行批量爆破
    利用python脚本对邮箱密码进行批量爆破importpoplib#导入POP3库fromemailimportparser#导入邮件解析器fromgetpassimportgetpass#导入密码输入函数pop_server='mail.test.com'#设置POP3服务器地址,改成需要爆破的目标邮箱pop3服务器地址pop_port=995......
  • 对大量ip进行批量ping检测的python脚本
    对大量ip进行批量ping检测的python脚本importsubprocessdefping_host(host,is_windows):"""发送一个ping请求到指定的主机,并返回ping的结果。"""#根据操作系统类型选择ping命令和参数ifis_windows:params=['ping','-n',&......
  • C#对象引用更新问题
    在C#中,当你将一个对象赋值给另一个变量时,实际上是将对象的引用(内存地址)赋给了这个变量,而不是将对象本身复制一份。这意味着如果你修改了一个引用类型对象(如列表、类实例等),那么所有引用该对象的地方都会受到影响,因为它们都指向同一个内存地址。为了避免这样的问题,你可以通过以下......
  • 微信小程序 版本更新 强制更新新版本
    在点击小程序发布的时候选择,版本升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal在utils.js中声明版本更新方法 //static/utils/index.jsexportfunctioncheckUpdateVersion(){//创建UpdateManager实例constupdateManager=uni.getUp......
  • 构建RAG应用-day01: 词向量和向量数据库 文档预处理
    词向量和向量数据库词向量(Embeddings)是一种将非结构化数据,如单词、句子或者整个文档,转化为实数向量的技术。词向量搜索和关键词搜索的比较优势1:词向量可以语义搜索比如百度搜索,使用的是关键词搜索。而词向量搜索,是对句子的语义进行搜索,他会找到意思相近的前k个句子。优势2:词......
  • iPhone 16系列要这么更新 那我可就冲了
    近期,iPhone16系列屡上热搜,虽然距离苹果秋季新品发布会还有比较长的一段时间,但各种爆料信息却层出不穷。果粉的热情也依旧不减,积极参与讨论,真不愧是果子,关注度还是那么高。那么,关于iPhone16全系到底有哪些更新?我们一起来围观一下。iPhone16、iPhone16Plus外观:竖排双摄、Ac......
  • Python量化交易系统实战_学习笔记(更新中)
    作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢!此系列的文章主要是基于慕课网的课程做的学习笔记,算是量化交易的入门级课程。这个系列的课程,好处是通俗易懂,适合刚上手的小白。但感觉数据部分限制见多,后面再更新下对于数据源的文章吧。 课......
  • Centos系统彻底卸载MySQL数据库
    一、检查系统是否安装了MySQL数据库命令:rpm-qa|grep-imysql  二、关闭MySQL服务命令:servicemysqlstop三、卸载并删除MySQL(不检查依赖关系)卸载common命令:rpm-ev--nodepsmysql-community-common-8.0.29-1.el7.x86_64  卸载libs命令:rpm-ev--nodepsmysql-......
  • Go 单元测试之Mysql数据库集成测试
    目录一、sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm初始化注意点一、sqlmock介绍sqlmock是一个用于测试数据库交互的Go模拟库。它可以模拟SQL查询、插入、更新等操作,并且可以验证SQL语句的执行情况,非常适合用于单元测试中。二、安装gogetgithub.com/......