对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. }

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. @Override
  3. public Object doInConnection(Connection conn) throws SQLException {
  4. //可变操作
  5. return null;
  6. }
  7. });

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的方法

时间: 2024-11-05 17:53:54

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

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

下表列出了TensorRT层和每个层支持的精确模式.它还列出了该层在深度学习加速器(DLA)上运行的能力.有关附加约束的更多信息,请参见 DLA Supported Layershttps://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_layers .有关每个TensorRT层的更多信息,请参见TensorRT层.要查看每个层支持的特定属性列表,请参考TensorRT API文档https:/

全球异地多活架构设计(二): 数据层的支持

要做到全球异地多活, 一定要在数据层支持多机房写入, 并且对大多数业务场景提供最终一致性的解决方案.原因如下: 跨洲的网络延迟在100ms的数量级,如果只有单点写, 对于用户体验是种灾难 对于高频操作来说,  如果做强一致性,那么任然受限于网络延迟, 对于用户体验是种灾难 既然决定要选择最终一致性, 那么随之而来就有两个问题需要解决: 跨机房的数据同步 多点写入时的数据冲突处理 一 .数据同步 数据的同步有几个核心问题需要考虑: 1.获取数据变更以及重放 2.不丢不重不乱序 3.避免数据回环同步

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

caffe 每层结构

如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision Layers 1.1 卷积层(Convolution) 类型:CONVOLUTION 例子 layers { name: "conv1" type: CONVOLUTION bottom: "data" top: "conv1" blobs_lr:

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

在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的. 输入:n*c*h*w 输出:n*c*h*w 常用的激活函数有sigmoid, tanh,relu等,下面分别介绍. 1.Sigmoid 对每个输入数据,利用sigmoid函数执行操作.这种层设置比较简单,没有额外的参数. 层类型:Sigmoid 示例: layer { n

【caffe】官网层结构译文

原文网址:http://caffe.berkeleyvision.org/tutorial/layers.html 此为Caffe官网的层讲解部分. 层讲解 要创建一个Caffe模型我们必须要在协议缓冲区(prototxt)先定义一个模型架构.Caffe的层及其参数都被定义在协议缓冲区caffe.proto. 视觉层 头文件:./include/caffe/vision_layers.hpp 通常视觉层将输入图像后会输出其他的图像,在现实世界中.一幅灰度图像有一个色彩通道(c = 1),一个RG

jchdl - 门和开关层(GSL)

第一部分 静态建模:拓扑模型 GSL层拓扑建模相对简单,由线和节点组成: 线连接各个节点: 节点上带有input/output/inout三种类型的接口(Port),供线连接: 一. Port 线与节点接触的地方为接口. 从微观层面看,线和节点连接,实际上为线的接口和节点的接口连接.一根线的两端各有一个接口,节点则根据input/output/inout可以有很多个接口. 二. Wire 线有两个接口,分别处在线的两端. 线是有方向的,输入端的端口为input port,输出端的端口为outpu

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

在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1" top: "pool1" }其中可选参数为:negative_slope:默认为0. 对标准的ReLU函数进行变化,如果设置了这个值,那么数据为负数时,就不再设置为0,而是用原始数据乘以negative_slope relu层有个很大的特点:bottom(输入)和top(输出)一

【Spring】【笔记】《Spring In Action》第5章 数据库处理

5.1 Spring数据访问原理 DAO 数据访问对象(data access object). DAO提供了数据读取和写入到数据库中的一种方式.他们应该以接口的方式发布功能,而应用程序的其他部分就可以通过接口来进行访问了. 实现了松耦合代码 5.1.1 Spring数据访问异常体系 不与特定的持久化方式相关联.这意味着可以使用Spring抛出一致的异常,而不用关心所选择的持久化方案. Spring的数据访问异常: CannotAcquireLockException CannotSeriali