Spring DAO层的设计思想

近几年持久化技术领域异常喧嚣,各种框架雨后春笋般地冒出,Sun也连接不断地颁布几个持久化规范。Spring对多个持久化技术提供了集成的支持,包括Hibernate、iBatis、JDO、JPA、TopLink,此外,还通过Spring JDBC框架对JDBC API进行简化。Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常,使业务层和具体的持久化技术达到解耦。此外,Spring提供了模板类简化各种持久化技术的使用。通用的异常体系及模板类是Spring整合各种五花八门持久化技术的不二法门,Spring不但借此实现了对多种持久化技术的整合,还可以不费吹灰之力整合潜在的各种持久化框架,体现了“开-闭原则”的经典应用。

Spring的DAO理念

DAO(Data Access Object)是用于访问数据的对象,虽然我们在大多数情况下,将数据保存在数据库中,但这并不是唯一的选择,你也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。

早期,JDBC是访问数据库的主流选择,近几年,数据持久技术获得了长足的发展,Hibernate、iBatis、JPA、JDO成为持久层中争放异彩的实现技术。只要为数据访问定义好DAO接口,并使用具体的技术实现DAO接口的功能,你就可以在不同的实现技术间平滑的切换。

图 1 业务层通过DAO接口访问数据

图 1是一个典型的DAO应用实例,在UserDao中定义访问User数据对象的接口方法,业务层通过UserDao操作数据,并使用具体持久技术实现UserDao接口方法,这样业务层和具体持久化技术就实现了解耦。

提供DAO层的抽象可以带来一些好处,首先,我们可以很容易地构造模拟对象,方便单元测试的开展,其次在使用切面时,我们有更多的选择:既可以使用JDK动态代理也可以使用CGLib动态代理。

Spring本质上希望以统一的方式整合底层的持久化技术:以统一的方式进行调用及事务管理,避免让具体的实现侵入到业务层的代码中。由于每个持久化实现技术都有各自的异常体系,所以Spring提供了统一的异常体系,使不同异常体系的阻抗得以弥消,方便定义出和具体实现技术无关的DAO接口,以及整合到相同的事务管理体系中。

时间: 2024-08-31 08:47:07

Spring DAO层的设计思想的相关文章

关于spring controller层的设计

问题描述 最近在做一个关于相册网站的项目,由于本人经验严重欠缺,需要各位大侠帮助一下.项目是基于Springmvc+ibatis+velocity的.项目大概划分为Dao层.Servic层.Domain层.Controller层等几个大层.比如Service层里有PhotoDao,AlbumDao等.Service层里面有PhotoService.AlbumService等.把各个Dao注入到相应Service层里.各个Controller里注入相应Service.比如说我要上传一张图片,将图片

Spring配置事务在DAO层和业务逻辑层

Spring通过AOP实现声明式事务管理.通常通过TransactionProxyFactoryBean设置Spring事务代理.我们需要一个目标对象包装在事务代理中.这个目标对象一般是一个普通Java对象的bean.当我们定义TransactionProxyFactoryBean时,必须提供一个相关的 PlatformTransactionManager的引用和事务属性. 事务属性含有上面描述的事务定义. PlatformTransactionManager: HibernateTransac

工具类中调用dao层的方法,spring配置如何写

问题描述 工具类中调用dao层的方法,spring配置如何写 private Set readSensitiveWord() { Set set = new HashSet(); List list = sensitiveDao.findSensitive(); if(list.size()>0){ for(Sensitive s : list){ set.add(s); } } return set; } 在这个方法中我要调用dao层的方法findSensitive().sensitiveDa

spring定时器,怎么注入dao层?

问题描述 spring定时器,怎么注入dao层? 用的spring3.0 注解配置的定时器,基本功能(定时访问)能实现,现在想定时访问数据库,该怎么注入dao层呢?? 解决方案 百度半天,实在找不到相关的内容,才来求教... 解决方案二: 定时访问和定时访问数据库这两个有什么区别吗?没看懂 解决方案三: 自己顶...自己顶...自己顶...自己顶 解决方案四: 再定再定再定再定再定再定再定再定再定再定再定再定再定再定再定再定再定再定再定 解决方案五: 求大大求告知................

Junit结合Spring对Dao层进行单元测试

实际开发过程中,写单元测试是非常难的一件事情,其主要原因是代码结构不够好,导致单元测试不好写.特别是Dao层,因为Dao层代码都是与数据库相关的,所以我们在对Dao层代码进行单元测试的时候,不仅仅要考虑我在上篇文章中提到的代码隔离,还要注意单元测试不能带来脏数据.另外,dao层实例依赖spring上下文,我们怎么样来解决这个问题? 看看下面的一个的测试实例: /** * @author lisanlai <br /> * Mail: sanlai_lee@qq.com<br />

Unitils+hibernate+Spring+PostgreSql做dao层测试遇到的错误

这两天看陈雄华的书<Spring3.0企业开发实战>17章做dao层的测试,由于使用postgreSql数据库,所以遇到了不少错误,很多问题百度都没找到答案,所以记录下来给遇到同样错误的童鞋做个参考.下面是我遇到的问题: 1.unitils目前还不支持Hibernate4,所以使用hibernate4的童鞋,要么换hibernate3要么自己用dbUnit做测试. 2.org.unitils.core.UnitilsException: Missing configuration for or

Spring+Hibernate实现的DAO层公共类

此EntityDao接口与EntityDaoImpl实现类,可取代了我们平时写的UserDao,NewsDao,CompanyDao等等,可直接供Service层调用.其中实现类的代码如下: /** * Copyright 2009-1012 the original author or authors. * My Blog site: http://www.blogjava.net/rongxh7 */ package rong.common.dao; import java.io.Seria

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

spring最核心的部分莫过于ioc和aop了,博主菜逼一枚,如果有哪里理解的不对或者代码上有瑕疵的地方欢迎大家指正,大家互相学习,还有就是这只是模仿一下spring思想,只是把事务管理和bean管理简单模仿一下,完全不代表spring,如果想深入理解请看spring源码,下面就开始我们简单的模仿,纯手打,觉得还行就赞一下吧~ 这个项目不是web项目,只是一个简单的java项目,测试用junit,废话不多说了,下面上代码: 项目的目录结构: 说明:图中划红线的部分都是核心部分 红线部分说明: ①

Draw2D--1. 设计思想和相关模式

设计 1.  Draw2d 设计思想 Draw2d是一个宿主在SWT Composite控件中的轻量级的构件(widge)系统.一个Draw2d应用程序由一个 SWT Composite控件, 一个轻量级系统, 以及其内容(figures)组成.Figures是Draw2d的建造块.下面的"Hello World"例子程序演示了如何实现一个最简单的draw2d程序.Listing for "Hello World" import org.eclipse.swt.wi