• 实战:MyBatis批量操作-xml方式


    欢迎大家关注我的个人博客—精灵王,获取更好的阅读体验以及最新的文章分享~

    场景

    在实际项目中,我们一般都会用到批量insert、delete、update等操作,由于使用频率还是蛮高的,这里就做个简单的记录,供以后学习和参考。

    批量插入

    在批量插入数据库时,我们有两种办法可以完成该操作:

    1. 循环执行多条 insert SQL语句,伪代码示例:

      for(;;){
         // insert into tableName values(?,?,?...);
      }
    2. 一条SQL语句完成批量插入,伪代码示例:

      insert into tableName values (?,?,?...),(?,?,?...),(?,?,?...)....

    第一种方式很简单,在 Service 代码直接循环调用 Dao 层单条插入接口就行。

    第二种方式不需要在Service循环,只需要在调用Dao层的时候传入一个List,之后交由 Mybatis 来完成转换成第二种SQL语句

    批量insert语句

    我们在使用mybatis时框架时,可以使用foreach标签来完成转换成批量插入的SQL语句功能

    代码示例:

    <insert id ="INSERT-CODE-BATCH" parameterType="java.util.List" >
          insert into 
               table_name
               (bach_id, code, type, facevalue,create_user,create_time)
          values
          <foreach collection ="list" item="reddemCode" index= "index" separator =",">
             (
               #{reddemCode.batchId}, 
               #{reddemCode.code},
               #{reddemCode.type},
               #{reddemCode.facevalue},
               #{reddemCode.createUser}, 
               #{reddemCode.createTime}
             )
          </foreach >
    </insert >

    foreach标签使用说明

    1. foreach元素的属性主要有 item,index,collection,open,separator,close。
    2. item表示集合中每一个元素进行迭代时的别名
    3. index指定一个名字,用于表示在迭代过程中,每次迭代到的位置
    4. open表示该语句以什么开始
    5. separator表示在每次进行迭代之间以什么符号作为分隔符
    6. close表示以什么结束
    7. collection属性为必填属性! 可以是List,Array,Map.

    批量update语句

    说得直白点,mybatis的批量操作重点就是学会怎么去将sql拼接成可以直接在数据库执行的语句,这里再记录下批量update操作,其实只要会了上面一个,其他也都不是问题了。

    批量update示例:

    DAO接口入参我这里传递过来参数是一个Map<string,object>,代码如下:

    Map<String, Object> conditions = new HashMap<String, Object>();
    conditions.put("rebateConfigValue", rebateValue); //rebateValue是一个固定的值
    conditions.put("list", productCodeList);

    xml 文件:

    <update id="WHOLESALE-UPDATE-REBATE-CONFIG-BY-PRODUCTCODE" >
            UPDATE 
               rebate_config
            SET
               rebate_type = 'BY_RATE',rebate_config_value = #rebateConfigValue#
            WHERE
            <iterate  property="list" conjunction="or" open="(" close=")">
               product_code =#list[]#
            </iterate>
    </update>

    iterate 标签说明:

    1. prepend 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
    2. property 类型为 java.util.List 的用于遍历的元素(必选)
    3. open 整个遍历内容体开始的字符串,用于定义括号(可选)
    4. close 整个遍历内容体结束的字符串,用于定义括号(可选)
    5. conjunction 每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)

    总结

    foreach 其实就是一个循环遍历,第二种方式就是把第一种的for循环搬运到了xml文件里面,上面demo里面的SQL语句,最后实际执行的就是类似如下的SQL语句:

    insert into redeem_code (batch_id, code, type, facevalue,create_user,create_time) values (?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? )
    

      

    个人博客:精灵王

    点击查看ibatis官方文档

    点击查看Mybatis3 官方文档

    一个点赞,一个评论,既是肯定,又是鼓励!期待和你一起交流学习、共同进步!
    微信搜索公众号“jinglingwangcoding”或扫描下方二维码,一起交流
  • 相关阅读:
    mysql 自定义排序
    arcgis 好人
    eclipse启动tomcat,提示三个端口均被占用
    oracle 查看表空间创建日期
    navacat 链接oracle oci invalid handle
    java +mysql 递归排序/* START WITH aa.parentid IN ( 10000, 20000, 30000, 40000, 50000, 60000, 70000 ) connect BY prior aa.id = aa.parentid ORDER siblings BY aa.id ASC*/ to
    Double 转 BigDecimal
    mysql 死锁 Waiting for stored function metadata lock
    Graphtree--zabbix增强功能(一屏展示所有内容)
    zabbix 分布式监控(proxy)源码安装
  • 原文地址:https://www.cnblogs.com/admol/p/5082121.html
Copyright © 2020-2023  润新知