zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MongoDB 常用命令
    jpa一对多
    jpa的常用注解
    jpa常用方法
    springdata查询的多种用法
    springdata笔记
    java 动态代理 demo 实现原理 参数理解(三)
    Solr
    一些重要的知识点-数据库优化-angularjs--JSON-fastDFS
    支付功能
  • 原文地址:https://www.cnblogs.com/meizhoulqp/p/12370697.html
Copyright © 2011-2022 走看看