天天看點

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

今天是劉小愛自學Java的第125天。

感謝你的觀看,謝謝你。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

今天學習内容安排如下:

  • JdbcTemplate在spring中的配置和使用。
  • Spring的事務管理機制。
  • 寫了一個轉賬案例,并用xml配置事務。

一、Spring的JdbcTemplate配置

1最原始的測試

即不使用spring架構時代碼編寫:

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①配置資料源

無外乎就是資料庫四大參數的設定。

我們以前都是使用C3p0或者德魯伊,這裡使用的是内置的資料源。

②建立jdbcTemplate對象

使用資料庫初始化jdbcTemplate對象,再通過它實作對資料庫的增删改查。

當然上述都是最原始的測試方法,我們現在學了spring架構,看到new這個關鍵字,就要想到spring的使用。

2spring配置資訊

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①資料源的配置

也就是将DriverManagerDataSource交由spring容器管理,同時設定四大參數屬性。

②jdbcTemplate的配置

一樣的道理,以前需要new一個對象,現在都可以在spring中配置成一個bean。

其中該對象需要一個資料源作為參數,是以需要使用到DI依賴注入。

3spring的Junit測試

測試代碼會自動開啟注解掃描,是以就算我們沒有在spring配置檔案中配置也可以使用注解,這個我們昨天就說明過。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

其測試代碼注解都是固定的格式。

  • @RunWith:使用junit整合spring。
  • @ContextConfiguration:指定spring的位置。
  • @Autowired注解:注入需要測試的對象。

運作代碼也能查詢到資料庫中的資料。

3使用德魯伊資料源

我們可以将資料庫四大參數設定到properties配置檔案中,再引入外部檔案即可。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①引入外部檔案

  • property-placeholder:翻譯就是屬性占位符的意思,通過其引入外部檔案。
  • location:說明外部檔案路徑。

②配置德魯伊連接配接池

以${}的格式引入配置檔案中的屬性。

③配置jdbcTemplate對象

将德魯伊連接配接池注入jdbcTemplate對象。

二、Spring的JdbcTemplate使用

使用spring配置後,在dao層中測試使用。

1dao層代碼編寫及配置

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①xml配置

将jdbcTemplate對象注入userDao,如果用注解的話這裡用@Autowired也是可以的。

xml和注解都使用下,加深對它們的了解。

②根據id查詢使用者

無外乎就是增删改查,這裡使用根據id查詢作為例子說明,查詢結果是一個user對象。

2測試方法

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

測試方法中直接使用userDao對象調用方法即可,這裡使用注解@Autowired完成注入。

運作代碼能夠得到對應id的user資料。

3dao層代碼優化

為了友善Dao中注入JdbcTemplate,Spring為每一個持久化技術都提供了支援類。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①JdbcDaoSupport類

繼承Spring架構封裝的JdbcDaoSupport類獲得jdbctemplate對象操作資料庫。

通過getJdbcTemplate方法可以擷取對象。

②注入資料源

在xml檔案中給userDao對象注入資料源後即可擷取jdbctemplate對象了。

為什麼會這樣呢?

我們看下JdbcDaoSupport的源碼:

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

它有一個setDataSource方法,那麼通過注入資料源,即可擷取一個jdbcTemplate對象。

三、Spring的事務管理機制

Spring事務管理高層抽象主要包括3個接口,Spring的事務主要是由他們共同完成的:

1PlatformTransactionManager

事務管理器,主要用于平台相關事務的管理,不要看其名字很長,其實很好記:

  • Platform:平台的意思。
  • Transaction:事務的意思。
  • Manager:管理器的意思。

Spring為不同的持久化架構提供了不同的事務管理器接口實作。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

DataSourceTransactionManager是我們使用的事務管理器,使用Connection控制 :

  • 開啟事務:connection.setAutoCommit(false)
  • 送出事務:connection.commit()
  • 復原事務:connection.rollback()

2TransactionDefinition

事務定義資訊,用來定義事務相關的屬性的,給事務管理器用。

該接口主要提供的方法:

  • getIsolationLevel:隔離級别擷取。
  • getPropagationBehavior:傳播行為擷取。
  • getTimeout:擷取逾時時間。
  • isReadOnly:是否隻讀。

關于隔離級别一共有四種:讀未送出、讀已送出、可重複讀和串行化。

在學事務時的筆記中詳細說明過,不再贅述。

關于傳播行為擷取,主要有三大類:

  • REQUIRED:隻有一個事務(預設,推薦)
  • REQUIRES_NEW:存在兩個事務,如果事務存在,挂起事務,重新開啟一個新事務。
  • NESTED:嵌套事務,事務可以設定儲存點,復原到儲存點,選擇送出或者復原。

3TransactionStatus

事務具體運作狀态,事務管理過程中,每個時間點事務的狀态資訊。

四、xml配置事務管理

上述都是概念性的知識點,比較難記,還是直接用一個轉賬案例說明:

1service層代碼編寫

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

既然是轉賬,那麼要明确三個參數:出錢方是誰?收錢方是誰?錢是多少?

①先将錢轉出

即從出錢方将對應的錢轉出來。

②再将錢轉入

即将轉出的錢轉入給收錢方。

2dao層代碼編寫

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

繼承jdbcDaoSupport這個類,通過父類擷取jdbcTemplat對象,這個前面剛說過

③錢轉入

即将收錢人對應賬戶上的金錢增加,增加的錢數為轉賬的錢數。

④錢轉出

即将收錢人對應賬戶上的金錢減少,減少的數量為轉賬的錢數。

3xml配置事務

我們将上述兩層的對象交給spring容器,但是這樣的代碼是有問題的:轉入和轉出要麼同時成功要麼同時失敗,需要使用事務管理。

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

①配置事務管理器

選擇對應架構的事務管理器即可,并将其交由spring容器管理,同時注入資料源。

②配置事務管理

通過tx:advice标簽配置事務通知,通過屬性transaction-manager說明事務管理器。

其子标簽tx:method,對應了上述TransactionDefinition接口中的四大方法:

  • read-only:對應isReadOnly()。
  • timeout:對應getTimeout()。
  • propagation:對應getPropagationBehavior()。
  • isolation:對應getIsolationLevel()。

③aop的配置

配置切入點,*Service表示以service為結尾的id或name都被攔截。

配置切面,将對應的切入點增加配置的事務通知,即給切入點增加了一個事務功能。

4測試

junit 引入spring 注解管理_spring架構最後一天,學完啦一、Spring的JdbcTemplate配置二、Spring的JdbcTemplate使用三、Spring的事務管理機制四、xml配置事務管理最後

在轉入業務中設定一個運作異常作為測試。

如果沒有配置事務的話:

  • 轉出業務成功,對應賬戶錢減少了。
  • 轉入業務失敗,對應賬戶錢并沒有增加。

如果配置事務了的話,隻要一方失敗了,全部都算失敗,資料并不發生變化。

最後

關于注解,會使用xml了注解就很簡單了,以後有類似需求時使用注解說明,就不專門寫一篇文章了,明天開始學springMVC架構了。

謝謝你的觀看。

如果可以的話,麻煩幫忙點個贊,謝謝你。