基本整合方式
Spring框架整合其他框架的本质其实就是把其他框架交给Spring框架管理。Spring框架通过IOC、AOP等机制实现与其他框架的连接,最终建立一个低耦合的应用架构,这大大增强了系统的灵活性,便于功能扩展。
整合思路梳理
MyBatis 框架主要是通过 Sglsession 实例实现对数据的操作,而SqlSession 实例是通过
SqlSessionFactory 创建的,SqlSessionFactory 实例又是由 SqlSessionFactoryBuilder 依据 MyBat.配置文件中的数据源、SQL映射文件等信息构建的,这些对象之间的关系
整合所需的依赖及配置
没有使用Spring框架,所以除原有jar 包外还需要添加 Spring 框架的相关jar 包。Spring框架并没有提供直接整合 MyBatis框架的功能,所以还需要添加一个整合两个框架的关联jar 包。此外,Spring框架还可以提供数据源及事务支持,因此,项目中还需要添加事务及数据源的相关jar 包。、
知识扩展使用 Spring 框架配置数据源时,首先要选择一种具体的数据源实现技术。目前流行的数据源实现技术有 dbcp、c3p0、Proxool等,它们都实现了连接池功能。这里以 dbcp 数据源为例进行讲解,其他数据源的配置方法与dbcp 类似,同学们可以自行查阅相关资料进行学习。dbcp 数据源隶属于 Apache Commons 项目。 知识回顾XML文件中的特殊字符可以使用<![CDATA[]>标签进行处理,也可以使用对象引用来替换,使用“&"替换了“&”。 注意:除数据源和 SQL映射信息外,其他 MyBatis 配置信息也可以转移到 Spring 配置文件中进行维护,只需通过 SqlSessionFactoryBean 的对应属性进行赋值即可。有兴趣的同学们可通过查询相关资料进行学习。 |
映射器整合方式
可以发现在使用 MapperFactoryBean 注入映射器时有以下特点:
- 配置 DAO 组件,class 属性不是某个实现类,而是 MapperFacto1yBean。
- 通过 mapperinterface 属性指定映射器,并且其值只能是接口类型,不能是某个实现类。
- MapperFactoryBean 是SqlSessionDaoSupport 的子类,使用时需要通过 setSqlSessiorFactory()方法注入 SqSessionFactory实例以创建 Sq!SessionTemplate 实例。
- 如果映射器对应的SQL映射文件与映射器的类路径相同,该映射文件可以自动被MapperfactoryBean 解析。
- SOL映射文件中的命名空间和映射器接口的名称需相同,映射元素的id 和映射器接的方法名称应相同。
声明式事务
配置声明式事务
步骤1:导入命名空间
步骤2:定义事务管理器
步骤3:设置事务属性
步骤4:定义事务切面
事务属性说明
事务属性 | 说明 |
propagation | 事务传播机制。该属性可选的值有如下几种。
|
isolation | 事务隔离级别,即当前事务和其他事务的隔离程度,在并发事务处理的悄况下需要考虑它的设置。该属性可选的值有如下几种。
|
timeout | 事务超时时间。允许事务运行的最长时间,以秒(s)为单位,超过给定的时间自动回滚,防止事务执行时间过长而影响系统性能。该属性需要底层的实现支持默认值为-1,表示不超时 |
read-only | 事务是否为只读,默认值为false,对于只执行查询功能的事务,把它设置为true能提高事务处理的性能 |
rollback-for | 设定能够触发回滚的异常类型。Spring框架默认只在抛出RuntimeException 时才标识事务回滚。可以通过全限定类名自行指定需要回滚事务的异常,多个类名用英文逗号隔开 |
no-rollback-for | 设定不触发回滚的异常类型。Spring默认CheckedException不会触发事务回滚。可以通过全限定类名自行指定不需回滚事务的异常,多个类名用逗号隔开 |
使用注解实现声明式事务
@Transactional注解也可以设置事务属性的值,默认的@Transactional 设置如下所示。
- 事务传播特性是 REQUIRED。
- 事务隔离级别是 DEFAULT。
- 事务是读/写。
- 事务超时规则默认是依赖于事务系统的。
- 所有的 RuntimeException 都会触发事务回滚,但是所有的 checkedException 都不会触
发事务回滚。
@Transactional 注解的属性
事务属性 | 类型 | 说明 |
propagation | 枚举类型:Propagation | 可选的传播性设置。使用举例:@Transactional(propagation=PropagatiOn.REQUIRES NEW) |
isolation | 枚举类型:Isolation | 可选的隔离性级别,使用举例:@Transactional(isolation=IsolatiOn.READ COMMITTED) |
timeout | Int型(以s为单位) | 事务超时。使用举例:@Transactional(timeout= 10) |
readOnly | 布尔型 | 是否为只读型事务。使用举例:@Transactional(readOnly=true) |
rollbackFor | 一组 Class 类的实例,必须是Throwable的子类 | 一组异常类,遇到时必须进行回滚使用举例:@Transactional(rollbackFor={SQLException.class}),多个异常可用逗号隔开 |
rollbackForClassName | 一组 class 类的名称,必须是Throwable的子类 | 一组异常类名,遇到时必须进行回滚。使用举例:@Transactional(rollbackForClassName={"SQLException"}),多个异常可用逗号隔开 |
noRollbackFor | 一组 Class 类的实例, | 一组异常类,遇到时必须不回滚 |
必须是Throwable的子类 | ||
noRollbackForClassNa me | 一组 Class 类的名称,必须是 Throwable 的子类 | 一组异常类名,遇到时必须不回滚 |