MyBatis-Spring允許你在Service Bean中注入映射器。當使用映射器時,就像調用DAO那樣來調用映射器就可以了,但是此時你就不需要進行任何DAO實現的編碼,因為MyBatis會為你進行。
使用注入的映射器,你的代碼就不會出現任何MyBatis-Spring依賴和MyBatis依賴。在我們的應用中有這樣一個簡單的映射器。你也應該知道映射器僅僅是一個介面:
public interface UserMapper { User getUser(String userId); }
這是你使用MyBatis-Spring來建立映射器的方式:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> <property name="mapperInterface" value="sample.UserMapper" /> </bean>
現在你的映射器已經準備在Service對象中注入了:
<bean id="fooService" class="sample.FooServiceImpl"> <property name="userMapper" ref="userMapper"/> </bean>
註:映射器介面全類名與映射器xml設定檔的namespace是對應的。
關於MapperFactoryBean
MapperFactoryBean建立的代理類實現了映射器介面(如上例:UserMapper),並且注入到應用程式中。因為代理建立在運行環境中,那麼指定的映射器必須是一個介面。而不是一個具體的實作類別。
沒有必要在Spring的XML設定檔中註冊所有的映射器。相反,你可以使用一個MapperScannerConfigurer,它將會尋找類路徑下的映射器並自動將它們建立成MapperFactoryBeans。要建立MapperScannerConfigurer,可以在Spring的配置中添加如下代碼:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propery name="basePackage" value="org.mybatis.spring.sample.mapper"/> </bean>
basePackage屬性是讓你為映射器介面檔案設定基本的包路徑。你可以使用分號或逗號作為分隔字元設定多於一個的包路徑。每個映射器將會在指定的包路徑中遞迴地被搜尋到。
注意,沒有必要去指定SqlSessionFactory或SqlSessionTemplate,因為MapperScannerConfigurer將會建立MapperFactoryBean,之後自動裝配。但是,如果你使用了一個以上的DataSource(因此,也是多個的SqlSessionFactory),那麼自動裝配可能會失效。這種情況下,你可以使用sqlSessionFactory或sqlSessionTemplate屬性來設定正確的工廠/模板。
MapperScannerConfigurer支援過濾由指定的建立介面或註解建立映射器。annotationClass屬性指定了要尋找的註解名稱。markerInterface屬性指定了要尋找的父介面。如果兩者都被指定了,加入到介面中的映射器會匹配兩種標準。預設情況下,這兩個屬性都是null,所以在基包中給定的所有介面可以作為映射器載入。
被發現的映射器將會使用Spring對自動偵測組件預設的命名策略來命名。也就是說,如果沒有發現註解,它就會使用映射器的非大寫的非完全限定類名。但是如果發現了@Component或JSR-330@Named註解,它會擷取名稱。