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的源碼,之後再補充到這篇文章裡,占用上班時間做個記錄

mybatis的xml中註釋需謹慎

報錯內容

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的sql裡不是不能寫註釋,而是註釋不能有#{},mybatis仍舊會把#{}算成一個帶註入的參數

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: