在上一篇博文的示例中,咱們在beans.xml中配置了studentMapper和teacherMapper,供咱們須要時使用。但若是須要用到的映射器較多的話,採用這種配置方式就顯得很低效。爲了解決這個問題,咱們可使用MapperScannerConfigurer,讓它掃描特定的包,自動幫咱們成批地建立映射器。這樣一來,就能大大減小配置的工做量。以下所示(點擊此處進入本示例源程序下載頁面): html
<?xml version="1.0" encoding="utf8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName" default-lazy-init="false"> <!--本示例採用DBCP鏈接池,應預先把DBCP的jar包複製到工程的lib目錄下。 鏈接池配置以下--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/courseman"/> <property name="username" value="courseman"/> <property name="password" value="abc123"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--dataSource屬性指定要用到的鏈接池--> <property name="dataSource" ref="dataSource"/> <!--configLocation屬性指定mybatis的核心配置文件--> <property name="configLocation" value="resources/configuration.xml"/> </bean> <!--MapperScannerConfigurer配置--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--basePackage指定要掃描的包,在此包之下的映射器都會被 搜索到。可指定多個包,包與包之間用逗號或分號分隔--> <property name="basePackage" value="com.abc.mapper"/> </bean> </beans>
這裏須要注意三點: java
第一,無需指定引用SqlSessionFactory,由於MapperScannerConfigurer在建立映射器時會經過自動裝配的方式來引用。 mysql
第二,建立的映射器的命名問題。從beans.xml文件中咱們能夠看出,咱們沒有辦法給MapperScannerConfigurer建立的這些映射器指定id或name屬性,它們對咱們彷佛是不可見的。這個問題的解決之道在於採用了Spring針對自動偵測到的組件的默認命名策略,亦即把類/接口名字的首字母小寫,其餘不變,做爲映射器的名字。例如,映射器接口TeacherMapper被掃描後建立的映射器bean名爲teacherMapper。所以,咱們能夠像之前同樣使用這樣的代碼來獲得TeacherMapper實例: spring
TeacherMapper mapper = (TeacherMapper)ctx.getBean("teacherMapper");
第三,可使用@Component註解給映射器指定名稱(本示例的源程序便是採用這種方法)。這裏以TeacherMapper爲例,若想指定生成的映射器bean名稱爲「myTeacherMapper」,步驟以下: sql
一、在TeacherMapper接口中增長以下聲明:「import org.springframework.stereotype.Component;」; apache
二、在接口聲明前添加@Component("myTeacherMapper")註解,即指定生成的映射器名稱爲myTeacherMapper。 mybatis
源碼(TeacherMapper.java)以下: app
package com.abc.mapper; import com.abc.domain.Teacher; import org.springframework.stereotype.Component; @Component("myTeacherMapper") public interface TeacherMapper { public Teacher getById(int id); }
相應地,在程序中訪問此映射器的代碼應改成: dom
TeacherMapper mapper = (TeacherMapper)ctx.getBean("myTeacherMapper");
運行結果以下: ide
還有一點順便說起,若映射器接口(如TeacherMapper接口)與相應的映射配置文件(如TeacherMapper.xml)同名且在同一目錄下,就無需在覈心配置文件configuration.xml中使用mappers元素來指定映射配置文件了。讀者可自行實驗。
參考資料:
一、http://www.mybatis.org/spring/zh/mappers.html#MapperScannerConfigurer(中文)
二、http://www.mybatis.org/spring/mappers.html#MapperScannerConfigurer(英文)
MyBatis技術交流羣:188972810,或掃描二維碼:
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之二:MyBatis增刪改示例
【MyBatis學習筆記】系列之三:MyBatis的association示例
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例
【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例
【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例
【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例
【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2