目录
一、引言:
1.1、Spring的两大核心思想:
1.2 、Spring可以对mybatis提供哪些支持?
二、Spring整合mybatis准备工作:
2.1 创建maven工程
2.2 部署mybatis、Spring、整合依赖等框架
三、配置数据源(Druid连接池)
3.1 添加Druid依赖
3.2 创建Druid.properties属性文件
3.3 在ApplicationContext.xml配置数据源
四:配置sqlsessionFactory
五、配置MapperScannerConfigurer
六、整合Aop配置
6.1 将spring事务配置给spring容器
6.2 声明事务策略
6.2.1 事务的隔离级别
6.2.2 事务的传播机制
6.3 Aop事务配置
七、事务管理配置(注解配置)
八、案例测试
1、IOC:控制反转,Spring容器可以完成对象的创建,属性的注入,对象管理等工作
2、Aop:面向切面,在不修改代码业务逻辑的情况下,实现原有的业务的增强
1、Spring-Ioc可以为mybatis完成DataSource、SqlSessionFactory、SqlSession以及Dao对象的创建
2、Spring-Aop可以提供事物管理切面类完成对mybatis数据库中的事务管理
创建maven工程可以选择模板创建,也可以手动创建(建议手动创建),使用模板时间较慢,本实例中项目取名为“SpringMybatis02”(可以自定义),创建好项目后,补全项目框架结构,创建好的项目框架如下:
搭建好项目结构后,接下来进行jar包依赖的添加,分别是mysql驱动、mybatis依赖、spring-context、spring-Aspect、mybatis-spring(Spring整合mybatis的依赖)spring-jdbc也要添加进去,要不然进行数据源配置时会报错,依赖可以在maven仓库(https://mvnrepository.com)中进行查找,也可以赋值下面代码到pom.xml中进行添加
mysql
mysql-connector-java
5.1.44
org.mybatis
mybatis
3.5.2
org.springframework
spring-aspects
5.3.15
org.springframework
spring-context
5.3.19
org.mybatis
mybatis-spring
2.0.6
org.projectlombok
lombok
1.18.16
provided
log4j
log4j
1.2.17
junit
junit
4.13.2
test
org.springframework
spring-jdbc
5.3.19
这里的数据源我们使用的阿里巴巴旗下的Druid,如果想要其他的数据源,例如c3p0等,可以添加对应的jar包依赖即可,配置方法相同
com.alibaba
druid
1.2.9
外部属性文件中有数据源的相关配置,例如Driver、url、username、password等其他数据源的配置,具体如下:
druid.driver =com.mysql.jdbc.Driver
druid.url = jdbc:mysql://localhost:3306/spring_mybatis
druid.userName = root
druid.password = 990501
#初始化连接数
druid.pool.init=3
#高峰期过后,保留连接吃的个数
druid.pool.minIdle = 5
#高峰期,最大能创建连接的个数
druid.pool.MaxActive = 20
#等待的时间
durid.pool.timeout = 30
在配置数据源之前,我们首先进行注解配置的声明以及使用
加载驱动的时候这里要使用driverClassName,不能使用driver,要不然会报错!
首先需要依赖spring容器进行mybatis的sqlsessionfactory的创建,然后再进行数据源的配置,在配置sqlsessionFactory过程中可以对mapper映射文件进行配置,也可以进行配置需要定义的实体类别名、以及引入mybatis-config.xml(mybatis主配置文件)等操作~
在配置MapperScannerConfigurer中主要是加载dao包中的所有dao接口,通过sqlsessionFactory获取sqlsession,然后创建所有dao接口对象,存储在spring容器
使用spring整合Aop配置,使用spring提供的事务管理切面类,完成dao中的CRUD操作的事务管理。步骤如下:
通过Spring jdbc提供的
事务的隔离级别就是约束两个事物是否可以并行,目的是保证数据的安全性,数据的隔离级别越高,数据的效率越低,具体的使用,要根据场景进行不同的选择,隔离级别有以下四种:
隔离级别的分类: | 可能会造成的影响: |
Serializable(可序化):T1线程在执行过程中,T2线程既不能读也不能写(只能一个一个执行) | 最安全,但是效率是最低的 |
Repeatable read(可重复读):T1线程在执行过程中,T2线程能读但是不能写,T2可以添加数据 | 可能造成“幻读” |
Read Commit(读提交):T1线程在执行过程中,T2可以读也可以写,但是T1只能读取T2提交的数据 | 可能造成“幻读”、“不可重复读” |
Read UnCommit(读未提交):T1线程在执行过程中,T2可以读,也可以学,T1可以读取到T2未提交的数据 | 可能造成“幻读”、“不可重复读”、“脏读” |
事务的传播机制有七种,表示的是线程在执行过程中如何处理事务的,具体如下;
Required:如果上层方法没有事务,则创建一个新的事务;如果有,咋加入该事务。即必须在事务中执行 |
Supports:如果上层方法没有事务,则以非事务方式进行;如果有,咋加入该事务。即非必要在事务中执行 |
Required-new:如果上层方法没有事务,则创建一个新的事务;如果有,则将当前事物挂起。即必须在新事务中执行 |
Not-Supports:以非事务方式运行,如果已经存在事务,则挂起 |
Never:如果上层没有事务,则以非事务方式运行,如果已经存在事务,则抛出异常 |
ManadaTory:如果上层方法已经存在事务,则加入该事务,不存在则抛异常 |
Nested:如果上层没有事务,则创建新事务,如果有则嵌套在当前事务中执行 |
将事务管理策略以Aop配置,应用于Dao层的操作方法(主要是应用于ServiceI方法(ServiceImp)),使用
在配置文件中,配置事务管理类,使用
package com.xgsm.Service.ServiceImp;
import com.xgsm.Dao.UserDao;
import com.xgsm.Service.UserDaoService;
import com.xgsm.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Description: SpringMybatis
* Created by WuHuaSen .
* Created Date: 2022/4/17 17:06
* Version: V1.0
*/
@Service
public class UserDaoServiceImp implements UserDaoService {
@Autowired
private UserDao userDao;
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.SUPPORTS)
public List SelectAllUser() {
return userDao.SelectAllUser();
}
}
Spring整合mybatis已经整合完毕,下面将通过一个实例进行整合测试,有这样一个数据库库,数据库中有两张表(User、ClassRoom),本实例中我们执行的操作是查询User表中的全部信息,进行打印输出,下面是具体的代码:
User实体类 | UserDao层 |
package com.xgsm.pojo; import lombok.*; @Data @ToString @NoArgsConstructor @AllArgsConstructor @Getter @Setter public class User { private int UserId; private String UserName; private String UserPwd; private String UserRealName; private String UserImg; private int ClazzId; } |
package com.xgsm.Dao; import com.xgsm.pojo.User; import java.util.List; /** * Description: SpringMybatis02 * Created by WuHuaSen . * Created Date: 2022/4/19 15:34 * Version: V1.0 */ public interface UserDao { //查询所有学生 public List |
本实例我们实现的service接口,具体代码如下:
UserDaoService 层 | UserDaoServiceImp 层 |
package com.xgsm.Service; import com.xgsm.pojo.User; import java.util.List; public interface UserDaoService { //查询所有学生 public List |
package com.xgsm.Service.ServiceImp; import com.xgsm.Dao.UserDao; import com.xgsm.Service.UserDaoService; import com.xgsm.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class UserDaoServiceImp implements UserDaoService { @Autowired private UserDao userDao; public List |
mapper映射文件代码如下:
user_id,user_name,user_pwd,user_realname,user_img,clazz_id
测试类通过spring来接口获取对象,代码如下:
import com.xgsm.Service.UserDaoService;
import com.xgsm.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class UserDaoTest {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
@Test
public void SelectAllUser() {
UserDaoService userDao = (UserDaoService) context.getBean("userDaoServiceImp");
List users = userDao.SelectAllUser();
for (User i : users
) {
System.out.println(i);
}
}
}
测试结果:
在最后附上数据库文件以便读者进行测试:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`spring_mybatis` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `spring_mybatis`;
/*Table structure for table `classroom` */
DROP TABLE IF EXISTS `classroom`;
CREATE TABLE `classroom` (
`clazz_id` int NOT NULL AUTO_INCREMENT,
`clazz_name` varchar(20) NOT NULL,
PRIMARY KEY (`clazz_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into `classroom`(`clazz_id`,`clazz_name`) values (1,'java1833'),(2,'web1244');
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int NOT NULL AUTO_INCREMENT,
`user_name` varchar(40) NOT NULL,
`user_pwd` varchar(40) NOT NULL,
`user_realname` varchar(40) NOT NULL,
`user_img` varchar(40) NOT NULL,
`clazz_id` int NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `user` */
insert into `user`(`user_id`,`user_name`,`user_pwd`,`user_realname`,`user_img`,`clazz_id`) values (1,'wangwu','111','王五','01.pdf',1),(2,'李四','222','李四','02.pdf',2),(3,'maliu','2355','马六','03.jpg',2),(4,'wangerniu','erere','王二妞','04.jpg',2);
如有不解或疑惑之处,可以给小编进行留言,将第一时间进行解答~~~
THANK YOU~~~~