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 多引數 list和StringMyBatis
- mybatis 傳入多個引數MyBatis
- MyBatis傳入多個引數MyBatis
- MyBatis中傳入引數為List集合的MyBatis
- MyBatis中foreach傳入引數為list、陣列、map的不同寫法MyBatis陣列
- mybatis 的傳入引數如何既有物件又有單個引數MyBatis物件
- Mybatis parameterType 傳入多個引數的使用MyBatis
- MyBatis傳入多個引數的問題MyBatis
- 輸入多個編碼並支援模糊搜尋,引數是一個list
- mybatis 傳遞多個引數 --解決mybatis查詢使用多個引數方法--javabean傳統方法和map方法MyBatisJavaBean
- 15.MyBatis傳入多個引數的問題MyBatis
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- MyBatis傳入多個引數,傳入陣列和列表資料的處理MyBatis陣列
- Mybatis 傳入多個引數查詢資料 (3種方法)MyBatis
- mybatis list作為引數 foreach迴圈MyBatis
- List分頁(SQL引數化2100個 )SQL
- Mybatis傳遞多個引數的4種方式(乾貨)MyBatis
- 如何在mybatis 中傳多個引數,如何在mybatis 中遍歷 集合?MyBatis
- mybatis如何傳引數MyBatis
- Mybatis引數傳遞MyBatis
- 在 Angularjs 中 ui-sref 和 $state.go 如何傳遞單個多個引數和將物件作為引數AngularJSUIGo物件
- GridView CommandArgument傳遞多個引數View
- bash shell指令碼接受多個引數指令碼
- Silverlight之Frame傳遞多個引數並獲取完整引數
- List原始碼分析原始碼
- Angular 自定義結構化指令,如何傳入多個輸入引數Angular
- 請求引數為物件,mybatis的sql寫法物件MyBatisSQL
- mybatis基礎03(介面中的多個引數處理)MyBatis
- win下使用expdp的enclude引數時一個物件和多個物件的幾種寫法!物件
- 給一個介面傳遞引數,並接收返回的引數
- Jmeter使用_time函式實現同一個介面引數傳入可以每次傳入不同的引數JMeter函式
- ASP.NET 標記href傳遞多個引數ASP.NET
- Mybatis動態Sql的Foreach遍歷拼接輸入引數中的List或陣列MyBatisSQL陣列
- Guava Cache:核心引數深度剖析和原始碼分析Guava原始碼
- .net原始碼分析 – List原始碼
- Swift 使用lexicographicallyprecedes 多個引數排序Swift排序
- MyBatis引數傳入集合之foreach動態sqlMyBatisSQL