MyBatis与Spring的整合
我们已经学习了MyBatis的基础之上,能够使用MyBatis进行数据库操作。而Spring框架通过IoC,AOP等机制,能够对项目中的组件进行解耦合管理,建立一个低藕合的应用架构,这大大增加了系统开发和维护的灵活性,便于功能扩展。这里我们将利用Spring对MyBatis进行整合,在对组件实现解耦的同事,还能是MyBatis框架的使用便的更加方便和简单。此外,通过Spring提供的声明式事务等服务,能够进一步地简化编码,减少开发工作量,提高开发效率。
Spring对MyBatis的整合思路
作为Bean容器,Spring框架提供了IoC机制,可以接管所有组件的创建工作并进行依赖管理,因而整合的组要工作就是把MyBatis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring来创建和管理。
具体来说,业务逻辑对象依赖基于MyBatis技术实现的DAO对象,核心是获取SqlSession实例要获得SqlSession实例,则需要依赖SqlSessionFactory实例。而SqlSessionFactory是SqlSessionFactoryBuilder依据MyBatis配置文件中的数据源,SQL映射文件等信息来构造的。
针对上述依赖关系,以往我们需要自行编码通过SqlSessionFactoryBuilder读取配置文件,构造SqlSessionFactory,进而获得SqlSession实例,满足业务逻辑对象对于数据访问的需要。随着Spring框架的引入,以上流程将全部移交给Spring,发挥Spring框架Bean容器的作用,接管组件的创建工作,管理组件的生命周期,并对组件之间的依赖关系进行解耦合管理。。
Spring整合MyBatis的准备工作
- 在项目中加入Spring,MyBatis及整合相关的JAR文件
- 建立开发目录结构,创建实体类
- 创建数据访问接口
- 配置SQL映射文件
- 配置MyBatis配置文件
Spring整合MyBatis的整合步骤
配置数据源
对于任何持久化解决方案,数据库连接都是首先要解决的问题。在Spring中,数据源作为一个重要的组件可以单独进行配置和维护。在示例4中,我们将MyBatis配置文件中有关数据源的配置移 余,转移到Spring配置文件中进行维护。
在Spring中配置数据源,首先要选择一种具体的数据源实现技术。目前流行的数据源实现有bcp. c3p0. Proxool等,它们都实现了连接池功能。这里以配置dbcp数据源为例进行讲解,其他数居源的配置方法与此类似,大家可以自行查阅相关资料进行学习。dbcp数据源隶属于Apache Cormmons 页目,使用dbcp数据源,需要下载并在项目中添加cormmons-dbcp-1 .4 jar和commons-po-1.6.jar两个文件。
注入映射器实现
在上面的DAO实现中使用SsnTemolale的方法,都是采用字符串来指定映射项,这种方式比较容易产生错误,如果存在拼写错误,在编译期无法识别,只能等到运行的时候才能发现。而且如果命名空间发生变化,会导致很多地方需要修改.不 易维护。
MyBatis中可以使用Sq|Session的getMapper (Class type)方法 ,根据指定的映射器和映射文件直接生成实现类。这样不必自行编写映射器的实现类,就可以调用映射器的方法进行功能实现。
SqISessionTemplate作为SqlSession接口的实现,自然也具备相同作用的getMapper( )方法实现,
但在集成环境中.直接在代码中使用getMapper()方法并非最佳选择。利用MyBatis–Spring提供的组
件.可以不必每次调用getMapper( )方法.而是通过配置的方式直接为业务对象注入映射器实现,无
需额外的编码。对于不包含其他非MyBatis的工作的数据访问操作,这是首选的做法。
使用MapperScannerConffigurer注入映射器
为业务层添加声明式事务
业务层的职能不仅仅是调用DAO这么简单.事务处理是任何企业级应用开发中不能回避的一-个
重要问题。以往我们通过在业务方法中硬编码的方式进行事务控制,这样做的弊端显而易见:事务
代码分散在业务方法中难以重用,需要调整时工作量也比较大:复杂事务的编码难度较高.增加了
开发难度等。Spring 提供了声明式事务处理机制,它基于AOP实现,无须编写任何事务管理代码.
所有的工作全在配置文件中完成。这意味着与业务代码完全分离,配置即可用.降低了开发和维护
的难度。
配置声明式事务
这里以添加用户的功能为例,介绍如何实现声明式事务处理。
首先在UserMapper和UserMapper.xml中添加相关方法和SQL映射。
在UserMapper 中添加的关键代码:
public int add(User user);
UserMapper.xml中添加的关键代码:
<insert id="add" parameterType="User">
insert into smbms_user (userCode,userName,userPassword,gender,
birthday,phone,address,userRole,createdBy,creationDate)
values (#{userCode},#{userName},#{userPassword},#{gender},
#{birthday},#{phone},#{address},#{userRole},
#{createdBy},#{creationDate})
</insert>
由于使用MapperScannerConfigurer动态创建映射器实现,没有中的一员的接口和实现类,也就没有相关代码需要修改。
在野外组件中添加相应的业务方法如下:
在业务接口中添加的关键代码
public boolean addNewUser(User user);
业务实现类中的方法实现代码:
@Override
public boolean addNewUser(User user) {
boolean result = false;
try {
if (userMapper.add(user) == 1)
result = true;
// int i = 1 / 0;
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
return result;
}
接下来为业务方法配置事务切面,这需要用到tx和aop两个命名空间下的标签,所以首先要在Spring配置文件中导入这两个命名空间。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<--省略具体配置-->
</beans>
接下来需要配置一个事务管理器组件,它提供了对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色。这里使用Spring提供的事务管理器DataSourceTransactionManager,其配置方式如下:
<bean id="txManager"
class="org.springframework.jdbc,datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
与之前接触过的增强处理不同,事务管理器还可以进行进一步的配置,以便更好地适应不同业务方法对于事务的不同要求。
可以通过<tx:advice > 标签配置事务增强,设定事务的属性,为不同的业务方法指定具体的事务规则,代码片段如下:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
在< tx:advice>标签内可以设置id属性和transaction-manager属性。其中 transaction-manager属性引用一个事务管理器Bean。
事务属性
使用注解实现声明式事务处理