Spring学习记录4——Spring对DAO的支持
Spring对DAO的支持
随着持久化技术的持续发展,Spring对多个持久化技术提供了集成支持,包括Hibernate、MyBatis、JPA、JDO;此外,还提供了一个简化JDBC API操作的Spring JDBC框架。Spring面向DAO指定了一个通用的异常体系,屏蔽具体持久化技术的异常,使业务层和具体的持久化技术实现解耦。
Spring的DAO理念
DAO(Data Access Object)是用于访问数据的对象,DAO不但屏蔽了数据储存的最终介质的不同,也屏蔽了具体的实现技术的不同。
近几年,各种数据持久化技术得到了长足发展,Hibernate、MyBatis、JPA、JDO成为持久层中常用的实现技术。只要为访问数据定义好DAO接口,并且使用具体技术实现DAO接口的功能,就可以在不同的实现技术间平滑切换。
图中,在UserDao中定义访问User数据对象的接口方法,业务层通过UserDao操作数据,并使用具体的持久化技术实现UserDao接口方法,这样业务层和具体的持久化技术就实现了解耦。

提供DAO层的抽象可以带来一些好处:首先,可以很容易地构造模拟对象,方便单元测试的开展;其次,在使用切面时会有更多选择,既可以用JDK动态代理,又可以使用CGLib动态代理。
Spring本质上希望以统一的方式整合底层的持久化技术,即以统一的方式进行调用及事务管理。由于每种每种持久化技术都有各自的异常体系,所以Spring提供了统一的异常体系,方便定义出和具体实现技术无关的DAO接口,以整合到相同的事务管理体系中。
统一的异常体系:
统一的异常体系是整合不同的持久化技术的关键。Spring提供了一套和实现技术无关的、面向DAO层语义的异常体系,并通过转换器将不同持久化技术的异常转换成Spring的异常。
统一数据访问模板:
在使用JDBC数据访问操作中一般按以下流程进行:
(1)准备资源
(2)启动事务
(3)在事务中执行具体的数据访问操作
(4)提交/回滚事务
(5)关闭资源,处理异常。
按照传统方式,在编写任何带事务的数据访问程序时,都要重复上面的代码,而其中只有加粗的部分是和业务相关的,其他都是重复的内容。
Spring将这个相同的数据访问流程固化到模板类中,并将数据访问中固定和变化的部分分开,同时保证模板线程类是线程安全的,以便多个数据访问线程共享同一个模板实例。这样,只要编写好回调接口,并调用模板类进行数据访问,就可以得到想要的结果:数据访问成功执行,前置和后置的模板化工作也按顺序执行,提高开发效率的同时保证了资源使用的正确性,消除了因忘记释放资源而引起的资源泄露问题。

Spring学习记录4——Spring对DAO的支持的更多相关文章
- Spring学习记录3——Spring AOP
SpringAOP基础 AOP简介: AOP是Aspect Oriented Programing的简称,翻译为“面向切面编程”.它适用于具有横切逻辑的应用场合,如性能检测,访问控制,事务管理及日志记 ...
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
- 我的Spring学习记录(五)
在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- Spring 学习记录3 ConversionService
ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...
- Spring 学习记录8 初识XmlWebApplicationContext(2)
主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...
- Spring 学习记录6 BeanFactory(2)
主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...
- Spring学习1:Spring基本特性
http://longliqiang88.github.io/2015/08/14/Spring%E5%AD%A6%E4%B9%A01%EF%BC%9ASpring%E5%9F%BA%E6%9C%AC ...
- Spring学习记录(九)---通过工厂方法配置bean
1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...
随机推荐
- [转]【转】大型高性能ASP.NET系统架构设计
大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...
- 【js】 vue 2.5.1 源码学习(五) props directives规范化 props 合并策略
大体思路 (四) 上节回顾: A: 对于生命周期函数将父子组件的函数放到一个数组里面,特定时间点调用,保证父子组件函数都调用到. B: 对于directive,filters,components 等 ...
- P1006 输出第二个整数
题目描述 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数.把第二个输入的整数输出. 输入格式 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数. 输出格式 输出输入的三个整数 ...
- VMware虚拟机安装Windows2003操作教程
1.下载好以下三个文件: 2.选择VMware安装包,跟随指令安装好后,打开: 3.选择"创建新的虚拟机"后,选择"安装光盘映像文件(iso)",点击浏览载入. ...
- H3C 802.1X典型配置举例
- vue 父组件中调用子组件函数
2019/06/06 在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数.eg: u ...
- 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之树上倍增)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- java.lang.NoSuchMethodException: com.hgkj.controler.action.UserAction.newsLoginAction()
java.lang.NoSuchMethodException: com.hgkj.controler.action.UserAction.newsLoginAction() 不久前在学习struts ...
- 关于oppo和vivo这两年强势崛起的反思
先来谈谈配置吧(小白跳过) oppo产品线 r7 67522015年05月3g2320mAh r7 p 6795 6153g4100mAh r7s 616 67522015年10月4g 3070mAh ...
- Docker Desktop for Windows Experience
Docker Desktop for Windows Experience: https://github.com/poazy/boazy-learn/blob/master/doc/Docker%2 ...