我对SpringDAO层支持的总结
程序员文章站
2022-04-16 14:33:39
...
之前发过两篇关于Spring的总结帖子 反响还不错,再把剩下的几篇发上来。共享给大家。
我对IoC/DI的理解
我对AOP的理解
1、问题
1、JDBC/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)
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的方法
相关资料
上一篇: c语言的标识符允许使用关键字吗?