今天是劉小愛自學Java的第125天。
感謝你的觀看,謝謝你。
今天學習内容安排如下:
- JdbcTemplate在spring中的配置和使用。
- Spring的事務管理機制。
- 寫了一個轉賬案例,并用xml配置事務。
一、Spring的JdbcTemplate配置
1最原始的測試
即不使用spring架構時代碼編寫:
①配置資料源
無外乎就是資料庫四大參數的設定。
我們以前都是使用C3p0或者德魯伊,這裡使用的是内置的資料源。
②建立jdbcTemplate對象
使用資料庫初始化jdbcTemplate對象,再通過它實作對資料庫的增删改查。
當然上述都是最原始的測試方法,我們現在學了spring架構,看到new這個關鍵字,就要想到spring的使用。
2spring配置資訊
①資料源的配置
也就是将DriverManagerDataSource交由spring容器管理,同時設定四大參數屬性。
②jdbcTemplate的配置
一樣的道理,以前需要new一個對象,現在都可以在spring中配置成一個bean。
其中該對象需要一個資料源作為參數,是以需要使用到DI依賴注入。
3spring的Junit測試
測試代碼會自動開啟注解掃描,是以就算我們沒有在spring配置檔案中配置也可以使用注解,這個我們昨天就說明過。
其測試代碼注解都是固定的格式。
- @RunWith:使用junit整合spring。
- @ContextConfiguration:指定spring的位置。
- @Autowired注解:注入需要測試的對象。
運作代碼也能查詢到資料庫中的資料。
3使用德魯伊資料源
我們可以将資料庫四大參數設定到properties配置檔案中,再引入外部檔案即可。
①引入外部檔案
- property-placeholder:翻譯就是屬性占位符的意思,通過其引入外部檔案。
- location:說明外部檔案路徑。
②配置德魯伊連接配接池
以${}的格式引入配置檔案中的屬性。
③配置jdbcTemplate對象
将德魯伊連接配接池注入jdbcTemplate對象。
二、Spring的JdbcTemplate使用
使用spring配置後,在dao層中測試使用。
1dao層代碼編寫及配置
①xml配置
将jdbcTemplate對象注入userDao,如果用注解的話這裡用@Autowired也是可以的。
xml和注解都使用下,加深對它們的了解。
②根據id查詢使用者
無外乎就是增删改查,這裡使用根據id查詢作為例子說明,查詢結果是一個user對象。
2測試方法
測試方法中直接使用userDao對象調用方法即可,這裡使用注解@Autowired完成注入。
運作代碼能夠得到對應id的user資料。
3dao層代碼優化
為了友善Dao中注入JdbcTemplate,Spring為每一個持久化技術都提供了支援類。
①JdbcDaoSupport類
繼承Spring架構封裝的JdbcDaoSupport類獲得jdbctemplate對象操作資料庫。
通過getJdbcTemplate方法可以擷取對象。
②注入資料源
在xml檔案中給userDao對象注入資料源後即可擷取jdbctemplate對象了。
為什麼會這樣呢?
我們看下JdbcDaoSupport的源碼:
它有一個setDataSource方法,那麼通過注入資料源,即可擷取一個jdbcTemplate對象。
三、Spring的事務管理機制
Spring事務管理高層抽象主要包括3個接口,Spring的事務主要是由他們共同完成的:
1PlatformTransactionManager
事務管理器,主要用于平台相關事務的管理,不要看其名字很長,其實很好記:
- Platform:平台的意思。
- Transaction:事務的意思。
- Manager:管理器的意思。
Spring為不同的持久化架構提供了不同的事務管理器接口實作。
DataSourceTransactionManager是我們使用的事務管理器,使用Connection控制 :
- 開啟事務:connection.setAutoCommit(false)
- 送出事務:connection.commit()
- 復原事務:connection.rollback()
2TransactionDefinition
事務定義資訊,用來定義事務相關的屬性的,給事務管理器用。
該接口主要提供的方法:
- getIsolationLevel:隔離級别擷取。
- getPropagationBehavior:傳播行為擷取。
- getTimeout:擷取逾時時間。
- isReadOnly:是否隻讀。
關于隔離級别一共有四種:讀未送出、讀已送出、可重複讀和串行化。
在學事務時的筆記中詳細說明過,不再贅述。
關于傳播行為擷取,主要有三大類:
- REQUIRED:隻有一個事務(預設,推薦)
- REQUIRES_NEW:存在兩個事務,如果事務存在,挂起事務,重新開啟一個新事務。
- NESTED:嵌套事務,事務可以設定儲存點,復原到儲存點,選擇送出或者復原。
3TransactionStatus
事務具體運作狀态,事務管理過程中,每個時間點事務的狀态資訊。
四、xml配置事務管理
上述都是概念性的知識點,比較難記,還是直接用一個轉賬案例說明:
1service層代碼編寫
既然是轉賬,那麼要明确三個參數:出錢方是誰?收錢方是誰?錢是多少?
①先将錢轉出
即從出錢方将對應的錢轉出來。
②再将錢轉入
即将轉出的錢轉入給收錢方。
2dao層代碼編寫
繼承jdbcDaoSupport這個類,通過父類擷取jdbcTemplat對象,這個前面剛說過
③錢轉入
即将收錢人對應賬戶上的金錢增加,增加的錢數為轉賬的錢數。
④錢轉出
即将收錢人對應賬戶上的金錢減少,減少的數量為轉賬的錢數。
3xml配置事務
我們将上述兩層的對象交給spring容器,但是這樣的代碼是有問題的:轉入和轉出要麼同時成功要麼同時失敗,需要使用事務管理。
①配置事務管理器
選擇對應架構的事務管理器即可,并将其交由spring容器管理,同時注入資料源。
②配置事務管理
通過tx:advice标簽配置事務通知,通過屬性transaction-manager說明事務管理器。
其子标簽tx:method,對應了上述TransactionDefinition接口中的四大方法:
- read-only:對應isReadOnly()。
- timeout:對應getTimeout()。
- propagation:對應getPropagationBehavior()。
- isolation:對應getIsolationLevel()。
③aop的配置
配置切入點,*Service表示以service為結尾的id或name都被攔截。
配置切面,将對應的切入點增加配置的事務通知,即給切入點增加了一個事務功能。
4測試
在轉入業務中設定一個運作異常作為測試。
如果沒有配置事務的話:
- 轉出業務成功,對應賬戶錢減少了。
- 轉入業務失敗,對應賬戶錢并沒有增加。
如果配置事務了的話,隻要一方失敗了,全部都算失敗,資料并不發生變化。
最後
關于注解,會使用xml了注解就很簡單了,以後有類似需求時使用注解說明,就不專門寫一篇文章了,明天開始學springMVC架構了。
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。