Spring 與 MyBatis

將 MyBatis 與 Spring 進行整合,主要解決的問題就是將 SqlSessionFactory 對象交由 Spring 來管理。所以,該整合,只需要將 SqlSessionFactory 的對象生成器SqISessionFactoryBean 注冊在 Spring 容器中,再將其注入給 Dao 的實現(xiàn)類即可完成整合。
下面以兩種方式來實現(xiàn) Spring 與 MyBatis 的整合:
(1)Mapper 動態(tài)代理
(2)支持掃描的Mapper動態(tài)代理

Mapper 動態(tài)代理方式

項目:Spring_MyBatis_1,在Spring_Dao_JdbcTemplate 上修改即可。

  • 導(dǎo)入 Jar 包。
    無論哪種實現(xiàn)方式,均需要首先完成 Jar 包的導(dǎo)入。
    (1)MyBatis 的 Jar 包



    (2)Spring 的 Jar 包



    (3)MyBatis 與 Spring 整合 Jar 包。
    該 Jar 包可以直接在 MyBatis 官網(wǎng)下載。

    (4)其它 Jar 包

    由于程序需要使用 JUnit 進行測試,所以導(dǎo)入 JUnit 的 Jar包。
    由于需要連接 mysql 數(shù)據(jù)庫,所以導(dǎo)入 mysql 驅(qū)動 Jar 包。
    由于連接數(shù)據(jù)庫使用 C3P0 數(shù)據(jù)源,所以導(dǎo)入 C3P0 的 jar包。從 Spring 的支持庫中獲取。

  • 定義映射文件 mapper
    在 Dao 接口的包中創(chuàng)建 MyBatis 的映射文件 mapper,命名與接口名相同,本例為 IStudentDao.xml。mapper 中的 namespace 取值也為 Dao 接口的全限定性名。


  • 定義 MyBatis 住配置文件
    在 src 下定義 MyBatis 的主配置文件,命名為 mybatis.xml。
    這里有兩點需要注意:
    (1)主配置文件中不再需要數(shù)據(jù)源的配置了。因為數(shù)據(jù)源要交給 Spring容器來管理了。
    (2)這里對 mapper 映射文件的注冊,使用<package/>標(biāo)簽, 即只需給出 mapper 映射文件所在的包即可。因為mapper的名稱與Dao接口名相同,可以使用這種簡單注冊方式。這種方式的好處是,若有多個映射文件,這里的配置也是不用改變的。當(dāng)然,也可使用原來的<resource/>標(biāo)簽方式。


  • 添加 log4j 日志控制文件


  • 修改 Spring 配置文件
    A、注冊SqISessionFactoryBean



    B、使用 MapperFactoryBean 生成 Dao 代理對象
    由于使用 Mapper 動態(tài)代理方式?jīng)]有 Dao 實現(xiàn)類,所以 Dao 的實現(xiàn)類對象由代理工廠生成: MapperFactoryBean 映射工廠 Bean。



    C、添加事務(wù)配置
支持掃描的 Mapper 動態(tài)代理

前面的方式在動態(tài)生成代理時存在一個 缺點:MapperFactoryBean 一次只能生成一一個代理對象,即著有多個 dao 接口需要代理對象,則需要配置多個 Mapper 動態(tài)代理對象。這將會使配置文件變得臃腫。



而支持掃描的 Mapper 動態(tài)代理則會避免以上缺點。其會對所配置的基礎(chǔ)包申所有的接口生成 Mapper 動態(tài)代理。
項目: Spring_MyBatis_2。 在項目 Spring_MyBatis_1 上修改。
只需要修改Spring配置文件即可。

  • 定義 Mapper 掃描配置器 MapperScannerConfigurer
    Mapper 掃描配置器 MapperScannerConfigurer 會自動生成指定的基本包中 mapper 的代理對象。該 Bean 無需設(shè)置 id 屬性。
    當(dāng)然,此時需要刪除 MapperFactoryBean 的配置。


  • 向 Service 注入接口名
    向 Service 注入 Mapper 代理對象時需要注意,由于通過 Mapper 掃描配置器 MapperScannerConfigurer 生成的 Mapper 代理對象沒有名稱,所以在向 Service 注入 Mapper 代理時,無法通過名稱注入。但可通過接口的簡單類名注入,因為生成的是這個 Dao 接口的對象,這是多態(tài)的應(yīng)用。.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容