我對SpringDAO層支持的總結


之前發過兩篇關於Spring的總結帖子 反響還不錯,再把剩下的幾篇發上來。共享給大家。

 

我對IoC/DI的理解

我對AOP的理解

 

 

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


2、解決方案(模板設計模式,本質:將可變的和不可變的分離)
模板方法模式:定義操作的步驟(固定的),將可變的步驟交給子類處理。
public interface JdbcOperations {
    //接口定義行爲集
    public Object execute() throws SQLException ;
}
 
public abstract class AbstractJdbcOperations implements JdbcOperations {
    @Override
    public final Object execute() throws SQLException {
       Connection conn = DataSourceUtils.getConnection();
        try {
            Object retVal = doInConnection(conn);
            conn.commit();
            return retVal;
        }catch (Exception e) {   conn.rollback(); throw e;}
        finally {                          conn.close(); }
    }
    public abstract Object doInConnection(Connection conn) throws SQLException;
} 
public class DataSourceUtils {
    public static Connection getConnection() {
        //返回數據庫連接
        return null;
    }
}
  JdbcOperations select = new AbstractJdbcOperations() {
           @Override
            public Object doInConnection(Connection conn) throws SQLException {
                PreparedStatement pstmt = 
                    conn.prepareStatement("select * from tbl_user");
                ResultSet rs = pstmt.executeQuery();
                List result = null;
                //處理結果集
                return result;
            }
        };
        select.execute();
 
 缺點:不夠靈活 

3、解決方案(模板設計模式+回調,本質:將可變的和不可變的分離,可變通過回調)
回調(命令):由組件定義,但不由組件調用,而是由系統調用
                      一般用於:可變不可變分離,未知功能。 
public interface JdbcOprations2 {
    //接口定義行爲集
    public Object execute(ConnectionCallback callback) throws Exception ;

}
public interface ConnectionCallback {
    public Object doInConnection(Connection conn) throws SQLException;
} 
public class JdbcTemplate implements JdbcOprations2 {
    @Override
    public Object execute(ConnectionCallback callback) throws Exception {
        Connection conn = DataSourceUtils.getConnection();
        try {
            Object retVal = callback.doInConnection(conn);
            conn.commit();
            return retVal;
        }
        catch (Exception e) {
            conn.rollback();
            throw e;
        }
        finally {
            conn.close();
        }
    }    
} 
jdbcTemplate.execute(new ConnectionCallback() {
            
            @Override
            public Object doInConnection(Connection conn) throws SQLException {
                //可變操作
                return null;
            }
        }); 
public interface PreparedStatementCallback {
    public Object doInPreparedStatement(PreparedStatement pstmt) 
        throws  SQLException;
} 
缺點:靈活但不通用     

4、解決方案(Spring JDBC框架)


 
 JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);


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

 
6DAO訪問問題
訪問JDBC和訪問Hibernate使用完全不同且根本不類似的API
爲了便於以一種一致的方式使用各種數據訪問技術,如JDBCJDOHibernate

Spring提供了一套抽象DAO類供你擴展。
JdbcDaoSupport - JDBC數據訪問對象的基類。
       需要一個DataSource,同時爲子類提供 JdbcTemplate。
HibernateDaoSupport - Hibernate數據訪問對象的基類。
      需要一個SessionFactory,同時爲子類提供 HibernateTemplate。
JdoDaoSupport - JDO數據訪問對象的基類。
     需要設置一個PersistenceManagerFactory, 同時爲子類提供JdoTemplate
JpaDaoSupport - JPA數據訪問對象的基類。
    需要一個EntityManagerFactory,同時 爲子類提供JpaTemplate

一致的DAO抽象
Callback:定義可變行爲,即不可預知行爲(命令設計模式)
Template:提供模板支持,簡化開發Support:提供對Template的支持,提供一組簡便方法,並提供獲取Template的方法

相關資料
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章