1.1 基本整合方式
Spring框架整合其他框架的本质其实就是把其他框架交给Spring框架管理。Spring框架通过IoC、AOP等机制实现与其他框架的连接,最终建立一个低耦合的应用架构,这大大增强了系统的灵活性,便于功能扩展。
1.1.1 整合思路梳理
MyBatis框架主要是通过SqlSession实例实现对数据的操作,而SqlSession实例是通过SqlSessionFactory创建的,SqlSessionFactory实例又是由SqlSessionFactoryBuilder依据MyBatis配置文件中的数据源、SQL映射文件等信息构建的。
1.1.2 整合所需的依赖及配置
原来的724系统中没有使用Spring框架,所以除原有jar包外还需要添加Spring框架的相关jar包。Spring框架并没有提供直接整合MyBatis框架的功能,所以还需要添加一个整合两个框架的关联jar包。
1.1.3 使用Spring配置文件配置数据源
在Spring配置文件中配置数据源的关键代码如示例1所示。
示例1
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
&characterEncoding=utf8&serverTimezone=Asia/Shanghai]]>
-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=
true &characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
知识回顾:
XML文件中的特殊字符可以使用<![CDATA[]]>标签进行处理,也可以使用对象引用来替换。示例4中使用“&”替换了“&”。
1.1.4 通过Spring配置文件创建SqlSessionFactory
在MyBatis框架中,配置完数据源之后,就可以使用SqlSessionFactoryBuilder创建SqlSessionFactory实例了。而MyBatis-Spring整合包中提供了SqlSessionFactoryBean类来实现同样的功能。SqlSessionFactory中封装了SqlSessionFactoryBuilder创建SqlSessionFactory实例的过程,在Spring配置文件中可以通过配置SqlSessionFactoryBean获取SqlSessionFactory。配置代码如示例2所示。
示例2
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource" />
<!-- 引用MyBatis配置文件中的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 配置SQL映射文件信息 -->
<property name="mapperLocations">
<value>classpath:mapper/**/*.xml
</bean>
1.1.5 通过SqlSessionTemplate操作数据库
MyBatis框架是通过SqlSessionFactory获取操作数据库的SqlSession实例的,而MyBatis-Spring整合包提供了更加简便且强大的SqlSessionTemplate代替SqlSession实现同样功能。SqlSessionTemplate类实际上实现了SqlSession接口。
1.1.6 使用SqlSessionDaoSupport简化编码
除直接使用SqlSessionTemplate获取SqlSession实例处理数据的方式外,MyBatis-Spring还提供了SqlSessionDaoSupport类来简化SqlSessionTemplate的配置和获取方式。其用法如示例3所示。
示例3
SysUserDaoImpl类中的关键代码:
import cn.cvs.pojo.SysUser;
import java.util.List;
import org.mybatis.spring.support.SqlSessionDaoSupport;
/**用户数据层实现*/
public class SysUserMapperImpl extends SqlSessionDaoSupport
implements SysUserMapper {
@Override
publicList<SysUser>selectSysUserLisr(SysUsersysUser){
returnthis.getSqlSession().selectList(
"cn.cvs.dao.sysUser.SysUserMapper.selectSysUserList",
sysUser);
}
}
Spring配置文件中的关键代码:
<!-- 配置DAO -->
<bean id="sysUserMapper" class="com.bdqn.mapper.impl.SysUserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
1.2 映射器整合方式
在7.1节中主要使用SqlSessionTemplate类实现DAO层的相关操作。但是,这种方式不仅需要编写Mapper接口的实现类,还需要使用字符串定义方法的位置,这样不仅代码繁多,还容易出错、不易维护,如果命名空间发生变化,改起来会更麻烦。
1.2.1 使用MapperFactoryBean注入映射器
如果在DAO实现类中没有业务操作,只是使用SqlSessionTemplate类操作数据库的话,则没有必要使用SqlSessionTemplate或SqlSessionDaoSupport实现此类DAO。MyBatis-Spring提供的MapperFactoryBean能够以配置的方式生成映射器的实现类,并注入给业务组件。所以,使用MapperFactoryBean注入映射器时,首先需删除原有的DAO层实现类SysUserMapperImpl,然后修改Spring配置文件。配置文件关键代码如示例4所示。
示例4
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource" />
<!-- 引用MyBatis配置文件中的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 配置SQL映射文件信息 -->
/**
**/
classpath:mapper/*/*.xml
-->
<!-- 配置DAO -->
<bean id="sysUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.bdqn.mapper.SysUserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!-- 省略业务Bean配置 -->
1.2.2 使用MapperScannerConfigurer注入映射器
使用MapperFactoryBean对映射器做配置,在很大程度上简化了DAO模块的编码。不过,如果映射器很多,则相应的配置项也会很多。为了简化配置工作量,MyBatis-Spring中提供了MapperScannerConfigurer的配置方法如示例5所示。
示例5
<!-- 省略数据源配置 -->
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource" />
<!-- 引用MyBatis配置文件中的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 配置DAO -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bdqn.mapper" />
</bean>
1.3 声明式事务
在企业管理系统开发中,事务处理是非常重要的一环,以往我们通过在业务方法中硬编码的方式进行事务控制,这样做的弊端显而易见:事务相关代码分散在业务方法中难以重用;复杂事务的编码难度较高,增加了开发难度等。
1.3.1 配置声明式事务
项目中的增、删、改操作通常需要对事务进行处理。下面以添加用户的功能为例,介绍如何用声明式事务。在Service层和DAO层增加添加用户的功能代码,如示例14所示。
示例6
SysUserMapper类中的关键代码:
/** 保存用户 */
public int add(SysUser sysUser);
SysUserMapper.xml映射文件中的关键代码:
<insert id="add" parameterType="SysUser">
insert into t_sys_user (account,realName,password,sex
,birthday,phone,address,roleId,createdUserId,createdTime)
values (#{account},#{realName},#{password},#{sex},#{birthday}
,#{phone},#{address},#{roleId},#{createdUserId},#{createdTime})
</insert>
SysUserService类中的关键代码:
/** 保存用户 */
public int add(SysUser sysUser);
SysUserServiceImp类中的关键代码:
@Override
public boolean add(SysUser sysUser) {
boolean result =false;
try {
if (sysUserMapper.add(sysUser) ==1) {
result =true;
//测试事务回滚时,打开注释
//throw new RuntimeException();
}
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
return result;
}
1.3.2 使用注解实现声明式事务
除使用配置文件处理事务外,Spring框架还支持注解配合少量配置的方式处理声明式事务,相对于纯配置文件的方式,这种方式所写的代码要简洁很多。使用注解处理事务仍然需要在Spring配置文件中配置文件中配置事务管理类,并开启注解处理事务的功能,代码如示例7所示。
示例7
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">
<tx:annotation-driven />
注意:
示例7中事务管理器的id被定义为transactionMapper,则<tx:annotation-driven/>不需要指定transaction-manager属性的值。
总结
◎ Spring框架整合MyBatis框架后,可以采用Spring框架的事务管理,包括使用XML和注解配置事务管理,注解是@Transactional。
◎ MyBatis-Spring资源包提供了SqlSessionTemplate模板类操作数据库,常用的方法有selectList()、insert()、update()等,使用getMapper(Class<T>Type)方法可以直接访问接口实例,能够减少错误的发生,且可以不用写DAO的实现类。
◎ 使用MapperScannerConfigurer可以递归扫描basePackage所指定的包下的所有接口类,配合@Autowired或@Resource注解使用,可以使代码变得清晰简洁。