欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我对SpringDAO层支持的总结

程序员文章站 2022-05-03 17:10:58
...


之前发过两篇关于Spring的总结帖子 反响还不错,再把剩下的几篇发上来。共享给大家。

 

我对IoC/DI的理解

我对AOP的理解

 

 

1、问题
1JDBC/ORM框架(如Hibernate)开发中编程模型有哪些缺点?  如JDBC

我对SpringDAO层支持的总结
            
    
    博客分类: spring杂谈  

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框架)

我对SpringDAO层支持的总结
            
    
    博客分类: spring杂谈  
 
 JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);


5、异常问题
JDBC/ORM框架(如Hibernate)开发中异常处理有哪些缺点? 不一致的异常类,如JDBC是SQLException 而hibernate是HibernateException,等。
缺点:不一致的异常体系,需要了解每个框架的异常含义 ,Spring的一致的异常体系(DataAccessException) 
我对SpringDAO层支持的总结
            
    
    博客分类: spring杂谈  
 
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的方法

相关资料