1、什么是MyBatis-Spring?
通过前面的学习,在项目中我们可以直接使用原生MyBatis可以实现数据库操作,那MyBatis-Spring又设计来干什么呢?
现在Spring已经成为企业级应用的主流框架,使用MyBatis-Spring 可以你将 MyBatis无缝地整合到 Spring中。允许MyBatis参与到Spring的事务管理之中,创建映射器mapper和SqlSession并注入到bean中,以及将 Mybatis 的异常转换为Spring的DataAccessException。
其他几种方式链接
2、为什么会有MyBatis-Spring
Spring 2.0只支持iBatis 2.0,Mybatis团队本来想将 MyBatis3 的支持添加到 Spring 3.0 中。不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。由于 Spring 开发团队不想发布一个基于未发布版的 MyBatis 的整合支持,如果要获得 Spring 官方的支持,只能等待下一次的发布。为了在 Spring 中对 MyBatis 提供支持,MyBatis 社区认为,应该将对 Spring 的集成作为 MyBatis 的一个社区子项目,MyBatis-Spring项目就此诞生。
3、怎么使用MyBatis-Spring
MyBatis-Spring相比较原生MyBatis增加了对Spring的适配,MyBatis-Spring将MyBatis的操作类作为Bean注入到Spring,将生命周期交给了Spring进行管理,使应用程序与MyBatis进行了解耦,具备更好的扩展性。
在使用上有如下区别:
- 需要在Spring的上下文中添加SqlSessionFactory和至少一个数据映射器类
- 通过MapperFactoryBean将接口注入Spring中
4、代码示例
新增spring-context、mybatis-spring、spring-boot-starter-jdbc依赖项
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
新增Spring配置文件applicationContext.xml
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/learnDB?useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="my2020"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
<!-- mybatis-spring 提供的SqlSessionFactory 配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 注入userMapper. SqlSessionFactory 会被自动关联. -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" autowire="byType">
<property name="mapperInterface" value="com.reeson.learn.demo.mapper.UserMapper" />
</bean>
<!-- MyBatis-Spring 将会创建userMapper的一个代理bean -->
<bean id="userService" class="com.reeson.learn.demo.service.UserService">
<constructor-arg ref="userMapper" />
</bean>
</beans>
修改测试主类
package com.reeson.learn.demo;
import com.reeson.learn.demo.entity.User;
import com.reeson.learn.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
import java.util.List;
public class UserTest {
UserService userService;
void setUserService(UserService userService){
this.userService = userService;
}
void selectUser(int id) {
User user = userService.getUser(id);
System.err.println(user);
}
void selectAll() {
List<User> users = userService.getAll();
System.err.println(users);
}
void insertUser(User user) {
int insert = userService.insert(user);
System.err.println(insert);
}
void deleteUser(int id) {
int delete = userService.delete(id);
System.err.println(delete);
}
void updateUser(User user) {
int update = userService.update(user);
System.err.println(update);
}
public static void main(String[] args) throws IOException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserTest services = new UserTest();
services.setUserService((UserService)applicationContext.getBean("userService"));
//查询
services.selectAll();
services.selectUser(1);
//添加
User user = new User();
user.setId(40);
user.setName("Hanks");
user.setAge(15);
services.insertUser(user);
services.selectAll();
//更新
user.setName("Grace");
user.setAge(18);
services.updateUser(user);
services.selectAll();
//删除
services.deleteUser(40);
services.selectAll();
}
}
运行之后,可以看到跟使用原生MyBatis得到了一样的结果,可以顺利的完成数据库操作。