文章目录
整合步骤概述
配置文件中定义的一些类
使用MapperFactoryBean注入映射器
使用MapperScannerConfigurer注入映射器
小结
业务层添加声明式事务
配置声明式事务
事务属性
使用注解实现事务处理
整合步骤概述
配置文件中定义的一些类
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) { // 省略实现代码 }}