- 浏览: 745712 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lengzl:
请问,那个Node 是哪个包里面的类?
JAVA 二叉树的递归和非递归遍历 -
gongchuangsu:
总结的很好,感谢感谢
JAVA 二叉树的递归和非递归遍历 -
Caelebs:
666666666 居然是10年发的,难怪截屏自动保存的名字是 ...
截图工具 -
jijiqw:
是注解不是注释。。。
Spring @Transactional (一) -
letueo:
[b][b][b][b][b][b][b][b][b][b][ ...
Spring @Transactional (一)
概述
【IT168 专稿】近几年持久化技术领域异常喧嚣,各种框架雨后春笋般地冒出,Sun也连接不断地颁布几个持久化规范。Spring对多个持久化技术提供了集成的支持,包括 Hibernate、iBatis、JDO、JPA、TopLink,此外,还通过Spring JDBC框架对JDBC API进行简化。Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常,使业务层和具体的持久化技术达到解耦。此外,Spring 提供了模板类简化各种持久化技术的使用。通用的异常体系及模板类是Spring整合各种五花八门持久化技术的不二法门,Spring不但借此实现了对多种持久化技术的整合,还可以不费吹灰之力整合潜在的各种持久化框架,体现了“开-闭原则”的经典应用。
Spring的DAO理念
DAO(Data Access Object)是用于访问数据的对象,虽然我们在大多数情况下,将数据保存在数据库中,但这并不是唯一的选择,你也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。 " G# A) J, F/ J+ q* f1 V& O" z( M
早期,JDBC是访问数据库的主流选择,近几年,数据持久技术获得了长足的发展,Hibernate、iBatis、JPA、JDO成为持久层中争放异彩的实现技术。只要为数据访问定义好DAO接口,并使用具体的技术实现DAO接口的功能,你就可以在不同的实现技术间平滑的切换。
图 1 业务层通过DAO接口访问数据
图 1是一个典型的DAO应用实例,在UserDao中定义访问User数据对象的接口方法,业务层通过UserDao操作数据,并使用具体持久技术实现UserDao接口方法,这样业务层和具体持久化技术就实现了解耦。
提供DAO层的抽象可以带来一些好处,首先,我们可以很容易地构造模拟对象,方便单元测试的开展,其次在使用切面时,我们有更多的选择:既可以使用JDK动态代理也可以使用CGLib动态代理。
Spring本质上希望以统一的方式整合底层的持久化技术:以统一的方式进行调用及事务管理,避免让具体的实现侵入到业务层的代码中。由于每个持久化实现技术都有各自的异常体系,所以Spring提供了统一的异常体系,使不同异常体系的阻抗得以弥消,方便定义出和具体实现技术无关的DAO接口,以及整合到相同的事务管理体系中。
统一的异常体系
, A$ r( k( `" C4 X, J7 ]5 D$ F 统一的异常体系是整合不同的持久化实现技术的关键,Spring提供了一套和实现技术无关的、面向于DAO层次语义的异常体系,并通过转换器将不同的持久化技术异常转换成Spring的异常。 # O, R' O6 E8 h- \1 ?; o
; D' X" [6 n% o3 P4 [ Spring的DAO异常体系
" [9 y7 t3 ^7 R( b4 B: U 在很多正统API或框架中,检查型异常被过多的使用,以至在使用API时,代码里充斥着大量的try/catch样板式的代码。在很多情况下,除了在 try/catch中记录异常信息以外,我们并没有做多少实质性的工作。引发异常的问题往往是不可恢复的,如数据连接失败,SQL语句存在语法错误,强制捕捉的检查型异常除了限制开发人员的自由度以外,并没有提供什么有意义的作用。因此,Spring的异常体系都是建立在运行期异常的基础上,开发者可以根据需要捕捉感兴趣的异常。 0 J" Z7 \! S; h- x
9 y0 w! A6 Z3 M$ |$ u" z: V1 [# D. D JDK很多API之所以难用,一个很大的原因就是检查型异常的泛滥,如JavaMail、EJB以及JDBC等等,使用这些API,一堆堆异常处理的代码喧宾夺主式地侵入业务代码中,破坏了代码的整洁和优雅。 % R. u9 D" w8 F/ e
! _) H P. j J: Y+ R Spring在org.springframework.dao包中提供了一套完备优雅的DAO异常体系,这些异常都继承于 DataAccessException,而DataAccessException本身又继承于 NestedRuntimeException,NestedRuntimeException异常以嵌套的方式封装了源异常。因为虽然不同持久化技术的特定异常被转换到Spring的DAO异常体系中,原始的异常信息并不会丢失,只要你愿意,就可以方便地通过getCause()方法获取原始的异常信息。 q6 w% t+ `1 |7 g+ C: _
9 `* B- l2 D* h. i Spring的DAO异常体系并不和具体的实现技术相关,它从DAO概念的抽象层面定义了异常的目录树。在所有的持久化框架中,我们并没有发现拥有如此丰富语义异常体系的框架,Spring这种设计无疑是独具匠心的,它使得开发人员关注某一特定语义的异常变得容易。在JDBC中的SQLException 中,你必须通过异常的getErrorCode()或getSQLState()获取错误代码,直接根据这些代码判断是错误的类型,这种过于底层的API 不但带来了代码编写上的难度,而且也使代码的移植变得困难,因为getErrorCode()是数据库相关的。
% @! \( m/ W6 {" {& J$ @- t0 A
A3 c7 r- M5 s Spring以分类手法建立了异常分类目录,对于大部分应用来说,这个异常分类目录对异常类型的划分具有适当的颗粒度。一方面,使开发者从底层细如针麻的技术细节中脱身出来,另一方面,可以从这个语义丰富的异常体系中选择感兴趣的异常加以处理。图 2列出了那些位于Spring DAO异常体系第一层次的异常类,每个异常类下还可能拥有众多的子异常
【IT168 专稿】近几年持久化技术领域异常喧嚣,各种框架雨后春笋般地冒出,Sun也连接不断地颁布几个持久化规范。Spring对多个持久化技术提供了集成的支持,包括 Hibernate、iBatis、JDO、JPA、TopLink,此外,还通过Spring JDBC框架对JDBC API进行简化。Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常,使业务层和具体的持久化技术达到解耦。此外,Spring 提供了模板类简化各种持久化技术的使用。通用的异常体系及模板类是Spring整合各种五花八门持久化技术的不二法门,Spring不但借此实现了对多种持久化技术的整合,还可以不费吹灰之力整合潜在的各种持久化框架,体现了“开-闭原则”的经典应用。
Spring的DAO理念
DAO(Data Access Object)是用于访问数据的对象,虽然我们在大多数情况下,将数据保存在数据库中,但这并不是唯一的选择,你也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。 " G# A) J, F/ J+ q* f1 V& O" z( M
早期,JDBC是访问数据库的主流选择,近几年,数据持久技术获得了长足的发展,Hibernate、iBatis、JPA、JDO成为持久层中争放异彩的实现技术。只要为数据访问定义好DAO接口,并使用具体的技术实现DAO接口的功能,你就可以在不同的实现技术间平滑的切换。
图 1 业务层通过DAO接口访问数据
图 1是一个典型的DAO应用实例,在UserDao中定义访问User数据对象的接口方法,业务层通过UserDao操作数据,并使用具体持久技术实现UserDao接口方法,这样业务层和具体持久化技术就实现了解耦。
提供DAO层的抽象可以带来一些好处,首先,我们可以很容易地构造模拟对象,方便单元测试的开展,其次在使用切面时,我们有更多的选择:既可以使用JDK动态代理也可以使用CGLib动态代理。
Spring本质上希望以统一的方式整合底层的持久化技术:以统一的方式进行调用及事务管理,避免让具体的实现侵入到业务层的代码中。由于每个持久化实现技术都有各自的异常体系,所以Spring提供了统一的异常体系,使不同异常体系的阻抗得以弥消,方便定义出和具体实现技术无关的DAO接口,以及整合到相同的事务管理体系中。
统一的异常体系
, A$ r( k( `" C4 X, J7 ]5 D$ F 统一的异常体系是整合不同的持久化实现技术的关键,Spring提供了一套和实现技术无关的、面向于DAO层次语义的异常体系,并通过转换器将不同的持久化技术异常转换成Spring的异常。 # O, R' O6 E8 h- \1 ?; o
; D' X" [6 n% o3 P4 [ Spring的DAO异常体系
" [9 y7 t3 ^7 R( b4 B: U 在很多正统API或框架中,检查型异常被过多的使用,以至在使用API时,代码里充斥着大量的try/catch样板式的代码。在很多情况下,除了在 try/catch中记录异常信息以外,我们并没有做多少实质性的工作。引发异常的问题往往是不可恢复的,如数据连接失败,SQL语句存在语法错误,强制捕捉的检查型异常除了限制开发人员的自由度以外,并没有提供什么有意义的作用。因此,Spring的异常体系都是建立在运行期异常的基础上,开发者可以根据需要捕捉感兴趣的异常。 0 J" Z7 \! S; h- x
9 y0 w! A6 Z3 M$ |$ u" z: V1 [# D. D JDK很多API之所以难用,一个很大的原因就是检查型异常的泛滥,如JavaMail、EJB以及JDBC等等,使用这些API,一堆堆异常处理的代码喧宾夺主式地侵入业务代码中,破坏了代码的整洁和优雅。 % R. u9 D" w8 F/ e
! _) H P. j J: Y+ R Spring在org.springframework.dao包中提供了一套完备优雅的DAO异常体系,这些异常都继承于 DataAccessException,而DataAccessException本身又继承于 NestedRuntimeException,NestedRuntimeException异常以嵌套的方式封装了源异常。因为虽然不同持久化技术的特定异常被转换到Spring的DAO异常体系中,原始的异常信息并不会丢失,只要你愿意,就可以方便地通过getCause()方法获取原始的异常信息。 q6 w% t+ `1 |7 g+ C: _
9 `* B- l2 D* h. i Spring的DAO异常体系并不和具体的实现技术相关,它从DAO概念的抽象层面定义了异常的目录树。在所有的持久化框架中,我们并没有发现拥有如此丰富语义异常体系的框架,Spring这种设计无疑是独具匠心的,它使得开发人员关注某一特定语义的异常变得容易。在JDBC中的SQLException 中,你必须通过异常的getErrorCode()或getSQLState()获取错误代码,直接根据这些代码判断是错误的类型,这种过于底层的API 不但带来了代码编写上的难度,而且也使代码的移植变得困难,因为getErrorCode()是数据库相关的。
% @! \( m/ W6 {" {& J$ @- t0 A
A3 c7 r- M5 s Spring以分类手法建立了异常分类目录,对于大部分应用来说,这个异常分类目录对异常类型的划分具有适当的颗粒度。一方面,使开发者从底层细如针麻的技术细节中脱身出来,另一方面,可以从这个语义丰富的异常体系中选择感兴趣的异常加以处理。图 2列出了那些位于Spring DAO异常体系第一层次的异常类,每个异常类下还可能拥有众多的子异常
DAO代表数据访问对象(Data Access Object),它描述了一个应用中DAO的角色,DAO的存在提供了读写数据库中数据的一种方法,把这个功能通过接口提供对外服务,程序的其他模块通过这些接口来访问数据库,这样会有很多好处,首先,由于服务对象不再和特定的接口实现绑定在一起,使得它们易于测试,因为它提供的是一种服务,在不需要连接数据库的条件下就可以进行单元测试,极大地提高了开发效率。其次,通过使用与持久化技术无关的方法访问数据库,在应用程序的设计和使用上都有很大的灵活性,对于整个系统无论是在性能上还是应用上也是一个巨大的飞跃。 1.数据访问对象DAO简介 DAO全称是(Data Access Object)数据访问对象,它属于O/R Mapping技术的一种。在O/R Mapping技术发布之前,开发者需要直接借助于JDBC和SQL来完成与数据库的相互通信,在O/R Mapping技术出现之后,开发者能够使用DAO或其他不同的DAO框架来实现与RDBMS(关系数据库管理系统)的交互。借助于O/R Mapping技术,开发者能够将对象属性映射到数据表的字段、将对象映射到RDBMS 中、这些Mapping技术能够为应用自动创建高效的SQL语句等,除此之外,O/R Mapping技术还提供了延迟加载、缓存等高级特征,而DAO是 O/R Mapping技术的一种实现,因此,使用DAO能够大量节省程序开发时间,减少代码量和开发的成本。 DAO的主要目的就是将持久性相关的问题与一般的业务规则和工作流隔离开来,它为定义业务层可以访问的持久性操作引入了一个接口并且隐藏了实现的具体细节,该接口的功能将依赖于采用的持久性技术而改变,但是DAO接口可以基本上保持不便。 2.Spring的DAO支持 Spring提供了一套抽象的DAO类,供开发者扩展,这有利于以统一的方式操作各种DAO技术,例如JDO、JDBC等,这些抽象DAO类提供了设置数据源及相关辅助信息的方法,而其中的一些方法同具体DAO技术相关。目前,Spring DAO抽象提供了以下几种类: JdbcDaoSupport:JDBC DAO抽象类,开发者需要为它设置数据源(DataSource),通过子类,开发者能够获得JdbcTemplate来访问数据库。 HibernateDaoSupport:Hibernate DAO抽象类。开发者需要为它配置Hibernate SessionFactory。通过其子类,开发者能够获得Hibernate实现。 JdoDaoSupport:Spring为JDO提供的DAO抽象类,开发者需要为它配置PersistenceManagerFactory,通过其子类开发者能够获得JdoTemplate。 在使用Spring的DAO框架进行数据库存取时,无须接触使用特定的数据库技术,通过一个数据存取接口来操作即可。下面通过一个简单的实例来讲解如何实现Spring中的DAO操作。
发表评论
-
Servlet上传文件
2012-02-07 23:58 1490准备工作:要到http://commons.apache.or ... -
成为Java高手需要达到的25个学习目标--经典
2012-01-29 16:07 1348本文将告诉你学习Java需 ... -
Timer, Quartz 和 Spring 实现作业调度
2011-11-28 15:43 1173一、java.util.Timer ... -
Java 产生不重复的随机数
2011-06-22 23:32 2358int numberCount = 6; ... -
Date类学习总结(Calendar Date 字符串 相互转换 格式化)
2011-06-20 16:12 1662Date类学习总结 1.计算某一月份的最大天数 ... -
jsp中的cookie用法小实例
2011-06-20 00:13 2491这个小实例有三个页面 index.jsp页面内容如下: Y ... -
JS实现简单的增删改查
2011-06-19 23:41 12960<%@ page language="ja ... -
Jsp 动态显示系统时间
2011-06-19 23:24 4899<%@ page language=" ... -
java 动态显示时间
2011-06-19 23:13 4056import java.util.Date; p ... -
js 动态显示时间
2011-06-19 22:53 1829<%@ page language=" ... -
HTML 显示系统时间
2011-06-19 22:13 7885代码1:(显示静态时间) <script type=& ... -
JavaScript 动态显示系统时间
2011-06-19 19:36 2077JavaScript 动态显示系统时间 <html ... -
两例JavaScript 获取当前系统日期和时间
2011-06-19 19:20 1251两例JavaScript 获取当前系统日期和时间 QUOTE ... -
java五种JSP页面跳转方法详解
2011-06-19 17:08 14741. RequestDispatcher.forward() ... -
Java Object方法
2011-06-19 16:47 1338package com.abin.test.connectio ... -
Java 数组,List,Itarator循环
2011-06-19 16:01 2299package com.abin.test.connect ... -
JAVA DBClass操作数据库,这样算不算单列模式
2011-06-19 14:53 1252到底怎样才算单列模式,单列模式事什么概念 package c ... -
Oracle日期函数集锦
2011-06-16 20:55 915Oracle日期函数集锦(一) 一、 常用日期数据格式 1 ... -
java 页面传送数组
2011-06-15 14:56 25911.可以通过嵌入java代码调用session或者reques ... -
java Calendar当前时间
2011-06-14 13:40 1660Calendar c = Calendar.getIn ...
相关推荐
**JDBC DAO设计思想与搭建骨架** 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的标准API,而DAO(Data Access Object)模式是一种常用的设计模式,用于封装对数据库的操作,以降低业务逻辑与数据...
这里我们将深入探讨这两个组件的设计思路。 首先,Dao层是系统与数据库交互的接口,它负责执行SQL查询、更新、插入和删除操作。Dao的主要任务是将数据对象(如新闻实体类)转换为数据库中的记录,并将数据库中的...
DAO模式的核心思想是将数据库操作封装到一个独立的对象中,这样可以隔离业务逻辑层和数据存储层,降低耦合度。DAO提供了一种标准接口,使得业务逻辑层可以不关心具体的数据存储细节,而只关注业务逻辑的实现。例如,...
5. **Spring DAO**:数据访问抽象层,提供了一组JDBC的抽象层,极大地简化了数据访问层的异常处理。 6. **Spring ORM**:提供了与ORM框架集成的功能,包括Hibernate、JPA等。 ### 二、Spring框架的核心概念 #### 1...
DAO模式的核心思想是创建一个接口或抽象类,代表一个特定的数据操作,然后创建该接口的具体实现类,这些实现类会包含具体的数据库操作。这样,当业务代码需要与数据库交互时,它只需要与DAO接口打交道,而不是直接...
"Hibernate封装DAO层"就是将Hibernate的功能整合到DAO设计模式中,以实现更加高效、规范的数据库操作。 1. **DAO设计模式**: DAO模式是软件设计模式的一种,它的核心思想是创建一个独立于具体数据库操作的对象,...
DAO(Data Access Object)模式是软件开发中常用的设计模式,主要目的是为了将数据访问层与业务逻辑层解耦,提供一个抽象层来处理数据库操作。DAO模式的核心思想是通过创建一个独立于具体数据库操作的对象(即DAO)...
1. DAO设计模式:DAO模式的核心思想是创建一个接口,该接口定义了对数据存储的通用操作,然后实现这个接口以处理具体的数据库交互。这样,当需要与不同的数据库或数据源交互时,只需改变DAO的实现即可,而不会影响到...
本文将基于给定的文档内容,深入探讨DAO层的设计原理及其在四层B/S架构中的作用。 #### 二、四层B/S架构概述 四层B/S(Browser/Server)架构是一种常见的企业级应用架构,它将整个应用程序划分为四个层次:表示层、...
7. **单元测试**:Spring的TestContext框架使得编写DAO层的单元测试变得简单,可以模拟数据源并注入到测试类中,进行隔离的测试。 8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或...
在IT行业中,数据库操作是应用程序的核心部分,而DAO(Data Access Object)模式是连接业务逻辑层与数据存储层的关键。本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可...
- **事务管理**:DAO层通常需要处理事务,确保一组数据库操作的原子性。 - **异常处理**:合理抛出和处理数据库操作可能出现的异常,提供良好的错误信息。 - **性能优化**:考虑缓存策略、批处理操作等来提升性能。 ...
DAO设计模式的核心思想是为每个数据存储创建一个接口(DAO Interface),然后提供一个实现了该接口的具体类(DAO Implementation)。这个接口定义了对数据库进行操作的方法,如查询、添加、删除和更新数据。具体类则...
**DAO设计模式的核心思想** DAO设计模式的核心是创建一个接口,该接口定义了对数据库进行操作的方法,如查询、插入、更新和删除等。然后,为这个接口提供具体的实现类,这些实现类会包含与数据库交互的细节。这样,...
DAO层应捕获并处理可能抛出的数据库相关异常,如`SQLException`,然后将其转换为业务层能理解的异常,如自定义的`DataAccessException`。 6. **查询优化** 对于复杂的查询,DAO层可以利用预编译的SQL...
- **可测试性**:方便对DAO层进行单元测试,独立于实际数据库环境。 - **可扩展性**:易于添加新的数据存储方式,如更换数据库或引入NoSQL存储。 - **重用性**:相同的数据访问逻辑可以在多个业务场景下复用。 7...
Java DAO(Data Access Object)模式是一种常见的软件设计模式,它在Java应用中被广泛用于分离业务逻辑层与数据访问层,以实现数据操作的封装和解耦。本教程将逐步介绍如何搭建一个基于DAO模式的Java项目。 1. **...
6. **单元测试(Unit Testing)**:DAO层作为独立的模块,便于进行单元测试,可以模拟数据库环境,验证其正确性。 7. **异常处理(Exception Handling)**:在DAO实现中,通常会捕获数据库操作抛出的异常,并转换为...