接口綁定
隨著Java 5的推廣,我們有機(jī)會(huì)來改善用戶體驗(yàn)。其中最重要的是借助Java 5可以消除令人生惑的類型轉(zhuǎn)換,可以消除SQL映射基于字符的調(diào)用方式。舉例來說,現(xiàn)在在調(diào)用SQL映射的時(shí)候是這樣的:
//...and...
List employees = sqlMapper.queryForList("listAllEmployees");
問題是很明顯的。第一,上面的兩個(gè)例子中被映射的語句的名稱都是基于字符串的,而這很容易導(dǎo)致錯(cuò)誤。這種方式也不會(huì)得到IDE工具、編譯器的支持和管理。
第二個(gè)問題是存在參數(shù)和返回值類型安全問題。在第一個(gè)例子中,誰能保證參數(shù)的類型一定是Integer?而誰又能保證您得到的返回值一定是Employee類型呢?這里,編譯器也不會(huì)給出任何償錯(cuò)誤報(bào)告和提示。而只有運(yùn)行時(shí)異常會(huì)被拋出。
最后,在集合的例子中問題也是相同的。在運(yùn)行前,您可能會(huì)獲得Dogs的集合,而不是Employees。
總之,這種方式雖然比JDBC強(qiáng),但是也讓人倍感難受,還是存在改善的空間。
在Java 5中我們可以充分使用范型來規(guī)范集合類型。這樣,我們不需要進(jìn)行特殊的配置就可以為集合類型建立一致的API。我們不需要在XML文件中聲明類型,不需要通過字符名稱來調(diào)用被映射的語句,相反,我們可以充分利用表達(dá)好且類型安全的接口類型。沒有什么新東西需要學(xué)習(xí),只是普通的接口就可以了。
{
Employee getEmployee (int employeeId);
List
}
這就夠了!iBATIS來幫我們實(shí)現(xiàn)這個(gè)接口。
現(xiàn)在我們可以以一種更加簡潔和安全的方式來調(diào)用被映射的語句了。
//...and...
List
在上面的調(diào)用中沒有類型轉(zhuǎn)換、沒有字符串,而且參數(shù)和返回值的類型是、安全的。額外的代碼就是針對接口使用XML或者Java的標(biāo)識進(jìn)行配置。最多我們只需要配置SQL語句、需要進(jìn)行重載的參數(shù)或者返回值類型。
接口描述了所需要的一切。
- 語句的名稱(默認(rèn)情況下與方法的名字一致)
- 參數(shù)類型(如果存在的話)
- 返回值類型(包括范型集合的元素的類型)
而其中最有趣的就是我們可以基于方法名稱這樣的約定來生成SQL映射。以后關(guān)于配置的章節(jié)中將詳細(xì)討論這些細(xì)節(jié)。
接口綁定的方法使得諸如Spring這樣的框架將映射類注入其他類變得容易,同時(shí)也不需要將事務(wù)管理的過多細(xì)節(jié)公開。