1.1? ? 基本整合方式
Spring框架整合其他框架的本質(zhì)其實就是把其他框架交給Spring框架管理。Spring框架通過IoC小作、AOP等機制實現(xiàn)與其他框架的連接,最終建立一個低耦合的應(yīng)用架構(gòu),這大大增強了系統(tǒng)的靈活性甥桂,便于功能擴展走净。
1.1.1? ? 整合思路梳理
MyBatis框架主要是通過SqlSession實例實現(xiàn)對數(shù)據(jù)的操作券时,而SqlSession實例是通過SqlSessionFactory創(chuàng)建的,SqlSessionFactory實例又是由SqlSessionFactoryBuilder依據(jù)MyBatis配置文件中的數(shù)據(jù)源伏伯、SQL映射文件等信息構(gòu)建的橘洞。
1.1.2? ? 整合所需的依賴及配置
原來的724系統(tǒng)中沒有使用Spring框架,所以除原有jar包外還需要添加Spring框架的相關(guān)jar包说搅。Spring框架并沒有提供直接整合MyBatis框架的功能炸枣,所以還需要添加一個整合兩個框架的關(guān)聯(lián)jar包。
1.1.3? ? 使用Spring配置文件配置數(shù)據(jù)源
在Spring配置文件中配置數(shù)據(jù)源的關(guān)鍵代碼如示例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配置文件創(chuàng)建SqlSessionFactory
在MyBatis框架中侯养,配置完數(shù)據(jù)源之后,就可以使用SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory實例了澄干。而MyBatis-Spring整合包中提供了SqlSessionFactoryBean類來實現(xiàn)同樣的功能逛揩。SqlSessionFactory中封裝了SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory實例的過程柠傍,在Spring配置文件中可以通過配置SqlSessionFactoryBean獲取SqlSessionFactory。配置代碼如示例2所示息尺。
示例2
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
? ? <!-- 引用數(shù)據(jù)源組件 -->
? ? <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操作數(shù)據(jù)庫
MyBatis框架是通過SqlSessionFactory獲取操作數(shù)據(jù)庫的SqlSession實例的携兵,而MyBatis-Spring整合包提供了更加簡便且強大的SqlSessionTemplate代替SqlSession實現(xiàn)同樣功能。SqlSessionTemplate類實際上實現(xiàn)了SqlSession接口搂誉。
1.1.6? ? 使用SqlSessionDaoSupport簡化編碼
除直接使用SqlSessionTemplate獲取SqlSession實例處理數(shù)據(jù)的方式外徐紧,MyBatis-Spring還提供了SqlSessionDaoSupport類來簡化SqlSessionTemplate的配置和獲取方式。其用法如示例3所示炭懊。
示例3
SysUserDaoImpl類中的關(guān)鍵代碼:
import cn.cvs.pojo.SysUser;
import java.util.List;
import org.mybatis.spring.support.SqlSessionDaoSupport;
/**用戶數(shù)據(jù)層實現(xiàn)*/
public class SysUserMapperImpl extends SqlSessionDaoSupport
????implements SysUserMapper {
@Override
publicList<SysUser>selectSysUserLisr(SysUsersysUser){
????returnthis.getSqlSession().selectList(
????????"cn.cvs.dao.sysUser.SysUserMapper.selectSysUserList",
????????sysUser);
????}
}
Spring配置文件中的關(guān)鍵代碼:
<!-- 配置DAO -->
<bean id="sysUserMapper" class="com.bdqn.mapper.impl.SysUserMapperImpl">
? ? <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
1.2? ? 映射器整合方式
在7.1節(jié)中主要使用SqlSessionTemplate類實現(xiàn)DAO層的相關(guān)操作并级。但是,這種方式不僅需要編寫Mapper接口的實現(xiàn)類侮腹,還需要使用字符串定義方法的位置嘲碧,這樣不僅代碼繁多,還容易出錯父阻、不易維護愈涩,如果命名空間發(fā)生變化,改起來會更麻煩加矛。
1.2.1? ? 使用MapperFactoryBean注入映射器
如果在DAO實現(xiàn)類中沒有業(yè)務(wù)操作履婉,只是使用SqlSessionTemplate類操作數(shù)據(jù)庫的話,則沒有必要使用SqlSessionTemplate或SqlSessionDaoSupport實現(xiàn)此類DAO斟览。MyBatis-Spring提供的MapperFactoryBean能夠以配置的方式生成映射器的實現(xiàn)類毁腿,并注入給業(yè)務(wù)組件。所以苛茂,使用MapperFactoryBean注入映射器時已烤,首先需刪除原有的DAO層實現(xiàn)類SysUserMapperImpl,然后修改Spring配置文件妓羊。配置文件關(guān)鍵代碼如示例4所示胯究。
示例4
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
? ? <!-- 引用數(shù)據(jù)源組件 -->
? ? <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" />
<!-- 省略業(yè)務(wù)Bean配置 -->
1.2.2? ? 使用MapperScannerConfigurer注入映射器
使用MapperFactoryBean對映射器做配置,在很大程度上簡化了DAO模塊的編碼躁绸。不過唐片,如果映射器很多,則相應(yīng)的配置項也會很多涨颜。為了簡化配置工作量费韭,MyBatis-Spring中提供了MapperScannerConfigurer的配置方法如示例5所示。
示例5
<!-- 省略數(shù)據(jù)源配置 -->
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
? ? <!-- 引用數(shù)據(jù)源組件 -->
? ? <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? ? 聲明式事務(wù)
在企業(yè)管理系統(tǒng)開發(fā)中庭瑰,事務(wù)處理是非常重要的一環(huán)星持,以往我們通過在業(yè)務(wù)方法中硬編碼的方式進行事務(wù)控制,這樣做的弊端顯而易見:事務(wù)相關(guān)代碼分散在業(yè)務(wù)方法中難以重用弹灭;復雜事務(wù)的編碼難度較高督暂,增加了開發(fā)難度等揪垄。
1.3.1? ? 配置聲明式事務(wù)
項目中的增、刪逻翁、改操作通常需要對事務(wù)進行處理饥努。下面以添加用戶的功能為例,介紹如何用聲明式事務(wù)八回。在Service層和DAO層增加添加用戶的功能代碼酷愧,如示例14所示。
示例6
SysUserMapper類中的關(guān)鍵代碼:
/** 保存用戶 */
public int add(SysUser sysUser);
SysUserMapper.xml映射文件中的關(guān)鍵代碼:
<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類中的關(guān)鍵代碼:
/** 保存用戶 */
public int add(SysUser sysUser);
SysUserServiceImp類中的關(guān)鍵代碼:
@Override
public boolean add(SysUser sysUser) {
????boolean result =false;
? ? try {
????????if (sysUserMapper.add(sysUser) ==1) {
? ? ? ? ? ? result =true;
? ? ? ? ? ? //測試事務(wù)回滾時缠诅,打開注釋
? ? ? ? ? ? //throw new RuntimeException();
? ? ? ? }
????} catch (RuntimeException e) {
????????e.printStackTrace();
? ? ? ? throw e;
????}
????return result;
}
1.3.2? ? 使用注解實現(xiàn)聲明式事務(wù)
除使用配置文件處理事務(wù)外溶浴,Spring框架還支持注解配合少量配置的方式處理聲明式事務(wù),相對于純配置文件的方式管引,這種方式所寫的代碼要簡潔很多士败。使用注解處理事務(wù)仍然需要在Spring配置文件中配置文件中配置事務(wù)管理類,并開啟注解處理事務(wù)的功能褥伴,代碼如示例7所示谅将。
示例7
<!-- 定義事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
? ? <property name="dataSource" ref="dataSource">
<tx:annotation-driven />
注意:
示例7中事務(wù)管理器的id被定義為transactionMapper,則<tx:annotation-driven/>不需要指定transaction-manager屬性的值重慢。
總結(jié)
◎? ? Spring框架整合MyBatis框架后饥臂,可以采用Spring框架的事務(wù)管理,包括使用XML和注解配置事務(wù)管理伤锚,注解是@Transactional擅笔。
◎? ? MyBatis-Spring資源包提供了SqlSessionTemplate模板類操作數(shù)據(jù)庫志衣,常用的方法有selectList()屯援、insert()、update()等念脯,使用getMapper(Class<T>Type)方法可以直接訪問接口實例狞洋,能夠減少錯誤的發(fā)生,且可以不用寫DAO的實現(xiàn)類绿店。
◎? ? 使用MapperScannerConfigurer可以遞歸掃描basePackage所指定的包下的所有接口類吉懊,配合@Autowired或@Resource注解使用,可以使代碼變得清晰簡潔假勿。