到:無(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和StringTypeHandler類(lèi)型處理器來(lái)設(shè)置參數(shù)。類(lèi)型處理器都是實(shí)現(xiàn)于TypeHandler接口,源碼都存放在org.apache.ibatis.type的命名空間下。TypeHandler接口的源碼也很簡(jiǎn)單。我們可以看到setParameter方法。顧名思義他就是用于設(shè)置參數(shù)。其他的方法都是用于處理回返的結(jié)果。如下。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線(xiàn)安全]玩轉(zhuǎn)無(wú)線(xiàn)電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26