Spring框架整合MyBatis框架

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 &amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>

? ? <property name="username" value="root" />

? ? <property name="password" value="123456" />

</bean>

知識回顧:

XML文件中的特殊字符可以使用<![CDATA[]]>標簽進行處理适肠,也可以使用對象引用來替換。示例4中使用“&amp;”替換了“&”候引。

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注解使用,可以使代碼變得清晰簡潔假勿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末借嗽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子转培,更是在濱河造成了極大的恐慌恶导,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浸须,死亡現(xiàn)場離奇詭異惨寿,居然都是意外死亡邦泄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門裂垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顺囊,“玉大人,你說我怎么就攤上這事蕉拢√靥迹” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵企量,是天一觀的道長测萎。 經(jīng)常有香客問我,道長届巩,這世上最難降的妖魔是什么硅瞧? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮恕汇,結(jié)果婚禮上腕唧,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾英,他們只是感情好枣接,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缺谴,像睡著了一般但惶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湿蛔,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天膀曾,我揣著相機與錄音,去河邊找鬼阳啥。 笑死添谊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的察迟。 我是一名探鬼主播斩狱,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扎瓶!你這毒婦竟也來了所踊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤概荷,失蹤者是張志新(化名)和其女友劉穎秕岛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瓣蛀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年陆蟆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋增。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡叠殷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诈皿,到底是詐尸還是另有隱情林束,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布稽亏,位于F島的核電站壶冒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏截歉。R本人自食惡果不足惜胖腾,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘪松。 院中可真熱鬧咸作,春花似錦、人聲如沸宵睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壳嚎。三九已至桐智,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烟馅,已是汗流浹背说庭。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焙糟,地道東北人口渔。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓样屠,卻偏偏與公主長得像穿撮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痪欲,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容