Spring整合Mybatis
目的: 1.把Mybatis的核心对象SqlSessionFactory交给Spring管理注入数据源对象
2.把Mybatis的配置中数据源对象,交给Spring管理
3.把Mybatis的Mapper接口的代理对象交给Spring管理注入SqlSessionFactory
4.把事务作为通知,使用AoP技术,动态织入业务层的方法: Spring提供的声明式事务管理
5.把业务层的对象交给spring管理,注入Mapper代理对象
开始创建
1.创建项目: web项目
2添加依赖C3po连接池 数据库驱动,mybatis , spring
改改web.xml
spring依赖统一
orm -> jdbc tx(事务增强管理) 导入一个就可以了
整合jar包
添加配置文件在Resource: log4j的配置,数据源的配置,mybatis主配置
在spring配置文件中配置向相关的bean
之前配置数据源
<Conguration>
<property>....... jdbc url
</Conguration>
现在:
mysql5驱动没有cj
mysql有cj,可以用mysql5那个,但是会有警告,表示已经弃用
测试是否导入成功:
@RunWith 整合
加日志插件
事务的传播行为
当涉及到事务的传播行为时,可以通过一个简单的图示来说明不同的传播行为。
复制代码+---------------------+ +---------------------+ | Method A | | Method B | | | | | | @Transactional | | | | public void a() { | | | | | | | | // 业务逻辑 | | | | | | | | b(); | | | | | | | | // 业务逻辑 | | | | | | | | } | | | | | | | +---------------------+ +---------------------+在上面的图中,有两个方法:Method A 和 Method B。Method A 上使用了 @Transactional 注解,表示该方法是一个事务方法。
接下来,我们将根据不同的传播行为来解释事务在方法调用链中的传播方式。
REQUIRED 传播行为:
复制代码+---------------------+ +---------------------+ | Method A | | Method B | | | | | | @Transactional | | | | public void a() { | | | | | | | | // 业务逻辑 | | | | | | | | >>> b(); | | | | | | | | // 业务逻辑 | | | | | | | | } | | | | | | | +---------------------+ +---------------------+在 REQUIRED 传播行为下,当 Method A 调用 Method B 时,Method B 会加入到 Method A 的事务中,并与 Method A 同步运行。如果 Method A 已经存在事务,那么 Method B 将在该事务中执行;如果 Method A 没有事务,那么 Method B 将开启一个新的事务。
SUPPORTS 传播行为:
复制代码+---------------------+ +---------------------+ | Method A | | Method B | | | | | | @Transactional | | | | public void a() { | | | | | | | | // 业务逻辑 | | | | | | | | >>> b(); | | | | | | | | // 业务逻辑 | | | | | | | | } | | | | | | | +---------------------+ +---------------------+在 SUPPORTS 传播行为下,当 Method A 调用 Method B 时,Method B 会根据当前是否存在事务来决定是否加入到事务中。如果 Method A 存在事务,那么 Method B 也会加入到该事务中;如果 Method A 不存在事务,那么 Method B 将以非事务方式运行。
或者log.debug(dataSource.toString())
配置SqlSessionFactory的Bean的对象
transction:事务
Aliases:别名
记得要有实体类和实体类的包
或者换一种简便的写法
接入别名对应的包
map代理对象交给Spring管理
把之前的导入进来
此时mapper代理对象交给Spring管理
三个bean
跟service业务层整合
1.事务控制 用AOP方式(提供的声明式事务管理)
事务的概念是什么?
事务:同一个事务下,一组SQL要就全部成功,要就全部失败事务:四大特征: AcID 原子性,隔离性,一致性,持久性
事务是加在业务层
Spring事务管理分类: ·编程式的事务管理,手动在业务层方法中,进行事务控制,对代码进行精确事务控制,代码复杂
·声明式事务管理: Spring提供xml/注解进行事务配置,
TransactionDefinition是事务的定义信息对象,事务描述
编程式的事务管理
步骤: 1,开启事务
2,提交事务(正常执行)/回滚事务(产生异常)
3.
配好事务管理器:
业务层:
开启扫描
注解才有用
失败的demo
编程式事务改造:
接口 -> 找找实现类 -> 构造方法
成功提交事务 失败回滚事务
TransactionStatus 事务状态
声明式的事务管理
-
spring-tx提供的事务增强的通知类,只需要进行织入
导入tx的命名空间
配置事务控制类(增强类)
事务的隔离级别?4种
脏数据:没有提交的数据 只是读了,但是没有提交 必须读到对方提交的数据
事务的传播机制/行为?掌握required(增删改) 和 supports(查询用)两种就可以了
REQUIRED:如果当前已经存在一个事务,那么方法将加入到该事务中一起执行;如果当前没有事务,那么方法将开启一个新的事务来执行。
REQUIRES_NEW:无论当前是否存在事务,方法都会开启一个新的事务来执行。如果当前已经存在事务,那么该事务会被挂起,直到新的事务执行完成。
SUPPORTS:如果当前已经存在一个事务,方法将加入到该事务中一起执行;如果当前没有事务,方法将以非事务方式执行
name:代表匹配方式
此时没有织入,只是配置了事务的通知
3.进行与业务层的方法进行织入
配置切入点
此时我们的方法就有事务了 哈哈哈哈哈哈哈
数据库不会改
取消注释之后正常执行
2.业务层的bean交给spring管理
3.整合web层(之前学过)