1、Spring 对 DAO的支持

  • Spring支持目前大多数常用的数据持久化技术,Spring定义了一套面向DAO层的异常体系,并未各种支持的持久化技术提供了异常转换器。这样,我们在设计DAO接口时,就可以抛开具体的实现技术,定义统一的接口。

  • 不管采用 何种持久化技术,访问数据的流程是相对固定的。Spring将数据访问流程划分为固定和变化两个部分,并以模板的方式定好流程,用回调接口将变化的部分开放出来,留给开发者自行定义。这样,我们仅需要提供业务相关的逻辑就可以完成整体的数据访问了。

  • Spring为了进一步简化持久模板类的使用,为各个持久化技术提供了便捷的支持类,支持类不但包含数据访问模板,还包含数据源或会话等内容。通过扩展支持类定义自己的数据访问类是最简单的数据访问方式。

  • 不管采用何种持久化技术,都需要定义数据源。在实际部署中,我们可能会采用应用服务器本身提供的数据源,这时,则可以通过JndiObjectFactoryBean或jee命名空间引用JNDI中的数据源。

2、Spring的事务管理

  • Spring使声明式事务平民化,事务作为一个切面织入到目标业务方法的周围,业务方法完全从事务代码中解脱出来,代码的复杂度大大降低。被织入的事务代码基于Spring事务同步管理器进行工作,事务同步管理器维护着业务类对象线程相关资源。DAO类需要利用资源获取工具访问底层数据连接,或者直接建立在相应持久化模板类的基础上。

  • Spring的事务配置主要提供两方面的信息:其一,切点信息,用于定位实施事务切面的业务类方法;其二,控制事务行为的事务属性,这些属性包括事务隔离级别、事务传播行为、超时时间、回滚规则。

3、Spring事务管理难点剖析

  • 在没有事务管理的情况下,DAO照样可以顺利进行数据操作;
    将应用分为Web、Service及DAO层只是一种参考的开发模式,并非是事务管理工作的前提条件;

  • Spring通过事务传播机制可以很好地应对事务方法嵌套调用的情况,开发者无须为了事务管理而可以改变服务方法的设计;

  • 经过事务管理增强的到实例Bean不存在线程安全问题,可以很好地工作在多线程环境下;

  • 混合使用多个数据访问框架的最佳组合是一个ORM技术框架(Hibernate 或 JPA)+ 一个JDBC技术框架(Spring JDBC 或 iBatis)。直接使用ORM技术框架对应的事管理器就行了,但必须考虑ORM缓存同步问题;

  • Spring AOP增强有两个方案:其一是基于接口的动态代理,其二为基于CGLib动态生成子类的代理。由于Java语言的特性,有些特殊方法不能被Spring AOP代理,所以无法享受AOP织入到来的事务增强;

  • 使用Spring JDBC时如果直接使用Connection,可能会造成连接泄漏。为降低连接泄漏的可能性,尽量使用DataSourceUtils获取数据连接。也可以对数据源进行代理,以便数据源拥有感知事务上下文的能力;

4、使用Spring JDBC访问数据库

  • JdbcTemplate 使用大量的回调接口完成数据的访问操作,StatementCallback、PreparedStatementCallback、CallableStatementCallback、BatchPreparedStatementSetter以及RowMapper是其中常用的回调接口,一般可以通过匿名内部类实现这些回调接口,使代码更加紧凑;

5、整合其他ORM框架

  • Sprng为其所支持的ORM框架提供方便易用的FactoryBean用以创建ORM框架的基础设施。Spring通过模板类在不损失框架功能的前提下大大降低了使用这些ORM技术的难度。但也允许用户使用框架原生的API构造DAO,使用原生API时,Spring能保证用户获取到事务绑定的资源,Spring的事务管理机制同样有效;

  • 具体的应用一般会定义一个项目级的DAO基类,简化接口方法、添加泛型支持,一个设计良好的DAO积累可以大大减少DAO层整体代码的总量,提高项目开发效率。

三、Spring——数据访问的更多相关文章

  1. Spring数据访问之JdbcTemplate

    Spring数据访问之JdbcTemplate 使用JdbcTemplate的基本操作步骤 1.引jar包

  2. Spring数据访问和事务

    1.模型 2.解耦 3.实现 3.1 核心接口 3.2 代码分析 3.2.1 事务管理 3.2.2 数据访问 4.使用 4.1 编程模式 4.2 配置模式 4.2.1 声明式配置方式 4.2.2 注解 ...

  3. JS设计模式(三) 数据访问对象模式

    引言 HTML5 提供了两种在客户端存储数据的新方法:localStorage.sessionStorage,他们是Web Storage API 提供的两种存储机制,区别在于前者属于永久性存储,而后 ...

  4. Spring数据访问2 - 通过JDBC访问数据库

    因为原生的jdbc操作太复杂,几乎都是建立连接.关闭连接和处理例外等模板式的代码,Spring对此进行了抽象——使用模板来消除样板式代码 ,JdbcTemplate承担了简化数据库访问这块的任务. 利 ...

  5. Spring数据访问1 - 数据源配置及数据库连接池的概念

    无论你要选择哪种数据访问方式,首先你都需要配置好数据源引用. Spring中配置数据源的几种方式 通过在JDBC驱动程序定义的数据源: 通过JNDI查找的数据源: 连接池的数据源: 对于即将发布到生产 ...

  6. Spring ( 五 )Spring之数据访问与事务管理

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Spring之数据访问 1.Spring数据访问工程环境搭建 ​ jdbc.properties配置 ...

  7. Spring 梳理-数据访问-DB

    针对接口编程 DAO是指数据访问对象(data access object),它提供了数据读取和写入到数据库中的一种方式.Spring认为,它应该以接口的方式发布功能,而应用程序的其他部分需要通过接口 ...

  8. Spring04-SpringEL&Spring JDBC数据访问

    一. SpringEL入门 Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性. 1. 准备工作 ...

  9. 三种数据库访问——Spring JDBC

    本篇随笔是上两篇的延续:三种数据库访问——原生JDBC:数据库连接池:Druid Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要 ...

随机推荐

  1. Cocos Code IDE新建lua工程报错解决方案

    今天想用cocos code IDE新建一个工程,但是控制台报错:Read json file null failed, the reason is:null.我下载的是官方3.5源码,sdk,ndk ...

  2. SPSS数据分析—协方差分析

    我们在实际工作中为了准确的分析问题,经常会收集多个变量,这些变量之前存在相互影响,导致分析的因素混杂,影响分析结果,为了获得准确的实验效应,我们需要控制其中一些影响因变量的变量,这些变量称为就协变量, ...

  3. JS判断form内所有表单是否为空

    function checkForm(){ var input_cart=document.getElementsByTagName("INPUT"); for(var   i=0 ...

  4. C#多线程 线程池

    实例1:直接看看微软提供的代码 using System; using System.Threading; public class Example { public static void Main ...

  5. Linux有用命令

    1.nohup命令 使用方法:nohup ./run.sh 作用:忽略所有挂断(SIGHUP)信号,不挂断地运行命令

  6. 获取LocationProvider

    Android的定位信息由LocationProvider对象来提供,该对象代表一个抽象的定位组件.在开始编程之前,需要先获得LocationProvider对象. 一.获取所有可用的Location ...

  7. C# 反射/映射学习

    反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有) 1 ...

  8. 关于GSM基站定位

    一、基站定位两个参数 1、什么是LAC:Location Area Code(LAC)地区区域码,用来划分区域 2、什么是CellID:Cell Tower ID(Cid)CellID代表一个移动基站 ...

  9. 最简单的一个Oracle定时任务

    最简单的一个Oracle定时任务一.在PLSQL中创建表:create table HWQY.TEST(CARNO     VARCHAR2(30),CARINFOID NUMBER) 二.在PLSQ ...

  10. pull刷新

    package com.example.mylist; import java.util.ArrayList; import java.util.List; import com.example.ad ...