您好,登錄后才能下訂單哦!
這篇“mybatis mapper.xml注釋帶參數的坑怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“mybatis mapper.xml注釋帶參數的坑怎么解決”文章吧。
最近做一個很簡單的統計項目,統計的邏輯產品一直改版,為了便于之后產品返回的時候快速的切換回老版本的邏輯,就給之前的sql注釋了直接在下面寫了新的sql,注釋的時候一般我都習慣性的選中之后Ctrl+/利用編輯器自帶的自動注釋功能,這個時候編輯器是分兩種情況的:情況一是你之前老的sql沒有類似<where>這樣帶特殊尖括號的語句,這個時候如果用Ctrl+/的話編輯器會用'--'也就是sql語句的注釋去注釋你之前的老sql,注釋完之后編輯器并不會報錯如果比較幸運你之前的語句里沒有參數的話執行也是沒有問題的,但是,注意這個但是,如果你之前的sql語句帶#{xxxx}或者${xxx}這樣的參數,
形如下面這樣:
-- #{month,jdbcType=VARCHAR}
那么恭喜你,這個時候執行的話就會報很詭異的異常,類似于下面這樣:
org.springframework.dao.TransientDataAccessResourceException:
### Error querying database. Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
這個時候你可能會和我一樣丈二和尚摸不著頭腦,特別是如果之前么有遇見過這個問題的話,很有可能會在這里搞很久;情況二是你的老sql有<where>這樣的帶尖括號的語句,這個時候你用Ctrl+/的話,會自動是<!-- xxx-->也就是標準的xml注釋,這個時候即使你注釋的xxx包括外部參數占位,執行的時候也不會報錯,形如下面這樣也不會有問題:
<!-- #{month,jdbcType=VARCHAR}-->
這個問題由于之前自己沒有遇見過所以這次在這里卡了挺久才試出問題原因,至于兩種方式為何會有所區別回頭還得好好看看mybatis的源碼,之后再補充到這篇文章里,占用上班時間做個記錄
java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2)
調試半天,網上查了半天都是# 、$ 用法出錯,一次次的對比,一個個字找,發現,用法根本沒問題,突然。。。看到了注釋中的
#{executorId},想想,也許是這個的原因呢?然后就給注釋刪了,結果發現就是注釋的鍋:
這樣,mybatis仍舊會把#{}算成一個帶注入的參數,二SQL認出了這個-- 的注釋
-- 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注釋帶參數的坑怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。