`
lighter
  • 浏览: 500916 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate, Java 5 and DAO[转]

阅读更多

在进行Hibernate开发过程中,我们通常会使用DAO模式,有一些通用的数据操作方法,如CRUD,我们通常会将这些方法集中在一个DAO,这样会简便很多。如在AppFuse中,创建了一个DAO接口,包含一些常用的方法,接口如下:

  1. public interface DAO {   
  2. public List getObjects(Class clazz);   
  3. public Object getObject(Class clazz, Serializable id);   
  4. public void saveObject(Object o);   
  5. public void removeObject(Class clazz, Serializable id);   
  6. }  

这里的代码包含了许多entity类型的信息,也就是DAO接口中的Class clazz。接下来AppFuse同样创建一个缺省的实现类:BaseDAOHibernate,将这个接口做一缺省实现。以后我们创建的新的DAO需要继承DAO接口,如UserDAO,RoleDAO都继承DAO接口,对应的DAO实现都继承BaseDAOHibernate,再实现指定的接口,如UserDAOHibernate继承BaseDAOHibernate,实现UserDAO接口。

如果你的项目在使用Java 5,那么再这么做可能有点不适合,在调用AppFuse的DAO接口时,你通常还需要进行额外的操作:造型(cast type),提供entity类名,List数据没有包含元素类型信息等,这里要感谢Java 5的Generics,让我们做同样的事情轻松多了,下面让我们看看在Java 5下如何规划DAO接口。首先我们创建同样的一个DAO接口,代码如下:

  1. public interface AbstractDao{   
  2. public Serializable create(T po);   
  3. public T getById(Serializable id);   
  4. public void update(T po);   
  5. public void delete(T po);   
  6. public List findAll();   
  7. public List findByCriterion(Criterion... criterion);   
  8. }  

在这个接口中,我们提供了基本的CRUD和简单的查询(使用了Hibernate的Criterion),同时我们引入Generics机制,enity的类型我们用T代替,在后面就可以看到这样做的带来的好处,同时我们创建一个这个接口的缺省实现:bstractHibernateDao,代码如下:

java 代码
  1. public abstract class AbstractHibernateDao extends ibernateDaoSupport    
  2. implements AbstractDao   
  3. {   
  4. private Class poClass;   
  5. public AbstractHibernateDao(Class poClass)   
  6. {   
  7. this.poClass = poClass;   
  8. }   
  9. public T getById(Serializable id)   
  10. {   
  11. return (T) getHibernateTemplate().get(poClass, id);   
  12. }   
  13. public void delete(T po)   
  14. {   
  15. getHibernateTemplate().delete(po);   
  16. }   
  17. public List findAll()   
  18. {   
  19. return getHibernateTemplate().find("from " + poClass.getName() + " obj");   
  20. }   
  21. public List findByCriterion(final Criterion... criterion)   
  22. {   
  23. return getHibernateTemplate().executeFind(new HibernateCallback()   
  24. {   
  25. public Object doInHibernate(Session session) throws HibernateException, SQLException   
  26. {   
  27. Criteria criteria=session.createCriteria(poClass);   
  28. for (Criterion c : criterion)   
  29. {   
  30. criteria.add(c);    
  31. }   
  32. return criteria.list();   
  33. }   
  34. });   
  35. }   
  36. public Serializable create(T po)   
  37. {   
  38. return getHibernateTemplate().save(po);   
  39. }   
  40. public void update(T po)   
  41. {   
  42. getHibernateTemplate().update(po);   
  43. }   
  44. }   


下面让我们看看如何创建业务的DAO,我们只需创建一个新的DAO,继承AbstractDao即可,这里要提供entity的类型信息,如PersonPO,代码如下:

  1. public interface UserDao extends AbstractDao   
  2. {   
  3. public static final String BEANNAME = "UserDao";   
  4. public PersonPO findUserByNameAndPassword(String name,String password);   
  5. }  

基本的CRUD完全没有了,我们只需关注其他的一些业务方面,在这个接口中只需继承AbstractDao <personpo></personpo> ,其中PersernPO为entity的类型,这个是Generics需要的。下面我们看一下UserDao的接口实现,代码很简单,如下:

java 代码
  1. public class UserDaoImpl extends AbstractHibernateDao implements UserDao   
  2. {   
  3. public UserDaoImpl()   
  4. {   
  5. super(PersonPO.class);   
  6. }   
  7. public PersonPO findUserByNameAndPassword(String name,String password)   
  8. {   
  9. return null//todo   
  10. }   
  11. }  

这里我们需要继承AbstractHibernateDao,同时提供entity的类型信息,同时创建一个默认的构造函数,然后调用AbstractHibernateDao的构造方法,进行entity类型赋值,这样UserDao的实现就完成了。

这里因为使用了Spring,接下来只需在Spring的配置文件中将UserDaoImpl进行声明定义即可。在你取得UserDao接口后,再调用的方式就完全以前不一样了,这里包含了entity的类型信息,而这以前都是Object类型,还需要了提供entity类的类型名称。下面的这两张图的对比相信你会看的一目了然。

java 代码
在这个实现中,我们需要提供Entity的类型信息,也就是代码中的PoClass,AbstractHibernateDao只包含一个构造函数,那么所有继承该类的子类必须调用AbstractHibernateDao类的构造函数,保证了entity的类型被准确赋值。

java 代码

java 代码

使用Java 5 Generics特性定义的DAO

AppFuse中定义的DAO(传统的DAO模式)

总结:通过引入Java 5的Generics,再回头设计一下DAO,你会发现有些事情处理起来方便很多,在以前,我们只能获取Object对象,现在我们完全可以获取指定类型的对象啦,操作和理解都方便啦。关于AbstractDao你可能有自己的想法,你可以根据具体情况更改一些,如添加Spring的Annotation Transaction,这样对事务控制也会简单很多;如将添加分页功能.

    这一篇文章转载于:http://www.jetmaven.net/contents/documents/j_hibernate_java5_dao.php



 

分享到:
评论

相关推荐

    Java.Persistence.with.Hibernate.2nd.Edition

    In part 5, “Building applications,” we discuss the design and implementation of layered and conversation-aware Java database applications. We discuss the most common design patterns that are used ...

    Java mvc+DAO完成用户登陆

    在IT行业中,`Java MVC+DAO`架构是开发Web应用程序的一种常见模式,它将应用程序的逻辑分解为四个主要部分:模型(Model)、视图(View)和控制器(Controller),以及数据访问对象(DAO)。本篇将详细介绍如何使用...

    HibernateDAO的写法

    **标题:“HibernateDAO的写法”** 在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以专注于业务逻辑,而不用过多地关注SQL语句的编写。这篇博客主要探讨了如何在项目中实现...

    some simple demo about hibernate3.2 and spring2.5

    标题 "some simple demo about hibernate3.2 and spring2.5" 暗示这是一个关于如何集成和使用 Hibernate 3.2 和 Spring 2.5 的简单演示项目。这两个库在Java开发中扮演着重要角色,Hibernate是流行的对象关系映射...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    根据标题、描述和部分内容,知识点覆盖范围主要集中在Java Web开发领域,并且包括了JSP、Servlet、Ajax以及SSH框架(Struts 2、Spring、Hibernate)的技术整合和实战案例分析。 JSP(Java Server Pages)是一种动态...

    hibernate-generic-dao:自动从code.google.comphibernate-generic-dao导出

    通过将搜索对象传递给通用DAO和通用DA​​O的搜索方法,可以使用此功能。 搜索对象提供了灵活的搜索选项: 使用标准运算符(=,!=,&gt;,&lt;,&gt; =,&lt;=,LIKE,IN,IS NULL和IS EMPTY)对属性进行过滤。 使用...

    Hibernate连表查询 Hibernate连表查询

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连...

    hibernate与spring整合demo

    5. 创建DAO接口和实现类:定义数据访问接口,然后使用Spring的@Repository注解标记实现类,实现DAO方法。 6. 配置事务管理:在Spring配置文件中启用事务管理,并定义事务边界。 7. 测试整合:编写测试用例,验证...

    java spring hibernate

    Spring框架是Java平台上的一个全面的轻量级应用程序框架,由Rod Johnson在其著作《Expert One-on-One J2EE Design and Development》中首次提出。Spring的核心特性可以用来简化新应用的开发,也可以通过模块化和可...

    自己写的Hibernate

    1 Build two java project named "TEST_COMMON" and "TEST_DAO" 2 Copy the source code to the new projects. 3 Import the liberaries as show on top. 4 New the database and be sured the server is open. 4 OK...

    struts and hibernate学习笔记

    5. **整合Struts2与Hibernate**:讲解如何在Struts2 Action中调用Hibernate的DAO层,实现数据的增删改查,以及如何处理数据验证和异常。 6. **实例分析**:可能包含多个日志记录(day01至day03)的项目实践,逐步...

    spring_hibernate_in one and find more than 1 rs

    标题“spring_hibernate_in one and find more than 1 rs”暗示了这个压缩包可能包含一个整合Spring和Hibernate的示例项目,重点在于在一个查询中找到多条结果。在这个项目中,Spring作为依赖注入和框架管理工具,而...

    44-使用Struts + DAO + Hibernate完成用户登陆(120M)

    在本篇文章中,我们将深入探讨如何使用Struts框架结合DAO(Data Access Object)设计模式以及Hibernate ORM(Object Relational Mapping)技术实现一个完整的用户登录系统。这个系统不仅能够有效地处理用户的登录...

    Hibernate3使用经验

    ### Hibernate3 使用经验 #### 一、在 Hibernate 中配置参数 ...这些内容涵盖了如何在 Hibernate 中配置参数、执行 SQL 语句、获取 Session 以及如何在 DAO 层进行事务处理等方面的知识点。希望对读者有所帮助。

    Struts+Spring+Hibernate_upload_and_download.rar_Spring+Hibernate

    Struts、Spring 和 Hibernate 是Java开发中常用的三大框架,它们分别负责不同的职责,共同构建了企业级应用的基础架构。在“Struts+Spring+Hibernate_upload_and_download.rar_Spring+Hibernate”这个压缩包中,我们...

    springmvc+Hibernate配置定时器jar包

    在Java中,定时任务通常可以通过Quartz、Spring的Task Execution and Scheduling或者Java自带的ScheduledExecutorService来实现。这些工具允许我们定义任务并设置执行频率,如每小时、每天等。在Spring MVC和...

    网络硬盘 java struts hibernate ajax

    这个项目中的【NetHardDisk】可能包含了实现上述功能的所有源代码和配置文件,包括但不限于Action类(Struts的控制器)、DAO(数据访问对象,使用Hibernate进行数据库操作)、Service接口及实现类(封装业务逻辑)、...

    hibernate环境搭建基本操作封装

    在IT行业中,Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的数据交互。本文将详细介绍如何进行Hibernate环境搭建,以及如何进行基本操作的封装,我们将以MySQL开源...

    hibernate对Blob类型字段进行数据添加.txt

    在 Java 应用开发中,尤其是使用 ORM 框架如 Hibernate 进行持久化层开发时,如何高效地处理 BLOB 类型字段成为了一个关键问题。 本文档将详细介绍如何使用 Hibernate 对 Blob 类型字段进行数据添加的过程,并通过...

    Spring与hibernate 整合 简单示例

    在Java开发领域,Spring框架和Hibernate是两个非常重要的开源库,它们分别负责应用程序的依赖管理和对象关系映射(ORM)。Spring作为一个全面的轻量级应用框架,提供了事务管理、AOP(面向切面编程)、IoC(控制反转...

Global site tag (gtag.js) - Google Analytics