spring和mybatis的整合

mybatis-spring

若要整合spring和mybatis就須要一個插件即mybatis-spring-x.x.x.jar。具體的安裝以下所示:spring

<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis-spring</artifactId>
   <version>x.x.x</version>
 </dependency>

要和Spring一塊兒使用 MyBatis,還須要在 Spring 應用上下文中定義至少兩樣東西:一個 SqlSessionFactory 和至少一個數據映射器類。sql

SqlSessionFactory

在文件中配置sqlsessionfactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource" />
</bean>

屬性dataSource: SqlSessionFactory 有一個單獨的必須屬性,就是 JDBC 的 DataSource。這能夠是任意 的 DataSource,其配置應該和其它 Spring 數據庫鏈接是同樣的。數據庫

configLocation:它是用來指定MyBatis的XML 配置文件路徑的。 若是基本的 MyBatis 配置須要改變, 那麼這就是一個須要它的地方。 一般這會是<settings> 或<typeAliases>的部分。要注意這個配置文件不須要是一個完整的 MyBatis 配置。確切地說,任意環境,數據源 和 MyBatis 的事務管理器都會被忽略。SqlSessionFactoryBean 會建立它本身的,使用這些 值定製 MyBatis 的 Environment 時是須要的。session

mapperLocations:若是 MyBatis 映射器 XML 文件在和映射器類相同的路徑下不存在,那麼另一個須要配置文件的緣由就是它了。使用這個配置,有兩種選擇。第一是手動在 MyBatis的XML配 置文件中使用<mappers>部分來指定類路徑。第二是使用工廠bean的mapperLocations屬性。mybatis

mapperLocations 屬性使用一個資源位置的 list。 這個屬性能夠用來指定 MyBatis 的 XML 映射器文件的位置。 它的值能夠包含 Ant 樣式來加載一個目錄中全部文件, 或者從基路徑下 遞歸搜索全部路徑。app

事務

一個使用 MyBatis-Spring的主要緣由是它容許MyBatis參與到 Spring 的事務管理中。而不是給 MyBatis建立一個新的特定的事務管理器,MyBatis-Spring 利用了存在於 Spring 中的 DataSourceTransactionManager。插件

一旦 Spring 的 PlatformTransactionManager 配置好了,就能夠在 Spring 中以你一般的作法來配置事務。@Transactional 註解和 AOP樣式的配置都是支持的。在事務處理期間,一個單獨的 SqlSession 對象將會被建立 和使用。當事務完成時,這個 session 會以合適的方式提交或回滾。翻譯

映射器類配置

爲了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 編寫數據訪問對象 (DAO)的代碼,MyBatis-Spring 提供了一個動態代理的實現:MapperFactoryBean。這個類 可讓你直接注入數據映射器接口到你的 service 層 bean 中。當使用映射器時,你僅僅如調 用你的 DAO 同樣調用它們就能夠了,可是你不須要編寫任何 DAO 實現的代碼,由於 MyBatis-Spring 將會爲你建立代理。使用注入的映射器代碼,在 MyBatis,Spring 或 MyBatis-Spring 上面不會有直接的依賴。 代理

MapperFactoryBean 建立的代理控制開放和關閉 session,翻譯任意的異常到 Spring 的DataAccessException 異常中。此外,若是須要或參與到一個已經存在活動事務中,代理將會開啓一個新的Spring事務。code

數據映射器接口能夠按照以下作法加入到 Spring 中:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean 建立的代理類實現了 UserMapper 接口,而且注入到應用程序中。 由於代理建立在運行時環境中,那麼指定的映射器必須是一個接口,而不是一個具體的實現類。

若是UserMapper 有一個對應的MyBatis的XML映射器文件, 若是 XML 文件在類路徑的位置和映射器類相同時,它會被 MapperFactoryBean自動解析。沒有必要在 MyBatis 配置文 件 中 去 指 定 映 射 器 , 除 非 映 射 器 的 XML 文 件 在 不 同 的 類 路 徑 下 。

沒有必要在 Spring 的 XML 配置文件中註冊全部的映射器。相反,你可使用一個MapperScannerConfigurer , 它 將 會 查 找 類 路 徑 下 的 映 射 器 並 自 動 將 它 們 創 建 成MapperFactoryBean。

要建立 MapperScannerConfigurer,能夠在 Spring 的配置中添加以下代碼:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

basePackage 屬性是讓你爲映射器接口文件設置基本的包路徑。 你可使用分號或逗號 做爲分隔符設置多於一個的包路徑。每一個映射器將會在指定的包路徑中遞歸地被搜索到。

注 意 , 沒 有 必 要 去 指 定 SqlSessionFactory 或 SqlSessionTemplate , 因 爲 MapperScannerConfigurer 將會建立 MapperFactoryBean,以後自動裝配。可是,若是你使 用了一個 以上的 DataSource ,那 麼自動 裝配可 能會失效 。這種 狀況下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 屬性來設置正確的 bean 名 稱來使用。這就是它如何來配置的,注意 bean 的名稱是必須的,而不是 bean 的引用,因 此,value 屬性在這裏替代一般的 ref:<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

相關文章
相關標籤/搜索