java-mybaits-009-mybatis-spring-使用,SqlSessionFactoryBean、事務

來源:互聯網
上載者:User

標籤:ring   manager   opera   nbsp   tar   ati   面向切面   選擇   sele   

一、版本限制

參看地址:http://www.mybatis.org/spring/

 二、使用入門2.1、pom
<dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis-spring</artifactId>  <version>x.x.x</version></dependency>
2.2、SqlSessionFactoryBean建立

在 Spring 的 XML 設定檔中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource" /></bean>

要注意 SqlSessionFactory 需要一個 DataSource(資料來源) 。這可以是任意 的 DataSource,配置它就和配置其它 Spring 資料庫連接一樣。

2.3、資料對應器

假設你定義了一個如下的資料 mapper 介面:

public interface UserMapper {  @Select("SELECT * FROM users WHERE id = #{userId}")  User getUser(@Param("userId") String userId);} 

那麼可以使用 MapperFactoryBean,像下面這樣來把介面加入到 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>

注意,所指定的映射器類必須是一個介面,而不是具體的實作類別。在這個樣本中,註解被用來指定 SQL 陳述式,但是 MyBatis 的映射器 XML 檔案也可以用。

一旦配置好,你可以用注入其它任意 Spring 的 bean 相同的方式直接注入映射器到你的 business/service 對象中。MapperFactoryBean 處理 SqlSession 的建立和關閉它。如果使用 了 Spring 的事務,那麼當事務完成時,session 將會提交或復原。最終,任何異常都會被翻 譯成 Spring 的 DataAccessException 異常。

調用 MyBatis 資料方法現在只需一行代碼:

public class FooServiceImpl implements FooService {    private UserMapper userMapper;    public void setUserMapper(UserMapper userMapper) {        this.userMapper = userMapper;    }    public User doSomeBusinessStuff(String userId) {        return this.userMapper.getUser(userId);    }        }
三、SqlSessionFactoryBean

  在基本的 MyBatis 中,session 工廠可以使用 SqlSessionFactoryBuilder 來建立。而在 MyBatis-Spring 中,則使用 SqlSessionFactoryBean 來替代。

3..1、建立

  要建立工廠 bean,放置下面的代碼在 Spring 的 XML 設定檔中: 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource" /></bean>

要注意 SqlSessionFactoryBean 實現了 Spring 的 FactoryBean 介面(請參考 Spring 文 檔的 3.8 章節)這就說明了由 Spring 最終建立的 bean 不是 SqlSessionFactoryBean 本身, 。 而是工廠類的 getObject()返回的方法的結果。這種情況下,Spring 將會在應用啟動時為你 建立 SqlSessionFactory 對象,然後將它以 SqlSessionFactory 為名來儲存。在 Java 中, 相同的代碼是:

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();SqlSessionFactory sessionFactory = factoryBean.getObject();

  在一般的 MyBatis-Spring 用法中, 你不需要直接使用 SqlSessionFactoryBean 或和其對 應的 SqlSessionFactory。相反,session 工廠將會被注入到 MapperFactoryBean 或其它擴 展了 SqlSessionDaoSupport 的 DAO(Data Access Object,Data Access Objects)中

3.2、屬性

SqlSessionFactory 有一個單獨的必須屬性,就是 JDBC 的 DataSource。這可以是任意 的 DataSource,其配置應該和其它 Spring 資料庫連接是一樣的。

一個通用的屬性是 configLocation,它是用來指定 MyBatis 的 XML 設定檔路徑的。 如果基本的 MyBatis 配置需要改變, 那麼這就是一個需要它的地方。 通常這會是<settings> 或<typeAliases>的部分。

要注意這個設定檔不需要是一個完整的 MyBatis 配置。確切地說,任意環境,資料來源 和 MyBatis 的交易管理員都會被忽略。SqlSessionFactoryBean 會建立它自己的,使用這些 值定製 MyBatis 的 Environment 時是需要的。

如果 MyBatis 映射器 XML 檔案在和映射器類相同的路徑下不存在,那麼另外一個需要 設定檔的原因就是它了。使用這個配置,有兩種選擇。第一是手動在 MyBatis 的 XML 配 置檔案中使用<mappers>部分來指定類路徑。第二是使用工廠 bean 的 mapperLocations 屬 性。

mapperLocations 屬性使用一個資源位置的 list。 這個屬性可以用來指定 MyBatis 的 XML 映射器檔案的位置。 它的值可以包含 Ant 樣式來載入一個目錄中所有檔案, 或者從基路徑下 遞迴搜尋所有路徑。比如:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource" />  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /></bean>

這會從類路徑下載入在 sample.config.mappers 包和它的子包中所有的 MyBatis 映射器 XML 檔案。

在容器環境管理事務中,一個可能需要的屬性是 transactionFactoryClass。請參考 第四章(4.2 節)中來查看有關部分。

1.3以後增加了configuration property

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource" />  <property name="configuration">    <bean class="org.apache.ibatis.session.Configuration">      <property name="mapUnderscoreToCamelCase" value="true"/>    </bean>  </property></bean>
四、事務

一個使用 MyBatis-Spring 的主要原因是它允許 MyBatis 參與到 Spring 的交易管理中。而 不是給 MyBatis 建立一個新的特定的交易管理員,MyBatis-Spring 利用了存在於 Spring 中的 DataSourceTransactionManager。

一旦 Spring 的 PlatformTransactionManager 配置好了,你可以在 Spring 中以你通常的做 法來配置事務。@Transactional 註解和 AOP(Aspect-Oriented Program,面向切面編程,譯 者注)樣式的配置都是支援的。在交易處理期間,一個單獨的 SqlSession 對象將會被建立 和使用。當事務完成時,這個 session 會以合適的方式提交或復原。

一旦事務建立之後,MyBatis-Spring 將會透明的管理事務。在你的 DAO 類中就不需要額 外的代碼了。

4.1、標準事務

要 開 啟 Spring 的 事 務 處 理 , 在 Spring 的 XML 配 置 文 件 中 簡 單 創 建 一 個 DataSourceTransactionManager 對象:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="dataSource" /></bean>

指定的 DataSource 一般可以是你使用 Spring 的任意 JDBC DataSource。這包含了串連 池和通過 JNDI 尋找獲得的 DataSource。

要注意, 為交易管理員指定的 DataSource 必須和用來建立 SqlSessionFactoryBean 的 是同一個資料來源,否則交易管理員就無法工作了。

4.2、容器管理事務

  如果你正使用一個 JEE 容器而且想讓 Spring 參與到容器管理事務(Container managed transactions,CMT,譯者注)中,那麼 Spring 應該使用 JtaTransactionManager 或它的容 器指定的子類來配置。做這件事情的最方便的方式是用 Spring 的事務命名空間:

<tx:jta-transaction-manager />

在這種配置中,MyBatis 將會和其它由 CMT 配置的 Spring 事務資源一樣。Spring 會自動 使用任意存在的容器事務,在上面附加一個 SqlSession。如果沒有開始事務,或者需要基 於事務配置,Spring 會開啟一個新的容器管理事務。

注 意 , 如 果 你 想 使 用 CMT , 而 不 想 使 用 Spring 的 事 務 管 理 , 你 就 必 須 配 置 SqlSessionFactoryBean 來使用基本的 MyBatis 的 ManagedTransactionFactory 而不是其 它任意的 Spring 交易管理員:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource" />  <property name="transactionFactory">    <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />  </property>  </bean>
4.3、編程式事務

MyBatis 的 SqlSession 提供指定的方法來處理編程式的事務。 但是當使用 MyBatis-Spring 時, bean 將會使用 Spring 管理的 SqlSession 或映射器來注入。 那就是說 Spring 通常是處理 事務的。

你 不 能 在 Spring 管 理 的 SqlSession 上 調 用 SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 這 樣 做 了 , 就 會 拋 出 UnsupportedOperationException 異常。注意在使用注入的映射器時不能訪問那些方法。

無論 JDBC 串連是否設定為自動認可, SqlSession 資料方法的執行或在 Spring 事務之外 任意調用映射器方法都將會自動被提交。

如果你想編程式地控制事務,請參考 Spring 手冊的 10.6 節。這段代碼展示了如何手動 使用在 10.6.2 章節描述的 PlatformTransactionManager 來處理事務。

DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = txManager.getTransaction(def);try {  userMapper.insertUser(user);}catch (MyException ex) {  txManager.rollback(status);  throw ex;}txManager.commit(status);

注意這段代碼展示了一個映射器,但它也能和 SqlSession 一起使用。

 

java-mybaits-009-mybatis-spring-使用,SqlSessionFactoryBean、事務

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.