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