將 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)用。.











