文章目錄
- 前言
- 一、注冊映射器
- 1. XML 配置
- 2. Java 配置
- 二、發現映射器
- 1. <mybatis:scan/>
- 2.@MapperScan ( 建議 ) \color{#00FF00}{(建議)} (建議)
- 三、MapperScannerConfigurer
- 總結
前言
與其在數據訪問對象(DAO)中手工編寫使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代碼,還不如讓 Mybatis-Spring 為你創建一個線程安全的映射器,這樣你就可以直接注入到其它的 bean 中了。
一、注冊映射器
注冊映射器的方法根據你的配置方法,即經典的 XML 配置或新的 3.0 以上版本的 Java 配置(也就是常說的 @Configuration),而有所不同。
1. XML 配置
在你的 XML 中加入 MapperFactoryBean 以便將映射器注冊到 Spring 中。就像下面一樣:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
如果映射器接口 UserMapper 在相同的類路徑下有對應的 MyBatis XML 映射器配置文件,將會被 MapperFactoryBean 自動解析。不需要在 MyBatis 配置文件中顯式配置映射器,除非映射器配置文件與接口類不在同一個類路徑下。 參考 SqlSessionFactoryBean 的 configLocation 屬性以獲取更多信息。
注意 MapperFactoryBean 需要配置一個 SqlSessionFactory 或 SqlSessionTemplate。它們可以分別通過 sqlSessionFactory 和 sqlSessionTemplate 屬性來進行設置。 如果兩者都被設置,SqlSessionFactory 將被忽略。由于 SqlSessionTemplate 已經設置了一個 session 工廠,MapperFactoryBean 將使用那個工廠。
2. Java 配置
@Configuration
public class MyBatisConfig {@Beanpublic MapperFactoryBean<UserMapper> userMapper() throws Exception {MapperFactoryBean<UserMapper> factoryBean = new MapperFactoryBean<>(UserMapper.class);factoryBean.setSqlSessionFactory(sqlSessionFactory());return factoryBean;}
}
二、發現映射器
不需要一個個地注冊你的所有映射器。你可以讓 MyBatis-Spring 對類路徑進行掃描來發現它們。
有幾種辦法來發現映射器:
- 使用
<mybatis:scan/>
元素 - 使用 @MapperScan 注解
- 在經典 Spring XML 配置文件中注冊一個 MapperScannerConfigurer
<mybatis:scan/>
和 @MapperScan 都在 MyBatis-Spring 1.2.0 中被引入。@MapperScan 需要你使用 Spring 3.1+。
1. <mybatis:scan/>
<mybatis:scan/>
元素會發現映射器,它發現映射器的方法與 Spring 內建的<context:component-scan/>
發現 bean 的方法非常類似。
注意引入mybatis的命名空間
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd"><mybatis:scan base-package="org.mybatis.spring.sample.mapper" /><!-- ... --></beans>
base-package 屬性允許你設置映射器接口文件的基礎包。通過使用逗號或分號分隔,你可以設置多個包。并且會在你所指定的包中遞歸搜索映射器。
2.@MapperScan ( 建議 ) \color{#00FF00}{(建議)} (建議)
當你正在使用 Spring 的基于 Java 的配置時(也就是 @Configuration),相比于使用 mybatis:scan/,你會更喜歡用 @MapperScan。
@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {// ...
}
這個注解具有與之前見過的 mybatis:scan/ 元素一樣的工作方式。它也可以通過 markerInterface 和 annotationClass 屬性設置標記接口或注解類。 通過配置 sqlSessionFactory 和 sqlSessionTemplate 屬性,你還能指定一個 SqlSessionFactory 或 SqlSessionTemplate。
NOTE 從 2.0.4 起,如果 basePackageClasses 或 basePackages 沒有定義, 掃描將基于聲明這個注解的類所在的包。
三、MapperScannerConfigurer
apperScannerConfigurer 是一個 BeanDefinitionRegistryPostProcessor,這樣就可以作為一個 bean,包含在經典的 XML 應用上下文中。為了配置 MapperScannerConfigurer,使用下面的 Spring 配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
如果你需要指定 sqlSessionFactory 或 sqlSessionTemplate,那你應該要指定的是 bean 名而不是 bean 的引用,因此要使用 value
屬性而不是通常的 ref 屬性:
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
提示 在 MyBatis-Spring 1.0.2 之前,sqlSessionFactoryBean 和 sqlSessionTemplateBean屬性是唯一可用的屬性。 但由于 MapperScannerConfigurer 在啟動過程中比 PropertyPlaceholderConfigurer 運行得更早,經常會產生錯誤。基于這個原因,上述的屬性已被廢棄,現在建議使用 sqlSessionFactoryBeanName 和 sqlSessionTemplateBeanName 屬性。
總結
回到頂部
我是比較傾向于使用@MapperScan注解去掃描包的,用起來很方便。
學習到這里,你對mybatis的掌握能力已經達到星耀了,稍加練習;王者,指日可待!