最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java的MyBatis框架中的事務(wù)處理

 更新時間:2016年06月01日 15:20:25   作者:fhd001  
利用MyBatis框架的配置管理比直接使用JDBC API編寫事務(wù)控制要來得更加輕松,這里我們就來詳解Java的MyBatis框架中的事務(wù)處理,尤其是和Spring框架集成后更加exciting

一、MyBatis單獨使用時,使用SqlSession來處理事務(wù):

public class MyBatisTxTest { 
 
  private static SqlSessionFactory sqlSessionFactory; 
  private static Reader reader; 
 
  @BeforeClass 
  public static void setUpBeforeClass() throws Exception { 
    try { 
      reader = Resources.getResourceAsReader("Configuration.xml"); 
      sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 
    } finally { 
      if (reader != null) { 
        reader.close(); 
      } 
    } 
  } 
   
  @Test 
  public void updateUserTxTest() { 
    SqlSession session = sqlSessionFactory.openSession(false); // 打開會話,事務(wù)開始 
     
    try { 
      IUserMapper mapper = session.getMapper(IUserMapper.class); 
      User user = new User(9, "Test transaction"); 
      int affectedCount = mapper.updateUser(user); // 因后面的異常而未執(zhí)行commit語句 
      User user = new User(10, "Test transaction continuously"); 
      int affectedCount2 = mapper.updateUser(user2); // 因后面的異常而未執(zhí)行commit語句 
      int i = 2 / 0; // 觸發(fā)運行時異常 
      session.commit(); // 提交會話,即事務(wù)提交 
    } finally { 
      session.close(); // 關(guān)閉會話,釋放資源 
    } 
  } 
} 


二、和Spring集成后,使用Spring的事務(wù)管理:
一個使用MyBatis-Spring的主要原因是它允許MyBatis參與到Spring的事務(wù)管理中。而不是給MyBatis創(chuàng)建一個新的特定的事務(wù)管理器,MyBatis-Spring利用了存在于Spring中的DataSourceTransactionManager。
一旦DataSourceTransactionManager配置好了,你可以在Spring中以你通常的做法來配置事務(wù)。@Transactional注解和AOP樣式的配置都是支持的。在事務(wù)處理期間,一個單獨的SqlSession對象將會被創(chuàng)建和使用。當事務(wù)完成時,這個session會以合適的方式提交或回滾。
一旦事務(wù)創(chuàng)建之后,MyBatis-Spring將會透明的管理事務(wù)。在你的DAO或Service類中就不需要額外的代碼了。

1.標準配置
要開啟Spring的事務(wù)處理,在Spring的XML配置文件中簡單創(chuàng)建一個DataSourceTransactionManager對象:

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

指定的DataSource一般可以是你使用Spring的任意JDBC DataSource。這包含了連接池和通過JNDI查找獲得的DataSource。
要注意,為事務(wù)管理器指定的DataSource必須和用來創(chuàng)建SqlSessionFactoryBean的是同一個數(shù)據(jù)源,否則事務(wù)管理器就無法工作了。
 
2.容器管理事務(wù)
如果你正使用一個JEE容器而且想讓Spring參與到容器管理事務(wù)中,那么Spring應(yīng)該使用JtaTransactionManager或它的容器指定的子類來配置。做這件事情的最方便的方式是用Spring的事務(wù)命名空間:

<tx:jta-transaction-manager/> 

在這種配置中,MyBatis將會和其它由容器管理事務(wù)配置的Spring事務(wù)資源一樣。Spring會自動使用任意存在的容器事務(wù),在上面附加一個SqlSession。 如果沒有開始事務(wù),或者需要基于事務(wù)配置,Spring會開啟一個新的容器管理事務(wù)。
注意,如果你想使用容器管理事務(wù),而不想使用Spring的事務(wù)管理,你就必須配置SqlSessionFactoryBean來使用基本的MyBatis的ManagedTransactionFactory而不是其它任意的Spring事務(wù)管理器: 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
  <property name="dataSource" ref="dataSource"/> 
  <property name="transactionFactoryClass"> 
    <value>org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/> 
  </property> 
</bean> 

 
3.編程式事務(wù)管理
MyBatis的SqlSession提供指定的方法來處理編程式的事務(wù)。但是當使用MyBatis-Spring時,bean將會使用Spring管理的SqlSession或映射器來注入。那就是說Spring通常是處理事務(wù)的。你不能在Spring管理的SqlSession上調(diào)用SqlSession.commit(),SqlSession.rollback()或SqlSession.close()方法。如果這樣做了,就會拋出UnsupportedOperationException異常。注意在使用注入的映射器時不能訪問那些方法。無論連接是否設(shè)置為自動提交,SqlSession數(shù)據(jù)方法的執(zhí)行或在Spring事務(wù)之外任意調(diào)用映射器方法都將會自動被提交。下面是一個編程式事務(wù)示例:

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

4.@Transactional方式:

在類路徑下創(chuàng)建beans-da-tx.xml文件,在beans-da.xml(系列五)的基礎(chǔ)上加入事務(wù)配置:

<!-- 事務(wù)管理器 --> 
<bean id="txManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 
 
<!-- 事務(wù)注解驅(qū)動,標注@Transactional的類和方法將具有事務(wù)性 --> 
<tx:annotation-driven transaction-manager="txManager" /> 
 
<bean id="userService" class="com.john.hbatis.service.UserService" /> 

服務(wù)類:

@Service("userService") 
public class UserService { 
 
  @Autowired 
  IUserMapper mapper; 
 
  public int batchUpdateUsersWhenException() { // 非事務(wù)性 
    User user = new User(9, "Before exception"); 
    int affectedCount = mapper.updateUser(user); // 執(zhí)行成功 
    User user2 = new User(10, "After exception"); 
    int i = 1 / 0; // 拋出運行時異常 
    int affectedCount2 = mapper.updateUser(user2); // 未執(zhí)行 
    if (affectedCount == 1 && affectedCount2 == 1) { 
      return 1; 
    } 
    return 0; 
  } 
 
  @Transactional 
  public int txUpdateUsersWhenException() { // 事務(wù)性 
    User user = new User(9, "Before exception"); 
    int affectedCount = mapper.updateUser(user); // 因后面的異常而回滾 
    User user2 = new User(10, "After exception"); 
    int i = 1 / 0; // 拋出運行時異常,事務(wù)回滾 
    int affectedCount2 = mapper.updateUser(user2); // 未執(zhí)行 
    if (affectedCount == 1 && affectedCount2 == 1) { 
      return 1; 
    } 
    return 0; 
  } 
} 

在測試類中加入:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:beans-da-tx.xml" }) 
public class SpringIntegrateTxTest { 
 
  @Resource 
  UserService userService; 
 
  @Test 
  public void updateUsersExceptionTest() { 
    userService.batchUpdateUsersWhenException(); 
  } 
 
  @Test 
  public void txUpdateUsersExceptionTest() { 
    userService.txUpdateUsersWhenException(); 
  } 
} 


5.TransactionTemplate方式

在beans-da-tx.xml中添加:

<bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate"> 
  <constructor-arg type="org.springframework.transaction.PlatformTransactionManager" ref="transactionManager" /> 
</bean> 

在UserService類加入:

@Autowired(required = false) 
TransactionTemplate txTemplate; 
 
public int txUpdateUsersWhenExceptionViaTxTemplate() { 
  int retVal = txTemplate.execute(new TransactionCallback<Integer>() { 
 
    @Override 
    public Integer doInTransaction(TransactionStatus status) { // 事務(wù)操作 
      User user = new User(9, "Before exception"); 
      int affectedCount = mapper.updateUser(user); // 因后面的異常而回滾 
      User user2 = new User(10, "After exception"); 
      int i = 1 / 0; // 拋出運行時異常并回滾 
      int affectedCount2 = mapper.updateUser(user2); // 未執(zhí)行 
      if (affectedCount == 1 && affectedCount2 == 1) { 
        return 1; 
      } 
      return 0; 
    } 
     
  }); 
  return retVal; 
} 

在SpringIntegrateTxTest類中加入:

@Test 
public void updateUsersWhenExceptionViaTxTemplateTest() { 
  userService.txUpdateUsersWhenExceptionViaTxTemplate(); //  
} 

注:不可catch Exception或RuntimeException而不拋出:

@Transactional 
public int txUpdateUsersWhenExceptionAndCatch() { // 事務(wù)性操作,但是外圍框架捕獲不到異常,認為執(zhí)行正確而提交。 
  try { 
    User user = new User(9, "Before exception"); 
    int affectedCount = mapper.updateUser(user); // 執(zhí)行成功 
    User user2 = new User(10, "After exception"); 
    int i = 1 / 0; // 拋出運行時異常 
    int affectedCount2 = mapper.updateUser(user2); // 未執(zhí)行 
    if (affectedCount == 1 && affectedCount2 == 1) { 
      return 1; 
    } 
  } catch (Exception e) { // 所有異常被捕獲而未拋出 
    e.printStackTrace(); 
  } 
  return 0; 
} 

相關(guān)文章

  • java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng)(集合版)

    java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng)(集合版)

    這篇文章主要為大家詳細介紹了java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng)的集合版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用

    Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用

    這篇文章主要為大家介紹了Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • springboot將lib和jar分離的操作方法

    springboot將lib和jar分離的操作方法

    本文介紹了如何通過優(yōu)化pom.xml配置來減小Spring Boot項目的jar包大小,主要通過使用spring-boot-maven-plugin和maven-dependency-plugin插件,將依賴庫打包到j(luò)ar中,并通過指定外部lib路徑的方式運行jar,從而減小jar包體積,感興趣的朋友一起看看吧
    2025-02-02
  • Springboot打包代碼,反編譯后代碼混淆方式(防止還原代碼)

    Springboot打包代碼,反編譯后代碼混淆方式(防止還原代碼)

    文章主要介紹了如何對Spring Boot項目進行jar包混淆,以防止反編譯還原原始代碼,通過在項目中添加proguard.cfg文件并配置Maven插件,可以實現(xiàn)代碼混淆,從而增加反編譯的難度
    2024-11-11
  • Java編程在方法中哪些時候需要參數(shù)

    Java編程在方法中哪些時候需要參數(shù)

    這篇文章主要介紹了Java編程在方法中哪些時候需要參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java分頁查詢的幾種實現(xiàn)方法舉例

    Java分頁查詢的幾種實現(xiàn)方法舉例

    這篇文章主要給大家介紹了關(guān)于Java分頁查詢的幾種實現(xiàn)方法,分頁是系統(tǒng)中常用到的功能,只要涉及到查詢必定伴隨而來的就是分頁,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • springboot使用Thymeleaf報錯常見的幾種解決方案

    springboot使用Thymeleaf報錯常見的幾種解決方案

    這篇文章主要介紹了springboot使用Thymeleaf報錯常見的幾種解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Java反射實現(xiàn)Aop代理

    詳解Java反射實現(xiàn)Aop代理

    本篇文章主要介紹了Java 反射實現(xiàn) Aop 代理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷的方法

    Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷的方法

    服務(wù)熔斷是為了保護我們的服務(wù),比如當某個服務(wù)出現(xiàn)問題的時候,控制打向它的流量,讓它有時間去恢復(fù),或者限制一段時間只能有固定數(shù)量的請求打向這個服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷,需要的朋友可以參考下
    2022-12-12

最新評論

金沙县| 塘沽区| 华阴市| 昌江| 梁平县| 岐山县| 鲁甸县| 改则县| 卓尼县| 怀柔区| 和政县| 桃江县| 横峰县| 吕梁市| 镇宁| 潼关县| 灌阳县| 德化县| 遵化市| 峨眉山市| 布拖县| 云浮市| 云梦县| 会理县| 亳州市| 商南县| 永胜县| 集安市| 剑阁县| 滨海县| 南溪县| 正定县| 武清区| 新乡市| 宿迁市| 三穗县| 隆尧县| 永德县| 襄垣县| 石城县| 兴义市|