標籤:spring面試 java spring dao 資料訪問
24 Spring對DAO的支援
Spring對Data Access Objects(DAO)的支援旨在簡化它和資料訪問技術如JDBC,Hibernateor JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常。
- 最佳化了的異常類型體系:細化了資料訪問異常,豐富了異常類型。(都是 Unchecked Exception,這種異常不會變動,採用同一種異常,表示同一種現象,與使用的持久化技術無關)
- 使用模板回調模式,開發人員不再寫入模式化代碼,簡化編程:
不變:資源的擷取,資源的釋放,異常轉化(Spring提供了模板類對此負責)。
變化:SQL,變數,結果集的提取。
25 基於JDBC的DAO(Hibernate類似)
簡化對JDBC的操作
- 模板負責:JDBC對象的擷取釋放,異常類型的轉化。
- 開發負責:提供SQL,設定SQL中的變數,提取ResultSet。
應用
- 核心方法:query() update()
- 回調介面:PreparedStatementCreator、PreparedStatementSetter、ResultSetExtractor、RowMapper
DAO中獲得JdbcTemplate的兩種方式:
- 給DAO注入JdbcTempate:Bean配置:DataSource->JdbcTemplate(需要bean工廠控制)->DAO
- 使DAO類繼承 JdbcDaoSupport:繼承的方法getJdbcTemplate()、Bean配置:DataSource->DAO。
26 Spring+Hibernate訪問資料庫的方式
在Spring中有兩種方式訪問Hibernate:
- 使用HibernateTemplate和Callback。(推薦)
- 繼承HibernateDAOSupport。(不推薦)
- 直接使用SessionFactory(不推薦)
27 通過HibernateDaoSupport將Spring和Hibernate整合
用Spring的SessionFactory調用LocalSessionFactory。整合過程分三步:
- 配置HibernateSessionFactory。
- 繼承HibernateDaoSupport實現一個DAO。
- 在AOP支援的事務中裝配。
28 Spring支援的交易管理類型
Spring支援兩種類型的交易管理:
- 編程式交易管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
- 聲明式交易管理:這意味著你可以將業務代碼和交易管理分離,你只需用註解和XML配置來管理事務。
29 Spring交易管理的優點
- 它為不同的事務API 如JTA,JDBC,Hibernate,JPA和JDO,提供一個不變的編程模式。
- 它為編程式交易管理提供了一套簡單的API而不是一些複雜的事務API。
- 它支援聲明式交易管理。
- 它和Spring各種資料訪問抽象層很好得整合。
30 常用的內建交易管理員實現
- DataSourceTransactionManager:位於org.springframework.jdbc.datasource包中,資料來源交易管理員,提供對單個javax.sql.DataSource交易管理,用於SpringJDBC抽象架構、iBATIS架構的交易管理;
- HibernateTransactionManager:位於org.springframework.orm.hibernate3或者hibernate4包中,提供對單個org.hibernate.SessionFactory事務支援,用於整合Hibernate架構時的交易管理;該交易管理員只支援Hibernate3+版本,且Spring3.0+版本只支援Hibernate3.2+版本;
- JtaTransactionManager:位於org.springframework.transaction.jta包中,提供對分散式交易管理的支援,並將交易管理委託給JavaEE應用伺服器交易管理員;
31 Spring事務的傳播行為(propagation)7個
- required:指定當前方法必需在事務環境中運行,如果當前有事務環境就加入當前正在執行的事務環境,如果當前沒有事務,就建立一個事務。這是預設值。
- supports:指定當前方法加入當前事務環境,如果當前沒有事務,就以非事務方式執行。
- mandatory:指定當前方法必須加入當前事務環境,如果當前沒有事務,就拋出異常。
- requires_new:當前方法總是會為自己發起一個新的事務,如果發現當前方法已運行在一個事務中,則原有事務被掛起,自己建立一個屬於自己的事務,直到自己這個方法commit結束,原先的事務才會恢複執行。
- not_supported:當前方法以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,等以非事務的狀態運行完,再繼續原來的事務。
- never:當前方法絕對不能在事務範圍內執行,如果方法在某個事務範圍內執行,容器就拋異常,只有沒關聯到事務,才正常執行。
- nested:指定當前方法執行時,如果已經有一個事務存在,則運行在這個嵌套的事務中。如果當前環境沒有啟動並執行事務,就建立一個事務,並與父事務相互獨立,這個事務擁有多個可以復原的保證點。就是指我自己內部交易回復不會對外部事務造成影響,只對DataSourceTransactionManager交易管理員起效。
32 Spring事務配置屬性詳解(<tx:method >或@Transactional)
表格3 Spring事務配置選項
屬性 |
類型 |
預設值 |
說明 |
propagation |
Propagation枚舉 |
REQUIRED |
事務傳播屬性 |
isolation |
isolation枚舉 |
DEFAULT(所用資料庫預設層級) |
交易隔離等級 |
readOnly |
boolean |
false |
是否用最佳化的唯讀事務 |
timeout |
int |
-1 |
逾時(秒) |
rollbackFor |
Class[] |
{} |
需要復原的異常類 |
rollbackForClassName |
String[] |
{} |
需要復原的異常類名 |
noRollbackFor |
Class[] |
{} |
不需要復原的異常類 |
noRollbackForClassName |
String[] |
{} |
不需要復原的異常類名 |
http://zhou137520.iteye.com/blog/1675199
Java面試--Spring技術要點--Spring資料訪問