MyBatis与Spring的整合

7.1 Spring对MyBatis的整合思路
作为Bean容器,Spring框架提供了IoC机制,可以接管所有组件的创建工作并进行依赖管理,因而整合的主要工作就是把MyBatis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring来创建和管理。
具体来说,业务逻辑对象依赖基于MyBatis技术实现的DAO对象,核心是获取SqlSession实例。要获得SqlSession实例,则需要依赖SqlSessionFactory实例。而SqlSessionFactory是SqlSessionFactoryBuilder依据MyBatis配置文件中的数据源、SQL映射文件等信息来构建的。
针对上述依赖关系,以往我们需要自行编码通过SqlSessionFactoryBuilder读取配置文件、构建SqlSessionFactory,进而获得sqlsession实例,满足业务逻辑对象对于数据访问的需要。随着Spring框架的引入,以上流程将全部移交给spring,发挥spring框架bean容器的作用,接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系进行解耦合管理。
7.2 Spring整合MyBatis的准备工作
1、在项目中加入Spring、MyBatis及整合相关的JAR文件
2、建立开发目录结构,创建实体类
3、创建数据访问接口
4、配置SQL映射文件
5、配置MyBatis配置文件
7.3 实现Spring对MyBatis的整合
7.3.1 配置数据源
需要两个jar文件
Commons-dbcp-1.4.jar
Commons-pool-1.6.jar
7.3.2 配置SqlSessionFactoryBean
逐个列出所有的SQL映射文件比较烦琐,在SqlSessionFactoryBean的配置中可以使用mapperLocations属性扫描式加载SQL映射文件。其中,”classpath:cn/smbms/dao/**/*.xml”

表示扫描cn.smbms.dao包及其任意层级子包中,任意名称的xml类型的文件。
除了数据源和SQL映射信息,其他的MyBatis配置信息也可以转移至Spring配置文件中进行维护,只需通过SqlSessionFactoryBean的对应属性进行赋值即可。
7.3.3 使用SqlSessionTemplate实现数据库的操作
对于MyBatis而言,得到SqlSessionFactory实例,就可以进一步获取SqlSession实例进行数据库操作了。而在集成环境,为了更好地使用SqlSession,充分利用Spring框架提供的服务MyBatis-Spring整合包提供了SqlSessionTemplate类。
SqlSessionTemplate类实现了MyBatis的SqlSession接口,可以替换MyBatis中原有的SqlSession实现类提供数据库访问操作。使用SqlSessionTemplate可以更好地与Spring服务融合并简化部分流程化的工作,可以保证和当前Spring事务相关联,自动管理会话的生命周期,包括必要的关闭、提交和回滚操作。
创建SqlSessionTemplate实例时,需要通过其构造方法注入SqlSessionFactory实例。这里引用的是前文配置过的id为sqlSessionFactory的Bean。
与MyBatis中默认的SqlSession实现不同,SqlSessionTemplate是线程安全的,可以以单例模式配置并被多个DAO对象共用,而不必为每个DAO单独配置一个SqlSessionTemplate实例。
7.3.4 编写业务逻辑代码并测试
利用Spring开和MyBatis-Spring整合资源包提供的组件,能够以配置的方式得到数据源、SqlSessionfactoryBean、SqlSessionTemplate等组件,并在此基础上完成DAO模块和业务模块的开发和装配,简化了开发过程且便于维护。

7.4 注入映射器实现

7.4.1 使用MapperFactoryBean注入映射器
SQL映射文件中须遵循以下命名原则:
映射的命名空间和映射器接口的名称相同。
映射元素的id和映射器接口的方法相同。

1、配置DAO组件userMapper时,class属性不是某个实现类,而是MapperFactoryBean。
2、通过mapperInterface属性指定映射器,而且只能是接口类型,不能是某个实现类。
3、MapperFactoryBean是SqlSessionDaoSupport的子类,需要通过setSqlSessionFactory()方法注入SqlSessionFactory实例以创建SqlSessinTemplate实例。
4、如果映射器对应的SQL映射文件与映射器的类路径相同,该映射文件可以自动被MapperFactoryBean解析。

BasePackage属性中可以包含多个包名,多个包名之间使用逗号或分号隔开。
MapperScannerConfigurer会为所有由它创建的映射器实现开启自动装配。
若环境中出于不同目的配置了多个SqlSessionFactory实例,自动装配将无法进行、此时应显式指定所依赖的SqlSessionFactory实例。



7.5 为业务添加声明式事务
7.5.1 配置声明式事务
tx:method标签中的name属性是必需的,用于指定匹配的方法,这里需要对方法名进行约定,可以使用通配符(*)。其他属性均为可选,用于指定具体的事物规则。
Propagetion:事务传播机制。
REQUIRED:默认值,表示如果存在一个事务,则支持当前事务;如果当前没有事务,则开启一个新的事务。
REQUIRES_NEW:表示总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起,开启新事务执行该方法。
MANDATORY:表示如果存在一个事务,则支持当前事务;如果当前没有一个活动的事务,则抛出异常。
NESTED:表示如果当前存在一个活动的事务,则创建一个事务作为当前事务的嵌套事务运行,如果没有当前事务,该取值与REQUIRED相同。
SUPPORTS:表示如果存在一个事务,则支持当前事务;如果当前没有事务,则按非事务方式存在。
NOT_SUPPORTED:表示总是以非事务方式执行。如果一个事务已经存在,则将这个存在的事务挂起,然后执行该方法。
NEVER:表示总是是以非事务方式执行。如果当前存在一个活动的事务,则抛出异常。
REQUIRED能够满足大多数的事务需求,可以作为首选的事务传播行为。

Isolation:事务隔离等级。即当前事务和其他事务的隔离程度,在并发事务处理的情况下需要考虑它的设置。
DEFAULT:默认值,表示使用数据库默认的事务隔离级别。
READ_UNCOMMITTED:未提交读。
READ_COMMITTED:提交读。
REPEATABLE_READ:可重复读。
SERIALIZABLE:串行读。
Timeout:事务超过时间。允许事务运行的最长时间,以秒为单位,超过给定的时间自动回滚,防止事务执行时间过长而影响系统性能。该属性需要底层的实现支持。默认值为-1,表示不超时。
Read-only:事务是否为只读,默认值为false,对于只执行查询功能的事务,把它设置为true能提供事务处理的性能。
Rollback-for:设定能够触发回滚的异常类型。Spring默认只在抛出RuntimeException时才标识事务回滚,可以通过全限定类名自行指定需要回滚事务的异常,多个类名用英文逗号隔开。
No-rollback-for:设定不触发回滚的异常类型,Spring默认checked Exception不会触发事务回滚。可以通过全限定类名自行指定不需回滚事务的异常,多个类名用英文逗号隔开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值