Spring中集成Mybatis

Spring中集成Mybatis

概述

集成其它框架是spring的一个优势,集成使用的是spring的核心技术ioc。

将MyBatis与Spring进行整合,主要解决的问题就是将MyBatis用到的对象交由Spring容器管理。

使用MyBatis执行sql语句需要的对象如下:

  1. 数据源对象;
  2. SqlSessionFactory对象,通过该对象的openSession()方法才可得到SqlSession对象;
  3. 需要有Dao接口的代理对象:拥有SqlSession对象后,通过该对象的getMapper(xxxDao.class)方法才可得到。

综上所述要使用MyBatis框架需要用有三个对象

对比

在使用Spring之前,使用MyBatis框架得到SqlSession对象需要以下步骤:

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
/**
* 工具类:创建SQLSession对象
*/
public class MybatisUtils {
static final String CONFIG_FILE = "mybatis-config.xml";
static SqlSessionFactory factory;

//初始化工厂类
static {
try {
InputStream resourceAsStream = Resources.getResourceAsStream(CONFIG_FILE);
factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}

public static SqlSession getSqlSession() {
SqlSession session = null;
if (session == null) {
session = factory.openSession();
}
return session;
}
}

// 通过该工具类得到Sqlsession后还得通过getMapper()方法得到Dao接口的代理对象才可进行数据库操作

使用Spring之后,所有对象都交由Spring对象管理,使用时从容器中获取Dao的代理对象进行数据库操作即可。

Maven依赖

使用Spring集成MyBatis所需Maven依赖

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
41
42
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.2</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.1</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.1</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>

<!-- 使用的连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>

使用MyBatis需声明的插件

1
2
3
4
5
6
7
8
9
10
11
<!--资源插件,处理src/main/java目录中的xml文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

配置文件

MyBatis主配置文件,抛弃自带的连接池,使用更强大的连接池Druid

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
指定其它mapper文件的位置::其它mapper文件的作用是找到其它文件的sql语句
-->
<mappers>
<!--<mapper resource="cn\hznu\dao\StudentDao.xml"/>-->
<package name="cn.hznu.dao"/>
</mappers>
</configuration>

Spring配置文件,声明使用MyBatis所需的三个对象

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
41
42
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">

<!-- jdbc配置文件 -->
<context:property-placeholder location="jdbc.properties"/>

<!--
声明数据源,此处使用ali的Druid连接池
连接池介绍:https://github.com/alibaba/druid
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- 声明SqlSessionFactoryBean,在这个类的内部创建一个SqlSessionFactory对象并存在Spring容器中 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 传入数据源对象 -->
<property name="dataSource" ref="dataSource"/>
<!-- 传入主配置文件路径,该属性需要的参数为Resource,可以直接使用value进行赋值 -->
<property name="configLocation" value="mybatis.xml"/>
</bean>

<!--
声明MapperScannerConfigurer
作用:循环basePackage所表示的包,将包中所有的Dao对象找到并生成对应的代理对象,均存在Spring容器中
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定SqlSessionFactoryBean -->
<property name="sqlSessionFactoryBeanName" value="factory"/>
<!-- 指定Dao包 -->
<property name="basePackage" value="cn.hznu.dao"/>
</bean>
</beans>