1.2 Spring 集成

这是 MyBatis 最常用的一种的环境。通用 Mapper 提供了多种方式来和 Spring 进行集成。

1.2.1 添加依赖

在开始配置前,先添加相关的依赖。

正常情况下,Spring 和 MyBatis 的集成环境中,应该已经存在下面的依赖:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>版本号</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mybatis</groupId>
  8. <artifactId>mybatis-spring</artifactId>
  9. <version>版本号</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-context</artifactId>
  14. <version>版本号</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-tx</artifactId>
  19. <version>版本号</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework</groupId>
  23. <artifactId>spring-jdbc</artifactId>
  24. <version>版本号</version>
  25. </dependency>

相关依赖和版本可以通过 http://mvnrepository.com/ 进行搜索

通用 Mapper 支持 MyBatis 3.2.4+

集成通用 Mapper 在上面的基础上添加下面的依赖:

  1. <dependency>
  2. <groupId>tk.mybatis</groupId>
  3. <artifactId>mapper</artifactId>
  4. <version>最新版本</version>
  5. </dependency>

通用 Mapper 最新版本看这里:http://mvnrepository.com/artifact/tk.mybatis/mapper

tk.mybatis:mapper 依赖包含了通用 Mapper 的基础代码以及和 Spring 集成必须的代码

1.2.2 和 Spring 集成

和 Spring 进行集成时,分为 XML 和注解配置两种方式,每种方式又有不同的配置方式。

这里提供了很多配置方式,使用时选择一种改动最小的方式即可!

1.2.2.1 XML 配置

1.使用 MapperScannerConfigurer

和通用 Mapper 以前版本一样,可以直接使用 tk.mybatis 提供的 tk.mybatis.spring.mapper.MapperScannerConfigurer 进行配置,这个配置和 MyBatis 官方提供的 org.mybatis.spring.mapper.MapperScannerConfigurer 区别只是第一层的包名,tkorg。所以使用这种方式时,如果你项目已经使用 org. 进行了配置,只需要改成 tk. 即可。

  1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="basePackage" value="扫描包名"/>
  3. </bean>

如果你需要对通用 Mapper 进行特殊配置,可以按下面的方式进行配置:

  1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="basePackage" value="tk.mybatis.mapper.mapper"/>
  3. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  4. <property name="properties">
  5. <value>
  6. 参数名=值
  7. 参数名2=值2
  8. ...
  9. </value>
  10. </property>
  11. </bean>

可用配置的参数请看后续的配置文档,配置参数时一行写一个值。

2.XML 配置使用 Configuration

如果某些第三方也需要特殊的 MapperScannerConfigurer 时,就不能用上面的方式进行配置了,此时可以选择下面这种方式,这种方式要求使用MyBatis (3.4.0+) 和 mybatis-spring (1.3.0+),配置方式如下:

  1. <!--使用 Configuration 方式进行配置-->
  2. <bean id="mybatisConfig" class="tk.mybatis.mapper.session.Configuration">
  3. <!-- 配置通用 Mapper,有三种属性注入方式 -->
  4. <property name="mapperProperties">
  5. <value>
  6. notEmpty=true
  7. </value>
  8. </property>
  9. </bean>
  10. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  11. <property name="dataSource" ref="dataSource"/>
  12. <property name="configuration" ref="mybatisConfig"/>
  13. </bean>
  14. <!-- 不需要考虑下面这个,注意这里是 org 的 -->
  15. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  16. <property name="basePackage" value="tk.mybatis.mapper.configuration"/>
  17. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  18. </bean>

这里使用了 tk.mybatis.mapper.session.Configuration ,也就是不能通过读取 mybatis-config.xml 进行配置,上面这种配置更直接,使用 Spring setter 配置属性更方便。当需要配置通用 Mapper 时,使用 mapperProperties 属性配置即可,配置方式和前面的相同,一行一个配置即可。

配置了一个 mybatisConfig 的 bean 后,在 SqlSessionFactoryBean 中注入即可。

后面的 MapperScannerConfigurer 只是为了说明这里不需要使用 tk. 开头的类进行配置。

这种配置方式基本上和任何第三方都不会冲突,如果你遇到了第三方重写 SqlSessionFactoryBean 的情况,就使用前一种方式配置即可。

1.2.2.2 使用 @MapperScan 注解

如果要使用该注解进行配置,请确认选择的是 tk.mybatis.spring.annotation.MapperScan 注解(必须使用官方的注解时,看下面其他配置方式)。

tk 提供的这个注解相比官方的多了下面两个属性:

  1. /**
  2. * 通用 Mapper 的配置,一行一个配置
  3. *
  4. * @return
  5. */
  6. String[] properties() default {};
  7. /**
  8. * 还可以直接配置一个 MapperHelper bean
  9. *
  10. * @return
  11. */
  12. String mapperHelperRef() default "";

这两个配置方式中,mapperHelperRef 优先级更高,只需要选择其中一种方式进行配置即可。

1.使用 properties 配置时:

  1. @Configuration
  2. @MapperScan(value = "tk.mybatis.mapper.annotation",
  3. properties = {
  4. "mappers=tk.mybatis.mapper.common.Mapper",
  5. "notEmpty=true"
  6. }
  7. )
  8. public class MyBatisConfigProperties {

和 XML 中很像,仍然一个一个配置。

2.使用 mapperHelperRef 配置时:

  1. @Configuration
  2. @MapperScan(value = "tk.mybatis.mapper.annotation", mapperHelperRef = "mapperHelper")
  3. public static class MyBatisConfigRef {
  4. //其他
  5. @Bean
  6. public MapperHelper mapperHelper() {
  7. Config config = new Config();
  8. List<Class> mappers = new ArrayList<Class>();
  9. mappers.add(Mapper.class);
  10. config.setMappers(mappers);
  11. MapperHelper mapperHelper = new MapperHelper();
  12. mapperHelper.setConfig(config);
  13. return mapperHelper;
  14. }
  15. }

这里配置 mapperHelperRef = "mapperHelper",并且提供了一个名为 mapperHelperbean。对通用 Mapper 的任何配置直接通过编码对 MapperHelper 进行配置。

3.使用 Configuration 进行配置

这里可以使用 tk 或者 MyBatis 官方的 @MapperScan 注解。

  1. @Configuration
  2. @MapperScan(value = "tk.mybatis.mapper.annotation")
  3. public static class MyBatisConfigRef {
  4. @Bean
  5. public SqlSessionFactory sqlSessionFactory() throws Exception {
  6. SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  7. sessionFactory.setDataSource(dataSource());
  8. //tk.mybatis.mapper.session.Configuration
  9. Configuration configuration = new Configuration();
  10. //可以对 MapperHelper 进行配置后 set
  11. configuration.setMapperHelper(new MapperHelper());
  12. //设置为 tk 提供的 Configuration
  13. sessionFactory.setConfiguration(configuration);
  14. return sessionFactory.getObject();
  15. }
  16. }

@MapperScan 注解在 Spring Boot 集成中还会提到。

文档到这里就集成好通用 Mapper 了,接下来请继续看下一章内容。

1.2.3 细化依赖的用法

首先不推荐 Maven 初学者看这里,也不建议通用 Mapper 初学者看这里

在决定是否看之前,先看看细化依赖用法的特点:

  • 可以以最精简的方式引入通用 Mapper,按照需要引入。
  • 可以将某个依赖替换为自己的实现或者选择特定版本的依赖(比如某些依赖可以选择 Java 6 或者 Java 8 的版本)。
  • 支持 Spring 高版本的特殊用法(例如多个 @MapperScan注解,暂时还没提供)

通用 Mapper4 中,原来的 tk.mybatis:mapper 项目已经拆分,1.2.1 中添加的依赖是通过特殊打包方式将所有拆分的项目合并到了一个 jar 包中。

如果需要对依赖进行详细的定制,可以分别引入下面的依赖:

  1. <!-- 必备依赖,提供核心功能 -->
  2. <dependency>
  3. <groupId>tk.mybatis</groupId>
  4. <artifactId>mapper-core</artifactId>
  5. <version>${mapper-core.version}</version>
  6. </dependency>
  7. <!-- 如果需要通用 Mapper 自带的 Mapper 接口和系列方法,需要引入本依赖 -->
  8. <!-- 拆分 base 项目的目的在于以后可能会提供其他的方式来实现接口 -->
  9. <dependency>
  10. <groupId>tk.mybatis</groupId>
  11. <artifactId>mapper-base</artifactId>
  12. <version>${mapper-base.version}</version>
  13. </dependency>
  14. <!-- 针对开发人员的需要提供的一些额外的接口,都有特殊的使用要求 -->
  15. <dependency>
  16. <groupId>tk.mybatis</groupId>
  17. <artifactId>mapper-extra</artifactId>
  18. <version>${mapper-extra.version}</version>
  19. </dependency>
  20. <!-- 基于 Java8 方法引用的类 Example 对象 Weekend -->
  21. <dependency>
  22. <groupId>tk.mybatis</groupId>
  23. <artifactId>mapper-weekend</artifactId>
  24. <version>${mapper-weekend.version}</version>
  25. </dependency>
  26. <!-- 代码生成器 -->
  27. <dependency>
  28. <groupId>tk.mybatis</groupId>
  29. <artifactId>mapper-generator</artifactId>
  30. <version>${mapper-generator.version}</version>
  31. </dependency>
  32. <!-- Spring 集成必备 -->
  33. <dependency>
  34. <groupId>tk.mybatis</groupId>
  35. <artifactId>mapper-spring</artifactId>
  36. <version>${mapper-spring.version}</version>
  37. </dependency>

这些依赖的版本号可以通过 mapper-all 子模块进行查看

https://github.com/abel533/Mapper/tree/master/mapper-all/pom.xml

还可以通过下面的目录查找

http://central.maven.org/maven2/tk/mybatis/