欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis解決<foreach>標(biāo)簽不能超過1000的問題

 更新時間:2024年05月01日 08:10:21   作者:小海海不怕困難  
MyBatis是一個開源的持久層框架,它可以幫助開發(fā)者簡化數(shù)據(jù)庫操作的編寫,而foreach是MyBatis中的一個重要標(biāo)簽,用于在SQL語句中進(jìn)行循環(huán)操作,本文主要給大家介紹了mybatis解決<foreach>標(biāo)簽不能超過1000的問題,需要的朋友可以參考下

錯誤寫法:

    <select id="getProductInfoList" resultType="vo">
        select a.name 
        from A a
        where a.idin
        <foreach collection="ids" item="item" index="index" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>

錯誤原因:

當(dāng)<foreach>標(biāo)簽內(nèi)的數(shù)量超過1000個時會提示一下報錯:

java.sql.SQLSyntaxErrorException: ORA-01795: maximum number of expressions in a list is 1000

正確寫法:

方案1(將傳參變成SQL語句嵌套在SQL里面):

    <select id="getProductInfoList" resultType="vo">
        select a.name 
        from A a
        where a.id in
         (select b.id from B b where b.id = #{billNo}  and DELETED = 0)
    </select>

方案2(利用or每1000條添加一個or)

	SELECT
		*
	FROM
		${tabNameMx} M
		WHERE
		M.CODE_ID IN
		<foreach collection="idList" index="index" open="(" close=")" item="id" separator=",">
			<if test="(index % 999) == 998"> NULL) OR M.CODE_ID IN(</if>#{id}
		</foreach>

這個SQL大家看著可能覺得有點(diǎn)懵逼,現(xiàn)在給你寫段這段sql最終會變成什么樣子,這樣你瞬間就懂了。

SQL最終執(zhí)行的樣子:

CODE_ID IN('......','998',NULL ) OR M.CODE_ID IN('999',.....  NULL) OR M.CODE_ID IN('.....')

方案3(拼接OR ID IN ()):

<select id="queryEnoByCapita">
  select t.custid,to_char(t.eno) as eno from T_E_ACCOUNT t where t.status !='2' and   t.custid in
 <trim suffixOverrides=" OR t.custid in()">
 <foreach collection="capita" item="custId" index="index" open="(" close=")">   
            <if test="index != 0">
                <choose>
                    <when test="index % 1000 == 999">) OR t.custid in (</when>
                    <otherwise>,</otherwise>
                </choose>
            </if>
     #{custId,jdbcType=VARCHAR} 
 </foreach>
 </trim>
</select>

分析:

<trim>標(biāo)簽suffixOverrides:去掉后綴匹配上的東西,本例中后綴如果是 OR t.custid in()與suffixOverrides的屬性值剛好匹配,則去掉 OR t.custid in()
 
index 集合迭代的位置從0開始,為何需要<if test="index != 0">?如果沒有,則sql是 t.cust in (,1,2..)會多一個逗號
 
沒有999條數(shù)據(jù)的拼接SQL為:t.cust in (1,2..998) 
超過999條的數(shù)據(jù)拼接SQL為:t.cust in (1,2..998) or t.custid in(999,1000...1998) ...

拓展:

擴(kuò)展1:foreach元素的屬性主要有 item、index、 collection、open、separator、close

collection  foreach循環(huán)的對象
item 集合中每一個元素或者該集合的對象,支持對象點(diǎn)屬性的方式獲取屬性#{obj.filed} 或#{value}
index 循環(huán)的下標(biāo),從0開始 
open 表示以什么開始 
separator 每次進(jìn)行迭代之間以什么符號作為分隔符 
close表示以什么結(jié)束

擴(kuò)展2:MyBatis trim 標(biāo)簽四個屬性和其作用

prefix  添加前綴
prefixOverrides  刪除前綴
suffix  添加后綴
suffixOverrides  刪除后綴

到此這篇關(guān)于mybatis解決<foreach>標(biāo)簽不能超過1000的問題的文章就介紹到這了,更多相關(guān)mybatis foreach不能超過1000內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA編程不能不知道的反射用法總結(jié)

    JAVA編程不能不知道的反射用法總結(jié)

    這篇文章主要介紹了Java反射技術(shù)原理與用法,結(jié)合實(shí)例形式分析了Java反射技術(shù)的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • SpringBoot中的異步任務(wù)解析

    SpringBoot中的異步任務(wù)解析

    這篇文章主要介紹了SpringBoot中的異步任務(wù)解析,SpringBoot 異步任務(wù)是一種在SpringBoot框架中使用的異步處理機(jī)制,可以提高系統(tǒng)的并發(fā)能力和響應(yīng)速度,需要的朋友可以參考下
    2023-10-10
  • Java對象數(shù)組的添加、刪除和遍歷代碼示例

    Java對象數(shù)組的添加、刪除和遍歷代碼示例

    在Java編程中,我們經(jīng)常需要對數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Java讀寫文件方法總結(jié)(推薦)

    Java讀寫文件方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫ava讀寫文件方法總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • Java緩存Map設(shè)置過期時間實(shí)現(xiàn)解析

    Java緩存Map設(shè)置過期時間實(shí)現(xiàn)解析

    這篇文章主要介紹了Java緩存Map設(shè)置過期時間實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Mybatis的sql語句執(zhí)行異常后打印到日志問題

    Mybatis的sql語句執(zhí)行異常后打印到日志問題

    文章介紹了一種Mybatis異常日志打印方案,主要通過Mybatis攔截器獲取執(zhí)行的sql語句,并利用ThreadLocal存儲,以避免多線程下的sql語句覆蓋問題,當(dāng)異常發(fā)生時,從ThreadLocal中取出sql語句并打印到單獨(dú)的日志文件中,方便數(shù)據(jù)恢復(fù),該方案經(jīng)過壓力測試
    2024-10-10
  • 使用Java后端操作Docker的詳細(xì)教程

    使用Java后端操作Docker的詳細(xì)教程

    Docker 是現(xiàn)代開發(fā)和部署流程中不可或缺的一部分,它簡化了應(yīng)用程序的環(huán)境配置、打包和分發(fā),使得在不同機(jī)器上運(yùn)行相同的應(yīng)用變得更加輕松和一致,本文將詳細(xì)介紹如何使用命令行工具(CMD)操控 Docker 來配置環(huán)境,需要的朋友可以參考下
    2025-02-02
  • Java的Servlet及其生命周期詳解

    Java的Servlet及其生命周期詳解

    這篇文章主要介紹了Java的Servlet及其生命周期詳解,Servlet是用Java編寫的服務(wù)器端程序,一門用于開發(fā)動態(tài)web資源的技術(shù),其主要功能在與交互式的瀏覽和修改數(shù)據(jù),生成動態(tài)web內(nèi)容,需要的朋友可以參考下
    2023-11-11
  • Mybatis 多對一查詢的實(shí)現(xiàn)方法

    Mybatis 多對一查詢的實(shí)現(xiàn)方法

    這篇文章主要介紹了Mybatis 多對一查詢,本文通過場景分析示例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java基礎(chǔ)之堆內(nèi)存溢出的解決

    Java基礎(chǔ)之堆內(nèi)存溢出的解決

    這篇文章主要介紹了Java基礎(chǔ)之堆內(nèi)存溢出的解決,文中有非常詳細(xì)的圖文示例及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評論