Mybatis---批量处理

在项目当中我们总会遇到这种情况,一次查询满足不了页面所需展示的字段。这时候需要根据查出来的list循环去查询另外的字段,有人会在循环中执行数据库操作,这样会建立多次数据库连接,不但耗费性能而且会导致连接数满。尤其是查询大数据量的时候,性能测试的时差体现的很明显。我们应当避免这样的操作,去用批量处理。

说明:item集合或数组里的元素(对象)

        collection集合类型(数组或集合)

     open以什么开始

     close以什么结束

     separator中间以什么相连

1.批查询 select、

单参数 可以用 IN 也可以用多参数模式

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 查询日志的操作   -->
 <select id="selectJournalTime" resultType="cn.loan.vo.biz.JournalTimeVo" parameterType="java.util.List" >
        select
         DATE_FORMAT(acc.update_time,'%Y-%m-%d %H:%i:%S') as updateTime,
         DATE_FORMAT(acc.redemptionTime,'%Y-%m-%d %H:%i:%S') as redemptionTime,
         acc.auditSurfaceId as auditSurfaceId
         from auditJournalMinute acc
         where
         acc.auditSurfaceId in
  <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
         #{item}
     </foreach>   
 </select>

多参数 用UNION ALL 注意括号不要漏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 查询日志的操作   -->
 <select id="selectJournalTime" resultType="cn.loan.vo.biz.JournalTimeVo" parameterType="java.util.List" >
     <foreach collection="list" item="item" index="index" separator="UNION ALL" >
         (select
         DATE_FORMAT(acc.update_time,'%Y-%m-%d %H:%i:%S') as updateTime,
         DATE_FORMAT(acc.redemptionTime,'%Y-%m-%d %H:%i:%S') as redemptionTime,
         acc.auditSurfaceId as auditSurfaceId
         from auditJournalMinute acc
         where
         acc.auditSurfaceId=#{item.id}
         and acc.`status`=#{item.status}
         order by acc.update_time asc
         limit 1)
     </foreach>
 </select>

2.批量插入 insert 

1
2
3
4
5
6
7
8
9
10
11
<insert id="insertAuditHistory" parameterType="java.util.List">
    insert into audit_history
    (backgroundUserId,
    show_time,
    commit_num,
    lend_num)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.backgrounduserid},#{item.showTime},#{item.commitNum},#{item.lendNum})
    </foreach>
</insert>

3.批量删除 delete

1
2
3
4
5
6
7
8
9
<delete id="deleteArtworkMaster" parameterType="java.util.List">
   delete from
     artworkMasterPhotoAlbum
  where
    artworkMasterPhotoAlbumId IN 
        <foreach collection="list" item="item" index="index" open="("  close=")" separator=","
     #{item} 
    </foreach> 
</delete>

4.批量更新

1
2
3
4
5
6
7
8
9
10
11
12
13
<update id="updateBatch" parameterType="java.util.List">
        update role
        set  update_time=
        <foreach collection="list" item="item" index="index"
                 separator=" " open="case roleId" close="end">
            when #{item.id} then #{item.date}
        </foreach>
        where roleId in
        <foreach collection="list" index="index" item="item"
                 separator="," open="(" close=")">
            #{item.id}
        </foreach>
    </update>

多字段多条件更新 需要给mysql配置批量执行,在spring.datasource.url后加上allowMultiQueries=true
例如:spring.datasource.url=jdbc:mysql://127.0.0.1:3306/secondleaseback?allowMultiQueries=true

1
2
3
4
5
6
7
8
9
10
<update id="updateBatch" parameterType="java.util.List">
     <foreach collection="list" item="item" index="index" separator=";" open="" close="">
            update role
            <set>
                update_time=#{item.date},
                create_time=#{item.date}
            </set>
            where roleId=#{item.id}
         </foreach>
 </update>

注: insert 的时候 如果需要返回主键,在 <insert>标签中增加 useGeneratedKeys=“true” keyProperty=“实体主键id字段"

posted @   江南大才子  阅读(127)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示