Mybatis(五)--原始碼分析傳入單個list引數和多個list引數寫法
強烈推薦一個大神的人工智慧的教程:http://www.captainbed.net/zhanghan
需求描述
今天在做一個級聯刪除功能,許可權中刪除資源時,級聯刪除掉角色和資源繫結的資料。在學習mybatis的時候知道在dao層使用@param註解的原因是當傳入多個引數時可能會導致mybatis不知道引數對應關係,所以需要使用@param指定引數的別名,此次刪除就只有一個引數,心想沒必要加@param註解了,但是,報錯了。
問題描述
- 介面如下:
/**
* 根據資源id刪除相關的角色資源繫結資料
* @param applicationIds 資源ids
* @return 受影響行數
*/
int deleteByApplicationId(List<String> applicationIds);
- 錯誤的實現程式碼如下:
<delete id="deleteByApplicationId">
UPDATE tc_role_application
SET is_delete =1
WHERE application_id IN (
<foreach collection="applicationIds" item="id" separator=",">
#{id}
</foreach>
) AND is_delete = 0
</delete>
報錯資訊如下:org.apache.ibatis.binding.BindingException: Parameter 'applicationIds' not found. Available parameters are [collection, list]
- 正確的實現程式碼如下:
<delete id="deleteByApplicationId">
UPDATE tc_role_application
SET is_delete =1
WHERE application_id IN (
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
) AND is_delete = 0
</delete>
原始碼分析
- 在傳入單個引數,引數型別為list或array或String型別時需要遵從如下規則
- 如果傳入的是單個引數,且引數型別是一個List的時候,collection屬性值為list
- 如果傳入的是單個引數,且引數型別是一個array的時候,collection屬性值為array
- 如果傳入的是單個引數,且引數型別是一個String的時候,mapper中的寫法應該是#{_parameter}這樣的格式,例如,dao層介面中傳遞的引數是String id 那麼在mapper中需要寫成#{_id}
2. Mybatis原始碼
在mybatis的jar包中,binding包下有MapperMethod這個類,其中execute方法針對不同的操作,根據不同的引數個數有不同的方案,當引數個數大於1時,會將引數封裝到一個map中,key值是@param註解對應的別名。
上述程式碼中convertArgsToSqlCommandParam方法呼叫getNameParams方法:
總結
mybatis為開發者封裝的非常的靈活,這些坑很簡單,但是不睬不知道呀!
相關文章
- Mybatis傳入引數為List物件MyBatis物件
- mybatis 傳入多個引數MyBatis
- MyBatis中傳入引數為List集合的MyBatis
- MyBatis中foreach傳入引數為list、陣列、map的不同寫法MyBatis陣列
- mybatis 的傳入引數如何既有物件又有單個引數MyBatis物件
- Mybatis parameterType 傳入多個引數的使用MyBatis
- 輸入多個編碼並支援模糊搜尋,引數是一個list
- 15.MyBatis傳入多個引數的問題MyBatis
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- List分頁(SQL引數化2100個 )SQL
- Mybatis 傳入多個引數查詢資料 (3種方法)MyBatis
- 可變引數va_list
- mybatis如何傳引數MyBatis
- Mybatis引數傳遞MyBatis
- 一個 List.of 引發的“血案”
- bash shell指令碼接受多個引數指令碼
- List原始碼分析原始碼
- Angular 自定義結構化指令,如何傳入多個輸入引數Angular
- 請求引數為物件,mybatis的sql寫法物件MyBatisSQL
- mybatis基礎03(介面中的多個引數處理)MyBatis
- Guava Cache:核心引數深度剖析和原始碼分析Guava原始碼
- .net原始碼分析 – List原始碼
- SpringMVC中@RequestBody接收前端傳來的多個引數SpringMVC前端
- [寫了一個玩具] 引數注入
- Swift 使用lexicographicallyprecedes 多個引數排序Swift排序
- 巨集定義跟多個引數
- Mybatis中List傳值MyBatis
- 引數的定義和引數的傳遞
- [20180930]in list與繫結變數個數.txt變數
- [20210120]in list與繫結變數個數.txt變數
- Java函式泛型List引數,操作泛型元素Java函式泛型
- GridView傳遞兩個引數的方法View
- Mybatis引數傳遞&註解開發MyBatis
- shell指令碼中main函式中$#獲取不到指令碼傳入引數個數淺析指令碼AI函式
- mybatis sql foreach 引數的傳入的三種情況!!MyBatisSQL
- [work] python list中數字與一個數相乘Python
- mybatis註解Select查詢List,返回有物件個數,但是為nullMyBatis物件Null
- gdb除錯傳入引數除錯