官網(wǎng)上面講到:無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí), 都會(huì)用類(lèi)型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類(lèi)型。那么為什么會(huì)有類(lèi)型處理器呢?這一點(diǎn)并不難理解,SQL語(yǔ)句事實(shí)上可以理解為一門(mén)面向數(shù)據(jù)庫(kù)的編程語(yǔ)言。所以相對(duì)而言都有自己的數(shù)據(jù)類(lèi)型。這也就意味著存在數(shù)據(jù)類(lèi)型不一至的問(wèn)題。同時(shí)不同的數(shù)據(jù)庫(kù)之間數(shù)據(jù)類(lèi)型還有一定的差義。類(lèi)型處理器則就是用于處理數(shù)據(jù)類(lèi)型不一至的問(wèn)題。
筆者看過(guò)幾個(gè)不同的ORM框架都存在著類(lèi)型處理器的概念??梢?jiàn)類(lèi)型處理器在ORM框架上實(shí)現(xiàn)有多么重要。在官網(wǎng)上面已經(jīng)列出了20多種的內(nèi)部類(lèi)型處理器。筆者建議最好選擇性的看。好比如說(shuō)筆者當(dāng)前的列子里面用到的一個(gè)叫UnknownTypeHandler的類(lèi)型處理器。
List<Product> products = dao.SelectProducts(30, "a");
<select id="SelectProducts" resultMap="result" > select * from Products where #{0} > ProductID and ProductName like #{1}</select>
例子里面并沒(méi)有指出是什么樣子的JAVA類(lèi)型。所以當(dāng)然是UnknownTypeHandler類(lèi)型了。即然這樣子我們不煩設(shè)置一下他的類(lèi)型在來(lái)看看。我們只要把上面的配置修改一下就可以了。如下紅色標(biāo)記。
<select id="SelectProducts" resultMap="result" > select * from Products where #{0,javaType=int,jdbcType=NUMERIC} > ProductID and ProductName like #{1,javaType=String,jdbcType=VARCHAR}</select>
關(guān)于#{}的語(yǔ)法問(wèn)題,相信筆者不用多講大家都清楚。從上面簡(jiǎn)單的設(shè)置里,我們可以看到源碼里面會(huì)找到IntegerTypeHandler和StringTypeHand