Mybaits的批量操作包括批量删除 批量增加和批量更新

学前小课堂:

<!-- 引入sql片段 refid :被引入sql片段的id-->

          <include refid="condition_sql_by_trim"/>

<!-- 动态SQL语句trim标签

    perfix : 动态sql语句的前缀 (WHERE,SET)
              prefixOverrides : 自动截取掉或者替换条(WHERE 多余后面 关键字 :AND-OR)

   -->

<!-- 动态sql语句 foreach 循环标签
              <foreach collection="" open="" close="" item="" separator=""></foreach>
              collection : 要循环集合或者数组
              open :开始位置符号 前小括号 (
              close : 开始位置符号 后小括号 )
              item : 每次循环的数据
              separator : 分隔符 逗号 ,
          -->

<!--判断-->

<if test="name !=null"> name = #{name},</if>

一、批量删除

<!-- 批量删除 -->
      <delete id="deleteByIds" parameterType="list">
          <!-- delete from user where id in (1,3,5,56,8) -->
          delete from user where id in

          <!-- 动态sql语句 foreach 循环标签
              <foreach collection="" open="" close="" item="" separator=""></foreach>
              collection : 要循环集合或者数组
              open :开始位置符号 前小括号 (
              close : 开始位置符号 后小括号 )
              item : 每次循环的数据
              separator : 分隔符 逗号 ,
          -->
          <foreach collection="ids" open="(" close=")" item="id" separator=",">
              #{id}
          </foreach>
      </delete>

二、批量插入

      <!-- 批量插入 -->
      <insert id="batchInsert" parameterType="list">
          <!--
              insert into user (name,password,age) values
              (xxx,x,xx),(xxx1,x1,xx1),(xxx2,x2,xx2)
           -->
          insert into user (name,password,age) values

          <!--  动态sql语句 foreach 循环标签 -->
          <foreach collection="users" separator="," item="user">
              (#{user.name},#{user.password},#{user.age})
          </foreach>

      </insert>

三、批量更新

批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下。但是在更新字段增加,更新条数较多(500以上)建议使用第三种写法。

  • 常规写法,拼接多个单条更新语句。
  • CASE...WHEN... 写法
  • JOIN 写法

①Batch Update

spring/mybatis/JDBI都支持这种批量更新方式。
这种更新方式需要设置jdbc连接的参数:

allowMultiQueries=true
# 完整url举例
jdbc.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

具体实现以Spring的JdbcTemplate为例。
batchUpdate的主要代码如下图:

②CASE WHEN

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="status =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                     when id=#{item.id} then #{item.status}
                </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>

结构如下:

  update mydata_table
    set status =
    case
        when id = #{item.id} then #{item.status}//此处应该是<foreach>展开值
        ...
    end
    where id in (...);

UPDATE test SET code = ( CASE WHEN id = 1 THEN 11 WHEN id = 2 THEN 22 WHEN id = 3 THEN 33 END ) WHERE id IN (1,2,3);

注意:CASE WHEN一定要和WHERE语句一起使用,否则UPDATE会遍历和更新数据库中所有的行。会把未出现在WHEN中的数据都更新成null,如果code列设置为NOT NULL则会报错,否则会置为NULL或者默认值

三、JOIN

UPDATE `test` a JOIN
(
SELECT 1 AS id, 11 AS code, ‘holy‘ AS name
UNION
SELECT 2 AS id, 22 AS code, ‘shit‘ AS name
) b USING(id, code)
SET a.name=b.name;

上述SQL要表达的更新语义是:将id=1且code=11的name更新为‘holy‘,将id=2且code=22的name更新为‘shit‘。
注意,条件字段必须放在USING

原文地址:https://www.cnblogs.com/meizhoulqp/p/12370697.html

时间: 2024-08-29 11:16:39

Mybaits的批量操作包括批量删除 批量增加和批量更新的相关文章

网上图书商城项目学习笔记-015删除和批量删除购物车条目

一.流程分析 二.代码 1.view层 (1)list.jsp 1 <a href="<c:url value='/CartItemServlet?method=batchDelete&cartItemIds=${item.cartItemId }'/>">删除</a> 2 3 <a href="javascript:batchDelete();">批量删除</a> 4 /* 5 * 批量删除 6

IOS开发——UI进阶篇(四)全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除

首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这些在前面已经做过很多次了,代码就不一一写了 一.全局刷新 1.添加单组数据并全局刷新 - (IBAction)add { // 添加模型数据 XMGWine *wine = [[XMGWine alloc] init]; wine.money = @"20.5"; wine.name =

删除功能的实现(单个删除与批量删除)

2.1学生信息删除的实现 因为实体类已经编写好,所以不需要再编写实体类 a.在现有的student_list.html页面创建一个删除按钮,并在Javascript中编写删除方法 该删除是根据ID一个个删除,并非批量删除,因此点击删除按钮的时候会得到该行ID并传给该方法 b.编写子控制器getwaybeans.xml 新加一个关于删除的action c.编写对应的bean类方法 在现有的studentbean类中新建一个删除方法,该方法名为getwaybeans.xml文件中name属性 值得注

JAVAEE——BOS物流项目04:学习计划、datagrid、分页查询、批量删除、修改功能

1 学习计划 1.datagrid使用方法(重要) n 将静态HTML渲染为datagrid样式 n 发送ajax请求获取json数据创建datagrid n 使用easyUI提供的API创建datagrid(掌握) 2.实现取派员分页查询 n 调整页面基于datagrid发送ajax请求 n 创建PageBean封装分页参数 n 定义通用分页查询方法 n 将分页查询结果转为json返回 3.取派员批量删除 n 页面调整 n 服务端实现 4.取派员修改 n 页面调整 n 服务端实现 2 data

批量删除MSSQL 中主外键约束

转自: http://www.maomao365.com/?p=813 在制作 MSSQL同步工具的时候,发现由于主外键的约束,导致数据同步异常,所有我们需要把 读数据库里面的主外键约束,进行批量删除操作. 1 如何批量查询数据库的主外键? 在MSSQL2005以上版本中,系统提供一个系统视图 sys.foreign_keys 可以查询出系统所有的外键约束2 如何批量删除数据库的主外间键? -----------------------------------------------------

sql server中的大数据的批量操作(批量插入,批量删除)

首先我们建立一个测试用员工表 ---创建一个测试的员工表--- create table Employee( EmployeeNo int primary key, --员工编号 EmployeeName nvarchar(50) null, --员工名称 CreateUser nvarchar(50) null, --创建人 CreateDate datetime null, --创建时间 ) 执行后结果: 那么假如我们要批量插入10000条数据,应该怎么办? 这里有四种方法(普通循环,事务循

Spring boot集成Redis(1)—进行增加,更新,查询,批量删除等操作

前言:最近工作中使用到了redis缓存,故分享一点自己总结的东西,这篇文章使用的是StringRedisTemplate进行学习,这里值的说的是,(1)StringRedisTemplate在进行批量删除操作时我们需对template进行序列化,(2)更新操作与添加操作一样,接下来上代码:1.建立Spring boot项目,引入Redis依赖(pom.xml如下): <?xml version="1.0" encoding="UTF-8"?> <p

Mybatis实现批量删除

公司工程用的是Mybatis的example的类,自动生成了对数据库的操作,批量操作的今天用到了,两种方式,一种需要拓展它生成的类,另一种自带的. 1.拓展新的方法: 1)在生成的Mapper类中增加一个方法: [java] view plain copy int deleteBathById(String[] ids) 2)在Mapper的配置文件中增加sql语句 [html] view plain copy <delete id="deleteBathById" parame

利用yii2 gridview实现批量删除案例[转]

今天仍然继续探讨GridView的问题,昨天有个小伙伴留言说你用gridview给我去掉表头的链接?我想啊想,这用gridview确实不容易实现,至少我没想出来,会的下方可留言.但是呢,这根gridview有个毛线关联啊,明明是要设置ActiveDataProvider,你要我怎么用gridview实现嘛. 这个问题也是很简单的,我们来看看具体实现 $dataProvider = new ActiveDataProvider([ "query" => $query, ]); $d