對SpringDAO層支持的總結


1、問題
1、JDBC/ORM框架(如Hibernate)開發中編程模型有哪些缺點?  如JDBC

 

 
2、解決方案(模板設計模式,本質:將可變的和不可變的分離)
模板方法模式:定義操作的步驟(固定的),將可變的步驟交給子類處理。
Java代碼   收藏代碼
  1. public interface JdbcOperations {  
  2.     //接口定義行為集  
  3.     public Object execute() throws SQLException ;  
  4. }  
 
Java代碼   收藏代碼
  1. public abstract class AbstractJdbcOperations implements JdbcOperations {  
  2.     @Override  
  3.     public final Object execute() throws SQLException {  
  4.        Connection conn = DataSourceUtils.getConnection();  
  5.         try {  
  6.             Object retVal = doInConnection(conn);  
  7.             conn.commit();  
  8.             return retVal;  
  9.         }catch (Exception e) {   conn.rollback(); throw e;}  
  10.         finally {                          conn.close(); }  
  11.     }  
  12.     public abstract Object doInConnection(Connection conn) throws SQLException;  
  13. }   
Java代碼   收藏代碼
  1. public class DataSourceUtils {  
  2.     public static Connection getConnection() {  
  3.         //返回數據庫連接  
  4.         return null;  
  5.     }  
  6. }  
Java代碼   收藏代碼
  1. JdbcOperations select = new AbstractJdbcOperations() {  
  2.          @Override  
  3.           public Object doInConnection(Connection conn) throws SQLException {  
  4.               PreparedStatement pstmt =   
  5.                   conn.prepareStatement("select * from tbl_user");  
  6.               ResultSet rs = pstmt.executeQuery();  
  7.               List result = null;  
  8.               //處理結果集  
  9.               return result;  
  10.           }  
  11.       };  
  12.       select.execute();  
 
 缺點:不夠靈活 
 
3、解決方案(模板設計模式+回調,本質:將可變的和不可變的分離,可變通過回調)
回調(命令):由組件定義,但不由組件調用,而是由系統調用
                      一般用於:可變不可變分離,未知功能。 
Java代碼   收藏代碼
  1. public interface JdbcOprations2 {  
  2.     //接口定義行為集  
  3.     public Object execute(ConnectionCallback callback) throws Exception ;  
  4.   
  5. }  
Java代碼   收藏代碼
  1. public interface ConnectionCallback {  
  2.     public Object doInConnection(Connection conn) throws SQLException;  
  3. }   
Java代碼   收藏代碼
  1. public class JdbcTemplate implements JdbcOprations2 {  
  2.     @Override  
  3.     public Object execute(ConnectionCallback callback) throws Exception {  
  4.         Connection conn = DataSourceUtils.getConnection();  
  5.         try {  
  6.             Object retVal = callback.doInConnection(conn);  
  7.             conn.commit();  
  8.             return retVal;  
  9.         }  
  10.         catch (Exception e) {  
  11.             conn.rollback();  
  12.             throw e;  
  13.         }  
  14.         finally {  
  15.             conn.close();  
  16.         }  
  17.     }      
  18. }   
Java代碼   收藏代碼
  1. jdbcTemplate.execute(new ConnectionCallback() {  
  2.               
  3.             @Override  
  4.             public Object doInConnection(Connection conn) throws SQLException {  
  5.                 //可變操作  
  6.                 return null;  
  7.             }  
  8.         });   
Java代碼   收藏代碼
  1. public interface PreparedStatementCallback {  
  2.     public Object doInPreparedStatement(PreparedStatement pstmt)   
  3.         throws  SQLException;  
  4. }   
缺點:靈活但不通用     
 
4、解決方案(Spring JDBC框架)


 
 JdbcTemplate jdbcTemplate =  new JdbcTemplate(ds);
 
 
5、異常問題
JDBC/ORM框架(如Hibernate)開發中異常處理有哪些缺點? 不一致的異常類,如JDBC是SQLException 而hibernate是HibernateException,等。
缺點:不一致的異常體系,需要了解每個框架的異常含義 ,Spring的一致的異常體系(DataAccessException) 

 
6、DAO訪問問題
訪問JDBC和訪問Hibernate使用完全不同且根本不類似的API?
為了便於以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate,
 
Spring 提供了一套抽象 DAO 類供你擴展。
JdbcDaoSupport - JDBC數據訪問對象的基類。
       需要一個DataSource,同時為子類提供 JdbcTemplate。
HibernateDaoSupport - Hibernate數據訪問對象的基類。
      需要一個SessionFactory,同時為子類提供 HibernateTemplate。
JdoDaoSupport - JDO數據訪問對象的基類。
     需要設置一個PersistenceManagerFactory, 同時為子類提供JdoTemplate。
JpaDaoSupport - JPA數據訪問對象的基類。
    需要一個EntityManagerFactory,同時 為子類提供JpaTemplate。
 
一致的DAO抽象
Callback:定義可變行為,即不可預知行為(命令設計模式)
Template:提供模板支持,簡化開發Support:提供對Template的支持,提供一組簡便方法,並提供獲取Template的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM