Spring整合Mybatis(基于xml配置文件方式和基于注解方式)
在此之前,感觉有几个概念需要区分,我们说spring整合第三方框架,通常是第三方框架依赖spring进行再开发,
而spring和springboot又是两个概念,spring多用于ssm架构项目,而springboot多用于现在的微服务架构。
因此说整合其实需要区分“spring整合“和”springboot整合“。
spring整合mybatis的依赖
mybatis-spring
springboot整合mybatis的依赖
mybatis-spring-boot-starter
而spring自身项目框架则命名诸如spring-jdbc
spring-test
等,都是以spring开头的,因此在宏观认识上要做个了结。
我们单独使用Mybatis时候整体步骤如下:
- 配置mybatis的核心配置文件,如 mybatis-config.xml
- 读取配置核心配置文件构建SqlSessionFactory对象
- 由SqlSessionFacory对象构建出SqlSession会话对象用于执行sql
- 读取mapper对象,执行sql(基于xml映射文件或者基于反射获取mapper接口的字节码对象)
我们单独使用Spring的整体步骤如下:
- 配置spring的核心配置
- 读取核心配置获取应用上下文context
这样就已经可以使用spring了,spring的核心在于Ioc容易和DI的依赖注入,我们只需要通过xml或者注解注入bean即为使用。
那么spring整合mybatis实际上就是管理mybatis的bean对象了,而mybatis能够让spring管理的对象主要就两个:SqlSessionFactory
以及对应的业务类Mapper接口对象
所以无论基于xml配置方式还是基于注解方式整合mybatis,最为核心的问题是如何将SqlSessionFacory和对应的Mapper接口对象交由spring管理。而为了让 spring容器管理mybatis对象,因此mybatis基于spring出了Mybatis-spring的jar包。
基于xml配置文件方式
一、环境搭建
版本问题在 mybatis-spring官网 有给出。
maven构建项目所需依赖
最基本的依赖其实为spring-context
,mybatis-spring
,mybatis
,spring-jdbc
,mysql-connector-java
。
这里需要特别注意spirng-jdbc
和mybatis
原因是 mybatis-spring
并没有集成依赖mybatis基础jar包,而spring-jdbc
是因为spring事务管理是由spring-jdbc实现的。
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
二、spring核心配置文件
在mybatis-spring
中给出了两个核心类用于解决spring容器管理核心对象问题。
SqlSessionFactoryBean
,MapperFactoryBean
这两个类命名都是以FacoryBean
结尾的,这个在spring知识体系中是Bean对象实例化的一种形式,意味着实现了FacotoryBean<>的接口,而接口的范型则是需要构建的Bean。
这在看源码时候对理解帮助很大,如SqlSessionFactoryBean
这个类如下:
public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ContextRefreshedEvent>
从这里可以看出两个信息:
- 这是个构建Bean实例的工厂类
- 这个工厂类的目的就是创建
SqlSessionFactory
对象
我们需要SqlSessionFactory
的前提是我们需要给数据源Datasource
,而通过MapperFactoryBean
构建Mapper
接口对象则需要指定SqlSessionFacory
对象,因此有如下xml的配置,属性传递为:UserServiceImpl
注入UserMapper
,UserMapper
由MapperFactoryBean
构建需要注入属性SqlSessionFacory
,而构建SqlSessionFactory
的工厂类则需要注入DataSource数据源。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url"