Spring 整合MyBatis

参考

1. MyBatis-Spring简介

1.1. 什么是 MyBatis-Spring

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

1.2. MyBatis-Spring版本

注意MyBatis-Spring和Spring之间版本的对应关系

MyBatis-Spring MyBatis Spring 框架 Spring Batch Java
2.0 3.5+ 5.0+ 4.0+ Java 8+
1.3 3.4+ 3.2.2+ 2.1+ Java 6+

2. 基本环境搭建

2.1. 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- org.mybatis.spring.SqlSessionFactoryBean使用了spring-jdbc,所以必须要导入这个依赖 -->
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>

2.2. jdbc.properties

1
2
3
4
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

2.3. applicationContext.xml

以下配置是必须的

  • 配置数据源
  • 配置SqlSessionFactoryBean,并引用数据源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- 数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="maxActive" value="10"/>
<property name="minIdle" value="5"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>

2.4. Bean/Mapper接口/映射文件

这里就简单列出listBrands的配置

1
2
3
4
<!-- List<Brand> listBrands() -->
<select id="listBrands" resultType="demo.mybatis.entity.Brand">
SELECT * FROM brand
</select>

3. 整合方式一:使用SqlSessionTemplate

3.1. 编辑Bean配置文件

  • sqlSessionFactory要指定Mapper映射文件的路径
  • 配置SqlSessionTemplate,引用sqlSessionFactory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定Mapper映射文件 -->
<property name="mapperLocations">
<list>
<value>classpath:demo/mybatis/mapper/**/*.xml</value>
</list>
</property>
</bean>

<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 引用sqlSessionFactory -->
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

3.2. 测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringRunner.class)
public class SpringTest {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;

@Test
public void test() {
// selectList("命名空间.id") 执行对应的SQL语句
List<Brand> objects = sqlSessionTemplate.selectList("demo.mybatis.mapper.BrandMapper.listBrands");
System.out.println(objects);
// getMapper() 获取Mapper,再执行相应方法
BrandMapper mapper = sqlSessionTemplate.getMapper(BrandMapper.class);
mapper.listBrands().forEach(System.out::println);
}
}

4. 整合方式二:SqlSessionDaoSupport

TODO

5. 整合方式三:MapperFactoryBean

TODO

6. 整合方式四:扫描Mapper

6.1. 配置MapperScannerConfigurer

配置MapperScannerConfigurer,指定扫描指定包下所有的Mapper接口,自动创建代理并且在Spring容器中注册,遵循以下规范

  • Mapper接口与映射文件在同一级目录
  • 注册的Mapper,其id是Mapper接口类名首字母小写
1
2
3
4
5
6
7
8
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描Mapper所在包 -->
<property name="basePackage" value="demo.mybatis.mapper"/>
</bean>

6.2. 测试

1
2
3
4
5
6
7
8
9
10
11
12
13

@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringRunner.class)
public class SpringTest {
// 扫描到Mapper就会被注册到IoC容器中,所以直接装配使用Mapper即可
@Autowired
private BrandMapper brandMapper;

@Test
public void test() {
brandMapper.listBrands().forEach(System.out::println);
}
}

7. 几种方式的对比

显然扫描Mapper最方便啊,配置少,还是批量自动注册的

panchaoxin wechat
关注我的公众号
支持一下