mybatis 動(dòng)態(tài)SQL巧用突破in數(shù)量限制的方案
痛點(diǎn)
oracle 11g 只能in
1000個(gè)條件,大數(shù)據(jù)量無(wú)法處理
功能說明
用于解決數(shù)據(jù)庫(kù) IN
子句參數(shù)數(shù)量限制問題(如 Oracle 的 1000 元素限制),通過動(dòng)態(tài)分塊生成多組 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>
語(yǔ)法逐層解析
- 外層條件判斷
<if test="piids != null and piids.size > 0">
- trim 標(biāo)簽清理
<trim suffixOverrides=" OR t0.processinstid IN()">
解決的問題:消除最后一塊可能殘留的無(wú)效語(yǔ)句
機(jī)制:自動(dòng)刪除結(jié)尾匹配的指定字符串 - foreach 分塊邏輯
<foreach collection="piids" item="item" index="index" open="(" close=")">
分塊規(guī)則
<choose> <when test="index % 1000 == 999">) OR t0.processinstid IN (</when> <otherwise>,</otherwise> </choose>
分塊策略:
每 1000 個(gè)元素 分塊(索引從0開始計(jì)算)
index % 1000 == 999 ? 第1000個(gè)元素時(shí)觸發(fā)分塊
連接方式:
同塊元素用 , 連接
分塊時(shí)用 ) OR t0.processinstid IN ( 連接
數(shù)據(jù)庫(kù)適配對(duì)照表
數(shù)據(jù)庫(kù) | IN 列表限制 | 調(diào)整方案 |
---|---|---|
Oracle | 1000 | 保持現(xiàn)有代碼:index % 1000 == 999 (索引從0開始,第1000個(gè)元素時(shí)分塊) |
SQL Server | 2100 | 修改為:index % 2100 == 2099 (索引達(dá)到2099時(shí)觸發(fā)分塊) |
MySQL | 無(wú)硬性限制 | 移除分塊邏輯,直接逗號(hào)連接所有元素 |
PostgreSQL | 無(wú)硬性限制 | 移除分塊邏輯,直接逗號(hào)連接所有元素 |
補(bǔ)充說明:
Oracle/SQL Server 分塊邏輯
- 因數(shù)據(jù)庫(kù)對(duì)
IN
子句的表達(dá)式數(shù)量有嚴(yán)格限制,需通過模運(yùn)算 (%
) 控制分塊節(jié)點(diǎn)。 - 公式:
index % N == (N-1)
,其中N
為數(shù)據(jù)庫(kù)允許的最大值(Oracle=1000,SQL Server=2100)。
- 因數(shù)據(jù)庫(kù)對(duì)
MySQL/PostgreSQL 優(yōu)化
- 可直接簡(jiǎn)化為:
<foreach collection="piids" item="item" open="(" close=")" separator=","> #{item} </foreach>
- 可直接簡(jiǎn)化為:
到此這篇關(guān)于mybatis 動(dòng)態(tài)SQL巧用突破in數(shù)量限制的文章就介紹到這了,更多相關(guān)mybatis in數(shù)量限制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis配置之<typeAliases>別名配置元素解析
這篇文章主要介紹了Mybatis配置之<typeAliases>別名配置元素解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java Scanner對(duì)象中hasNext()與next()方法的使用
這篇文章主要介紹了Java Scanner對(duì)象中hasNext()與next()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot?thymeleaf實(shí)現(xiàn)餅狀圖與柱形圖流程介紹
這篇文章主要介紹了SpringBoot?thymeleaf實(shí)現(xiàn)餅狀圖與柱形圖流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12java 發(fā)送帶Basic Auth認(rèn)證的http post請(qǐng)求實(shí)例代碼
下面小編就為大家?guī)硪黄猨ava 發(fā)送帶Basic Auth認(rèn)證的http post請(qǐng)求實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11Java如何獲取發(fā)送請(qǐng)求的電腦的IP地址
文章介紹了如何通過HttpServletRequest獲取客戶端IP地址,特別是當(dāng)客戶端通過代理訪問時(shí),如何使用x-forwarded-for頭來獲取真實(shí)的IP地址2024-11-11Netty進(jìn)階之ChannelPoolMap源碼解析
這篇文章主要介紹了Netty進(jìn)階之ChannelPoolMap源碼解析,ChannelPoolMap是用來存儲(chǔ)ChannelPool和指定key的一個(gè)集合Map,實(shí)際的應(yīng)用場(chǎng)景就是服務(wù)器端是一個(gè)分布式集群服務(wù),擁有多個(gè)配置地址,這樣我們就可以配置多個(gè)服務(wù)地址,減輕單臺(tái)服務(wù)器的壓力,需要的朋友可以參考下2023-11-11Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用詳
這篇文章主要介紹了Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11mybatis3中@SelectProvider傳遞參數(shù)方式
這篇文章主要介紹了mybatis3中@SelectProvider傳遞參數(shù)方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Maven項(xiàng)目外部jar包導(dǎo)入的實(shí)現(xiàn)示例
在Maven項(xiàng)目里,我們經(jīng)常需要導(dǎo)入jar包依賴,本文主要介紹了Maven項(xiàng)目外部jar包導(dǎo)入的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08