- 浏览: 404472 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (99)
- Spring (14)
- Hibernate (2)
- Struts (0)
- Java (21)
- J2ee (1)
- JFreeChart (1)
- Tomcat (3)
- Eclipse (3)
- 项目日记 (2)
- Javascript (4)
- fckeditor (2)
- mysql (13)
- Powerdesigner (2)
- sql server 2005 (1)
- Css (1)
- jQuery (2)
- 架构 (4)
- 性能 (7)
- struts2 (1)
- LigerUI (1)
- ibatis (2)
- 数据库 (1)
- 职业发展 (3)
- maven (1)
- mybatis (1)
- 算法 (1)
- 项目经理 (2)
- hadoop-1.0 (2)
- hadoop1.0 (1)
- hadoop-2.0 (1)
- 网络安全 (5)
- 正则表达式 (1)
- 管理 (2)
- Redis (1)
- linux (4)
- infobright (1)
- CentOS (4)
- windows (1)
- 其他 (1)
- easyui (1)
- elasticsearch (0)
- 公司管理 (0)
最新评论
-
wangyudong:
由Spring Boot实现的微服务需要有比较好的工具去测试R ...
使用Spring Boot快速构建应用 -
masuweng:
<artifactId>maven-compile ...
使用Spring Boot快速构建应用 -
masuweng:
说明下<start-class>com.test. ...
使用Spring Boot快速构建应用 -
masuweng:
学习了,感谢了
使用Spring Boot快速构建应用 -
幽蓝星空:
执行mvn clean install spring-boot ...
使用myeclipse打包Spring Boot工程
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
原文链接
不要重复 DAO!使用 Hibernate 和 Spring AOP 构建泛型类型安全的 DAO |
级别: 中级 Per Mellqvist (per@mellqvist.name), 系统架构师, 自由作家 2006 年 6 月 05 日 由于 Java™ 5 泛型的采用,有关泛型类型安全 Data Access Object (DAO) 实现的想法变得切实可行。在本文中,系统架构师 Per Mellqvist 展示了基于 Hibernate 的泛型 DAO 实现类。然后展示如何使用 Spring AOP introductions 将类型安全接口添加到类中以便于查询执行。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> 对于大多数开发人员,为系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。其实有解决方案。可以使用许多 ORM 工具来避免代码重复。例如,使用 Hibernate,您可以简单地为所有的持久域对象直接使用会话操作。这种方法的缺点是损失了类型安全。 为什么您要为数据访问代码提供类型安全接口?我会争辩说,当它与现代 IDE 工具一起使用时,会减少编程错误并提高生产率。首先,类型安全接口清楚地指明哪些域对象具有可用的持久存储。其次,它消除了易出错的类型强制转换的需要(这是一个在查询操作中比在 CRUD 中更常见的问题)。最后,它有效利用了今天大多数 IDE 具备的自动完成特性。使用自动完成是记住什么查询可用于特定域类的快捷方法。 在本文中,我将为您展示如何避免再三地重复 DAO 代码,而仍保留类型安全接口的优点。事实上,您需要为每个新 DAO 编写的只是 Hibernate 映射文件、无格式旧 Java 接口以及 Spring 配置文件中的 10 行。 DAO 模式对任何企业 Java 开发人员来说都应该很熟悉。但是模式的实现各不相同,所以我们来澄清一下本文提供的 DAO 实现背后的假设:
泛型 DAO 的基础是其 CRUD 操作。下面的接口定义泛型 DAO 的方法: 清单 1. 泛型 DAO 接口
用 Hibernate 实现清单 1 中的接口十分简单,如清单 2 所示。它只需调用底层 Hibernate 方法和添加强制类型转换。Spring 负责会话和事务管理。(当然,我假设这些函数已做了适当的设置,但该主题在 Hibernate 和 Springt 手册中有详细介绍。) 清单 2. 第一个泛型 DAO 实现
最后,在 Spring 配置中,我创建了 清单 3. 配置 DAO
我还没有完成,但我所完成的确实已经可以使用了。在清单 4 中,可以看到原封不动使用该泛型 DAO 的示例: 清单 4. 使用 DAO
现在,我有一个能够进行类型安全 CRUD 操作的泛型 DAO。让子类
可以使用 Spring AOP 中的 introductions 将功能添加到现有对象,方法是将功能包装在代理中,定义应实现的接口,并将所有先前未支持的方法指派到单个处理程序。在我的 DAO 实现中,我使用 introductions 将许多查找器方法添加到现有泛型 DAO 类中。因为查找器方法是特定于每个域对象的,因此将其应用于泛型 DAO 的类型化接口。 Spring 配置如清单 5 所示: 清单 5. FinderIntroductionAdvisor 的 Spring 配置
在清单 5 的配置文件中,我定义了三个 Spring bean。第一个 bean 是 FinderIntroductionAdvisor,它处理引入到 DAO 的所有方法,这些方法在 第二个 bean 是 “抽象的”。在 Spring 中,这意味着该 bean 可在其他 bean 定义中被重用,但不被实例化。除了抽象特性之外,该 bean 定义只指出我想要 最后,第三个也是最有趣的 bean 将
当然,每个 DAO 的接口都基于 清单 6. PersonDao 接口
很明显,清单 6 中定义的方法旨在按名称查找 因为 Spring 配置依赖于先前定义的 “抽象” bean,因此它变得相当简洁。我需要指出 DAO 负责哪个域类,并且需要告诉 Springs 该 DAO 应实现哪个接口(一些方法是直接使用,一些方法则是通过使用 introductions 来使用)。清单 7 展示了 清单 7. PersonDao 的 Spring 配置
在清单 8 中,可以看到使用了这个更新后的 DAO 版本: 清单 8. 使用类型安全接口
虽然清单 8 中的代码是使用类型安全
使用 Hibernate,可以在 Hibernate 映射文件 (hbm.xml) 中定义 HQL 查询并为其命名。稍后可以通过简单地引用给定名称来在 Java 代码中使用该查询。该方法的优点之一是能够在部署时优化查询,而无需更改代码。您一会将会看到,另一个优点是无需编写任何新 Java 实现代码,就可以实现 “完整的” DAO。清单 9 是带有命名查询的映射文件的示例: 清单 9. 带有命名查询的映射文件
清单 9 定义了域类
您已经看到了为任何域对象创建和配置新 DAO 所必需的全部步骤。三个简单的步骤是:
查看执行查找器方法的代码(只编写了一次!)来结束我的讨论。
使用的 Spring advisor 和 interceptor 很简单,事实上它们的工作是向后引用 清单 10. FinderIntroductionAdvisor 的实现
清单 10 的实现中惟一缺少的是 清单 11. executeFinder() 的实现
在 Java 5 之前,该语言不支持编写既类型安全又 泛型的代码,您必须只能选择其中之一。在本文中,您已经看到一个结合使用 Java 5 泛型与 Spring 和 Hibernate(以及 AOP)等工具来提高生产率的示例。泛型类型安全 DAO 类相当容易编写 —— 您只需要单个接口、一些命名查询和为 Spring 配置添加的 10 行代码 —— 而且可以极大地减少错误并节省时间。 几乎本文的所有代码都是可重用的。尽管您的 DAO 类可能包含此处没有实现的查询和操作类型(比如,批操作),但使用我所展示的技术,您至少应该能够实现其中的一部分。参阅 参考资料 了解其他泛型类型安全 DAO 类实现。 自 Java 语言中出现泛型以来,单个泛型类型安全 DAO 的概念已经成为主题。我曾在 JavaOne 2004 中与 Don Smith 简要讨论了泛型 DAO 的灵活性。本文使用的 DAO 实现类旨在作为示例实现,实际上还存在其他实现。例如,Christian Bauer 已经发布了带有 CRUD 操作和标准搜索的实现,Eric Burke 也在该领域做出了工作。我确信将会有更多的实现出现。我要额外感谢 Christian,他目睹了我编写泛型类型安全 DAO 的第一次尝试并提出改进建议。最后,我要感谢 Ramnivas Laddad 的无价帮助,他审阅了本文。
|
发表评论
-
Annotation的优缺点-和配置文件比较
2014-05-06 18:22 1303a. 配置(配置文件,con ... -
使用Spring Boot快速构建应用
2014-04-17 17:11 74019随着Spring 4新版本的发布,Spring Boo ... -
使用myeclipse打包Spring Boot工程
2014-04-17 16:34 20431<project xmlns="http:/ ... -
spring3.0.x Quartz1.x 升级到spring3.2.x Quartz2.x
2013-08-19 16:25 2804Quartz1.8.5与Spring 3.0.5,升级到最新 ... -
spring-core-3.2.4与spring-asm-3.1.4冲突
2013-08-18 21:15 19546冲突带来的错误信息: org.apache.catali ... -
Spring 3中各JAR包的用途说明
2013-08-16 18:59 12511. spring.jar 包含有完整发布模块的单个ja ... -
Spring单例模式的一次失败经历和总结
2009-06-12 18:18 2014原文如下: 这次被骗代 ... -
spring 调用存储过程(简单版)
2009-03-13 14:44 1421public void updateTest(){ ... -
hibernate+spring设置MaxResults
2009-01-08 11:05 1633<bean id="hibernate ... -
Spring发邮件
2008-04-03 13:53 2077需要的spring的jar包有:spring.jar,mail ... -
Spring AOP 之AfterReturningAdvice & MethodBeforeAdv
2008-03-31 18:48 3772Spring框架中成功吸引人 ... -
使用struts+spring+hibernate 组装web应用
2008-03-25 09:26 5105其实,就算用Java建造一 ... -
J2EE添加spring时删除和添加的jar包
2008-03-24 09:44 20761。删除 asm-*.jar (asm-2.2.3.jar、a ...
相关推荐
标题“不要重复 DAO!”指的是在软件开发中,尤其是在Java领域,如何避免数据访问对象(DAO)层的代码重复,以提高代码复用性和维护性。DAO模式是将业务逻辑与数据库操作分离的一种设计模式,它使得应用代码可以独立...
### 外文翻译计算机外文翻译“不要重复DAO!”——基于Java 5泛型的类型安全数据访问对象实现 #### 概述 在计算机领域的软件开发过程中,数据访问层(Data Access Layer)的设计与实现至关重要。传统的数据访问...
能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个...
1. **泛型DAO**:通过泛型,可以创建通用的DAO接口和实现,减少代码的重复。例如,`IMessageDAO` 和 `IUserDAO` 接口定义了基本的CRUD操作,而`HibernateDAO`基础类提供了对这些操作的实现,子类可以进一步扩展以...
- **模板方法设计模式**:提供模板类,如`BeanHandler`和`MapHandler`,用于处理结果集,减少重复代码。 - **强大的SQL生成器**:支持动态SQL,可以根据条件自动生成合适的SQL语句。 - **事务管理**:提供事务控制...
这样,我们只需要为每种数据实体创建一个具体的DAO实现类,而无需为每个基本操作重复编写模板代码。 例如,我们可以有如下的泛型DAO接口: ```java public interface GenericDao<T> { void save(T entity); T ...
总结起来,通过C#的特性标签和反射技术,我们可以构建一个灵活且可扩展的通用Dao层,大大减少了重复代码,提高了开发效率。这种方法的关键在于利用元数据(特性)来描述实体类和数据库之间的关系,以及利用反射在...
本主题主要探讨的是如何使用泛型和反射技术来实现Hibernate对DAO的封装,从而创建一个通用的DAO模板,减少开发者重复编写CRUD(Create、Read、Update、Delete)操作的工作。 首先,我们需要理解DAO(Data Access ...
”指的是在软件开发中避免重复创建数据访问对象(DAO)模式的实践。DAO模式是设计模式的一种,它提供了一种在应用程序代码与数据库交互时解耦的方法。这篇博客可能探讨了如何有效地利用DAO,避免代码重复,提高可...
这样可以避免代码重复,提高代码的复用性。例如,`AbstractDao`可以包含`executeQuery()`和`executeUpdate()`等通用方法,而`UserDaoImpl`只需实现具体的查询和更新逻辑。 在给定的`TestDao`中,我们可以猜测这是一...
在传统的Hibernate使用中,我们需要为每个实体类编写大量的CRUD(Create, Read, Update, Delete)方法,而使用原生通用DAO可以减少这部分重复工作,提高开发效率。 在设计原生通用DAO时,通常会包含以下核心功能: ...
通用DAO的概念旨在减少数据库操作的重复性工作,提高代码的可复用性和可维护性。本文将深入探讨Java语言中如何使用反射机制实现通用DAO,并通过提供的"通用DAO源码及示例"来阐述这一概念。 首先,我们需要理解什么...
在本教程中,可能会涉及到提取方法、移动字段、替换条件为策略等重构技术,以消除重复代码、改善类和方法的设计,以及增强代码的表达力。 4. .NET框架:教程可能基于.NET框架进行,这是一个由微软开发的全面的开发...
对于重复的数据库操作,如增删改查,可以使用模板方法模式来抽象出公共部分,子类只需实现特定的部分。 10. **ORM框架** 虽然JDBC可以满足基本的数据库操作需求,但在大型项目中,通常会选择使用ORM(Object-...
使用这样的设计,开发者可以快速地为新的实体类型创建DAO,减少了重复的代码编写,并且由于DAO层的解耦,可以更方便地更换底层的持久化技术,比如从Hibernate切换到MyBatis。 总结来说,"dao.rar_dao"提供的是一套...
4. **代码复用**:DAO可以被多个业务类共享,减少了代码重复。 在"JDBC_DAO.rar"中,可能包含的文件可能有以下几种: 1. **接口类**:定义了DAO接口,比如`UserDao.java`,其中声明了对用户表进行操作的方法,如`...
通过自定义模板,开发者可以设置模板变量,这些变量将在生成代码时被解析并替换为具体的实现内容,从而节省手动编写重复代码的时间。 **生成DAO的流程** 1. **配置模板**:首先,打开MyEclipse的首选项设置...
在传统的ORMLite DAO实现中,我们需要为每个数据库表创建一个对应的DAO类,并在其中定义各种CRUD(Create、Read、Update、Delete)方法,这往往会导致大量重复且繁琐的代码。 标题"ormlite使用中的dao简化写法"指的...
"DAO层自动生成"这一技术旨在提高开发效率,减少手动编写重复代码的工作量。通过根据数据库表结构自动生成相关的实体类、DAO接口以及映射文件,开发者可以更专注于业务逻辑的实现,而不是基础的数据操作代码。 首先...
在Java编程语言中,泛型和反射是两个非常重要的...这种设计模式在实际开发中非常常见,尤其是在企业级应用中,能够有效地降低代码重复,提高开发效率。同时,通过接口定义,使得不同DAO之间的交互变得更加简单和规范。