【Spring】(七)MyBatis与Spring整合步骤细解以及配置声明式事务

整合步骤概述

在这里插入图片描述

配置文件中定义的一些类

  • SqlSessionFactoryBean
    • 为整合应用提供SqlSession对象资源
  • SqlSessionTemplate
    • 负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问
  • MapperFactoryBean
    • 根据指定Mapper接口生成Bean实例
  • MapperScannerConfigurer
    • 根据指定包批量扫描Mapper接口并生成实例

使用MapperFactoryBean注入映射器

采用数据映射器(MapperFactoryBean)的方式完成对数据库操作
根据Mapper接口获取Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="cn.smbms.dao.user.UserMapper"/>
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
  • 指定映射器,只能是接口类型
  • 注入SqlSessionFactory以提供SqlSessionTemplate实例
  • 映射器对应的SQL映射文件与映射器的类路径相同,该映射文件可以自动被MapperFactoryBean解析

使用MapperScannerConfigurer注入映射器

若映射器很多的话,相应的配置项也会很多,如何简化配置工作量?

  • 使用MapperScannerConfigurer,自动扫描指定包下的Mapper接口,并将它们直接注册为MapperFactoryBean
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.smbms.dao" />
</bean>
  • 指定扫描的基准包
  • MapperScannerConfigurer递归扫描基准包下所有接口,若它们在SQL映射文件中定义过,则动态注册为MapperFactoryBean,如此即可批量产生映射器实现类

小结

MapperScannerConfigurer@Autowired注解或@Resource注解配合使用,自动创建映射器实现并注入给业务组件,能够最大限度地减少DAO组件与业务组件的编码和配置工作

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired  // 或 @Resource
    private UserMapper userMapper;
    //……代码省略
}
<!-- 省略数据源、 SqlSessionFactoryBean的相关配置 -->
<!-- 配置DAO -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.smbms.dao" />
</bean>
<!-- 配置扫描注解定义的业务Bean -->
<context:component-scan base-package="cn.smbms.service" />

业务层添加声明式事务

如何在添加用户的业务流程中控制事务?

  • 可以采用MyBatis控制事务
    事务应该在业务逻辑层控制
    硬编码方式,代码繁琐,且破坏分层,代码不易维护

  • 可以采用AOP的方式实现
    Spring提供了声明式事务支持

配置声明式事务

配置步骤 :

  1. 导入tx和aop命名空间
  2. 定义事务管理器Bean,并为其注入数据源Bean
  3. 通过<tx:advice>配置事务增强,绑定事务管理器并针对不同方法定义事务规则
  4. 配置切面,将事务增强与方法切入点组合

事务属性

propagation:事务传播机制

  • REQUIRED(默认值)

  • REQUIRES_NEW 、MANDATORY、NESTED

  • SUPPORTS

  • NOT_SUPPORTED、NEVER

REQUIRED能够满足大多数的事务需求可以作为首选的事务传播行为

isolation:事务隔离等级

  • DEFAULT(默认值)
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE

timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时

read-only:事务是否为只读,默认值为false

rollback-for:设定能够触发回滚的异常类型

  • Spring默认只在抛出runtime exception时才标识事务回滚
  • 可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开

no-rollback-for:设定不触发回滚的异常类型

  • Spring默认checked Exception不会触发事务回滚
  • 可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开

使用注解实现事务处理

在Spring配置文件中配置事务管理类,并添加对注解配置的事务的支持

<bean id="txManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

使用@Transactional为方法添加事务支持

@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
 	……
	@Transactional(propagation = Propagation.SUPPORTS)
    public List<User> findUsersWithConditions(User user) {
        // 省略实现代码
    }}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值