一文帶你讀懂MyBatis中的參數(shù)?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)提供高防物理服務(wù)器租用、云服務(wù)器、香港服務(wù)器、西信服務(wù)器托管等前言
相信很多人可能都遇到過下面這些異常:
"Parameter 'xxx' not found. Available parameters are [...]"
"Could not get property 'xxx' from xxxClass. Cause:
"The expression 'xxx' evaluated to a null value."
"Error evaluating expression 'xxx'. Return value (xxxxx) was not iterable."
不只是上面提到的這幾個(gè),我認(rèn)為有很多的錯(cuò)誤都產(chǎn)生在和參數(shù)有關(guān)的地方。
想要避免參數(shù)引起的錯(cuò)誤,我們需要深入了解參數(shù)。
想了解參數(shù),我們首先看MyBatis處理參數(shù)和使用參數(shù)的全部過程。
本篇由于為了便于理解和深入,使用了大量的源碼,因此篇幅較長,需要一定的耐心看完,本文一定會(huì)對(duì)你起到很大的幫助。
參數(shù)處理過程
處理接口形式的入?yún)?/strong>
在使用MyBatis時(shí),有兩種使用方法。一種是使用的接口形式,另一種是通過SqlSession調(diào)用命名空間。這兩種方式在傳遞參數(shù)時(shí)是不一樣的,命名空間的方式更直接,但是多個(gè)參數(shù)時(shí)需要我們自己創(chuàng)建Map作為入?yún)?。相比而言,使用接口形式更?jiǎn)單。
接口形式的參數(shù)是由MyBatis自己處理的。如果使用接口調(diào)用,入?yún)⑿枰?jīng)過額外的步驟處理入?yún)?,之后就和命名空間方式一樣了。
在MapperMethod.Java會(huì)首先經(jīng)過下面方法來轉(zhuǎn)換參數(shù):
public Object convertArgsToSqlCommandParam(Object[] args) { final int paramCount = params.size(); if (args == null || paramCount == 0) { return null; } else if (!hasNamedParameters && paramCount == 1) { return args[params.keySet().iterator().next()]; } else { final Mapparam = new ParamMap