文章目录
- 前言
- 一、注册映射器
- 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的掌握能力已经达到星耀了,稍加练习;王者,指日可待!