溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mybatis?mapper.xml注釋帶參數(shù)的坑怎么解決

發(fā)布時(shí)間:2022-01-11 15:19:15 來(lái)源:億速云 閱讀:154 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“mybatis mapper.xml注釋帶參數(shù)的坑怎么解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“mybatis mapper.xml注釋帶參數(shù)的坑怎么解決”文章吧。

mybatis mapper.xml 注釋帶參數(shù)的坑

最近做一個(gè)很簡(jiǎn)單的統(tǒng)計(jì)項(xiàng)目,統(tǒng)計(jì)的邏輯產(chǎn)品一直改版,為了便于之后產(chǎn)品返回的時(shí)候快速的切換回老版本的邏輯,就給之前的sql注釋了直接在下面寫(xiě)了新的sql,注釋的時(shí)候一般我都習(xí)慣性的選中之后Ctrl+/利用編輯器自帶的自動(dòng)注釋功能,這個(gè)時(shí)候編輯器是分兩種情況的:情況一是你之前老的sql沒(méi)有類(lèi)似<where>這樣帶特殊尖括號(hào)的語(yǔ)句,這個(gè)時(shí)候如果用Ctrl+/的話編輯器會(huì)用'--'也就是sql語(yǔ)句的注釋去注釋你之前的老sql,注釋完之后編輯器并不會(huì)報(bào)錯(cuò)如果比較幸運(yùn)你之前的語(yǔ)句里沒(méi)有參數(shù)的話執(zhí)行也是沒(méi)有問(wèn)題的,但是,注意這個(gè)但是,如果你之前的sql語(yǔ)句帶#{xxxx}或者${xxx}這樣的參數(shù),

形如下面這樣:

-- #{month,jdbcType=VARCHAR}

那么恭喜你,這個(gè)時(shí)候執(zhí)行的話就會(huì)報(bào)很詭異的異常,類(lèi)似于下面這樣:

org.springframework.dao.TransientDataAccessResourceException: 
### Error querying database.  Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

這個(gè)時(shí)候你可能會(huì)和我一樣丈二和尚摸不著頭腦,特別是如果之前么有遇見(jiàn)過(guò)這個(gè)問(wèn)題的話,很有可能會(huì)在這里搞很久;情況二是你的老sql有<where>這樣的帶尖括號(hào)的語(yǔ)句,這個(gè)時(shí)候你用Ctrl+/的話,會(huì)自動(dòng)是<!-- xxx-->也就是標(biāo)準(zhǔn)的xml注釋?zhuān)@個(gè)時(shí)候即使你注釋的xxx包括外部參數(shù)占位,執(zhí)行的時(shí)候也不會(huì)報(bào)錯(cuò),形如下面這樣也不會(huì)有問(wèn)題:

<!--  #{month,jdbcType=VARCHAR}-->

這個(gè)問(wèn)題由于之前自己沒(méi)有遇見(jiàn)過(guò)所以這次在這里卡了挺久才試出問(wèn)題原因,至于兩種方式為何會(huì)有所區(qū)別回頭還得好好看看mybatis的源碼,之后再補(bǔ)充到這篇文章里,占用上班時(shí)間做個(gè)記錄

mybatis的xml中注釋需謹(jǐn)慎

報(bào)錯(cuò)內(nèi)容

java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2)

調(diào)試半天,網(wǎng)上查了半天都是# 、$ 用法出錯(cuò),一次次的對(duì)比,一個(gè)個(gè)字找,發(fā)現(xiàn),用法根本沒(méi)問(wèn)題,突然。。??吹搅俗⑨屩械?/p>

#{executorId},想想,也許是這個(gè)的原因呢?然后就給注釋刪了,結(jié)果發(fā)現(xiàn)就是注釋的鍋:

這樣,mybatis仍舊會(huì)把#{}算成一個(gè)帶注入的參數(shù),二SQL認(rèn)出了這個(gè)-- 的注釋

-- AND (dept.id = #{executorId} OR dept.parentId = #{executorId} OR parentId in ( SELECT id from user_department
-- WHERE user_department.id = #{executorId} OR user_department.parentId = #{executorId} ))

mybatis?mapper.xml注釋帶參數(shù)的坑怎么解決

以上就是關(guān)于“mybatis mapper.xml注釋帶參數(shù)的坑怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI