mybatis 动态SQL巧用突破in数量限制的方案

 更新时间:2025年07月29日 10:45:52   作者:Lanse丶12  
本文主要介绍了MyBatis动态SQL通过分块处理突破IN子句参数数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

痛点

oracle 11g 只能in1000个条件,大数据量无法处理

功能说明

用于解决数据库 IN 子句参数数量限制问题(如 Oracle 的 1000 元素限制),通过动态分块生成多组 IN 条件。

完整代码示例

<if test="piids != null and piids.size > 0">
    AND (t0.processinstid IN
    <trim suffixOverrides=" OR t0.processinstid IN()">
        <foreach collection="piids" item="item" index="index" open="(" close=")">
            <if test="index != 0">
                <choose>
                    <when test="index % 1000 == 999">) OR t0.processinstid IN (</when>
                    <otherwise>,</otherwise>
                </choose>
            </if>
            #{item}
        </foreach>
    </trim>
    )
</if>

语法逐层解析

  1. 外层条件判断
    <if test="piids != null and piids.size > 0">
  2. trim 标签清理
    <trim suffixOverrides=" OR t0.processinstid IN()">
    解决的问题:消除最后一块可能残留的无效语句
    机制:自动删除结尾匹配的指定字符串
  3. foreach 分块逻辑
    <foreach collection="piids" item="item" index="index" open="(" close=")">

分块规则

<choose>
    <when test="index % 1000 == 999">) OR t0.processinstid IN (</when>
    <otherwise>,</otherwise>
</choose>

分块策略:
每 1000 个元素 分块(索引从0开始计算)
index % 1000 == 999 ➔ 第1000个元素时触发分块
连接方式:
同块元素用 , 连接
分块时用 ) OR t0.processinstid IN ( 连接

数据库适配对照表

数据库IN 列表限制调整方案
Oracle1000保持现有代码:index % 1000 == 999
(索引从0开始,第1000个元素时分块)
SQL Server2100修改为:index % 2100 == 2099
(索引达到2099时触发分块)
MySQL无硬性限制移除分块逻辑,直接逗号连接所有元素
PostgreSQL无硬性限制移除分块逻辑,直接逗号连接所有元素

补充说明:

  1. Oracle/SQL Server 分块逻辑

    • 因数据库对 IN 子句的表达式数量有严格限制,需通过模运算 (%) 控制分块节点。
    • 公式:index % N == (N-1),其中 N 为数据库允许的最大值(Oracle=1000,SQL Server=2100)。
  2. MySQL/PostgreSQL 优化

    • 可直接简化为:
      <foreach collection="piids" item="item" open="(" close=")" separator=",">
          #{item}
      </foreach>
      

到此这篇关于mybatis 动态SQL巧用突破in数量限制的文章就介绍到这了,更多相关mybatis in数量限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • 在SpringBoot中使用@Value注解来设置默认值的方法

    在SpringBoot中使用@Value注解来设置默认值的方法

    Spring Boot提供了一种使用注解设置默认值的方式,即使用 @Value 注解,下面这篇文章主要给大家介绍了关于如何在SpringBoot中使用@Value注解来设置默认值的相关资料,需要的朋友可以参考下
    2023-10-10
  • springboot 拦截器执行两次的解决方案

    springboot 拦截器执行两次的解决方案

    这篇文章主要介绍了springboot 拦截器执行两次的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java控制语句之if、switch语句

    Java控制语句之if、switch语句

    这篇文章主要介绍了Java控制语句之if、switch语句的相关资料,需要的朋友可以参考下
    2016-01-01
  • SpringBoot解决@Component无法注入其他Bean的问题

    SpringBoot解决@Component无法注入其他Bean的问题

    这篇文章主要介绍了SpringBoot解决@Component无法注入其他Bean的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java基于NIO实现群聊系统

    Java基于NIO实现群聊系统

    这篇文章主要为大家详细介绍了Java基于NIO实现群聊系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringBoot中Jar包冲突在线检测的方法详解

    SpringBoot中Jar包冲突在线检测的方法详解

    在 Spring Boot 项目开发和运维中,Jar 包冲突是让开发者最头疼的问题之一,本文主要为大家详细介绍了如何使用SpringBoot在线检测Jar包冲突,需要的小伙伴可以了解下
    2025-09-09
  • java线程池使用及原理面试题

    java线程池使用及原理面试题

    很多面试官喜欢把线程池作为问题的起点,然后延伸到其它内容,由于我们专栏已经说过队列、线程、锁面试题了,所以本章面试题还是以线程池为主
    2022-03-03
  • 由ArrayList来深入理解Java中的fail-fast机制

    由ArrayList来深入理解Java中的fail-fast机制

    fail-fast俗称快速失败,是在多线程进行迭代操作时产生冲突的一种异常抛出机制,下面我们就由ArrayList来深入理解Java中的fail-fast机制.
    2016-05-05
  • 详解Spring多数据源如何切换

    详解Spring多数据源如何切换

    这篇文章主要介绍了spring多数据源的如何切换,由于是spring项目,可以借助 spring 的DataSource 对象去管理,大体思路是创建一个类实现该接口,替换spring原有的DataSource 对象,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-06-06
  • javascript checkbox全选和反选的简单实现

    javascript checkbox全选和反选的简单实现

    这篇文章主要介绍了javascript checkbox全选和反选的简单实现的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论