文章目录
整合步骤概述
配置文件中定义的一些类
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提供了声明式事务支持
配置声明式事务
配置步骤 :
- 导入tx和aop命名空间
- 定义事务管理器Bean,并为其注入数据源Bean
- 通过
<tx:advice>
配置事务增强,绑定事务管理器并针对不同方法定义事务规则 - 配置切面,将事务增强与方法切入点组合
事务属性
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) {
// 省略实现代码
}}