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

 
2、解决方案(模板设计模式,本质:将可变的和不可变的分离)
模板方法模式:定义操作的步骤(固定的),将可变的步骤交给子类处理。
  1. public interface JdbcOperations {
  2. //接口定义行为集
  3. public Object execute() throws SQLException ;
  4. }
  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. }
  1. public class DataSourceUtils {
  2. public static Connection getConnection() {
  3. //返回数据库连接
  4. return null;
  5. }
  6. }
  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、解决方案(模板设计模式+回调,本质:将可变的和不可变的分离,可变通过回调)
回调(命令):由组件定义,但不由组件调用,而是由系统调用
                      一般用于:可变不可变分离,未知功能。 
  1. public interface JdbcOprations2 {
  2. //接口定义行为集
  3. public Object execute(ConnectionCallback callback) throws Exception ;
  4. }
  1. public interface ConnectionCallback {
  2. public Object doInConnection(Connection conn) throws SQLException;
  3. }
  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. }
  1. jdbcTemplate.execute(new ConnectionCallback() {
  2. @Override
  3. public Object doInConnection(Connection conn) throws SQLException {
  4. //可变操作
  5. return null;
  6. }
  7. });
  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的方法

对SpringDAO层支持的总结的更多相关文章

  1. TensorRT层和每个层支持的精度模式

    下表列出了TensorRT层和每个层支持的精确模式.它还列出了该层在深度学习加速器(DLA)上运行的能力.有关附加约束的更多信息,请参见 DLA Supported Layershttps://doc ...

  2. [Abp vNext 源码分析] - 5. DDD 的领域层支持(仓储、实体、值对象)

    一.简要介绍 ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体.仓储.值对象.领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都 ...

  3. Caffe学习系列(4):激活层(Activiation Layers)及参数

    在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...

  4. 转 Caffe学习系列(4):激活层(Activiation Layers)及参数

    在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...

  5. caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

    在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1&q ...

  6. caffe 每层结构

    如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...

  7. [转] caffe激活层及参数

    在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...

  8. caffe(4) 激活层(Activation Layers)及参数

    在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...

  9. 『开发技巧』Keras自定义对象(层、评价函数与损失)

    1.自定义层 对于简单.无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现.但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层. 这是一个 Keras2.0  ...

随机推荐

  1. Mysql 中json 相关函数的使用

    1.JSON_LENGTH: select content from test1 ["1","2","3","4",&q ...

  2. 通过Chrome的inspect对手机webview进行调试

    使用chrome的inspect可以对手机上的webview进行调试,因为真机没有什么比较好的调试工具,而chrome提供了这一个工具可以比较方便的查看真机上的元素,以及进行调试. 其实我对webvi ...

  3. 关于"undefined reference"错误

    这个错误换句话说: 链接的时候找不到实现的文件(谨记从这个入手!). 可能导致的原因有: 1. 没有链接库文件,包括静态库或动态库. 2. 链接文件的顺序问题,先后依赖问题,把被依赖的放后面. 3. ...

  4. 浅谈python中的“ ==” 与“ is”

    在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...

  5. Bom对象介绍

    1.windows对象 1.windows对象 1_1.alert:显示一段消息和确认按钮的弹出的警告框 我们平时用的alert的全称就是 window.alert("hahah" ...

  6. 4sum, 4sum closest

    4sum [抄题]: [思维问题]: 以为很复杂,其实是“排序+双指针”的最高阶模板 [一句话思路]: [输入量特别大怎么办]: [画图]: [一刷]: 先排序! if (i > 0 & ...

  7. ROS Learning-008 beginner_Tutorials ROS话题

    ROS Indigo beginner_Tutorials-07 ROS话题 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...

  8. FutureTask详解

    1 基本概念 1.1 Callable与Future Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法.Callable与Runnable类似,但是有返回值.Ca ...

  9. win7安装qt5 纯记录 水文

    去qt官网下载http://www.qt.io/看见download就点进去看看吧 目前的下载地址路径是http://www.qt.io/download-open-source选择Offline I ...

  10. apicloud代码压缩和全局加密

    首先说代码压缩,因为没什么用,就先说它了.代码压缩后,apicloud里面的css和js文件里面的空格呀回车呀都去掉了,就是文件小了,所有代码显示为一行了.这些代码的变量没有重命名,我们知道jquer ...