`
shizhi
  • 浏览: 48873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate DAO设计方法

    博客分类:
  • Java
阅读更多

学Hibernate有一段时间了,
最初我是这么设计的:

package com.zjut.DAO;

import java.util.List;

import com.zjut.PO.User;
public interface UserDAO {
public List getUsers();
public User getUserByID(int id);
public boolean deleteUserByID(int id);
public boolean updateUser(User user);
public boolean saveUser(User user);
//public List userList(int PageSize,int startRow);
//public int getUserRows(String query);
}

然后就用一个类来实现这个接口....这样就完了, 因为User的操作不是很多, 我就在想没有必要来加个基接口了吧 ...
后来:
按照rainlife大哥的设计思想 :

这里引用rainlife大哥的帖子


首先定义DAO类的接口IGenericDAO,该接口定义了共同的CRUD操作:

java 代码
 
/**  
 * 定义通用的CRUD操作  
 * @author rainlife  
 */   
public interface IGenericDAO 〈T, ID extends Serializable〉 
{   
//  通过主键标识查找某个对象。   
    public T findById(ID id);   
       
//  通过主键标识查找某个对象,可以锁定表中对应的记录。   
    T findById(ID id, boolean lock);   
   
    //得到所有的对象。   
    List findAll();   
   
    //通过给定的一个对象,查找与其匹配的对象。   
    List findByExample(T exampleInstance);   
   
    //持久化对象。   
    T makePersistent(T entity);   
   
    //删除对象。   
    void makeTransient(T entity);   
}   


下面是使用Hibernate针对该接口的实现GenericDAOHibernate:

java 代码
 
/**  
 * 这是针对IGenericDAO接口的Hibernate实现,完成通用的CRUD操作。  
 * @author rainlife  
 * @param  POJO类  
 * @param   POJO类的主键标识符  
 * @param  针对每一个POJO类的DAO类实现   
 */   
public abstract class GenericDAOHibernate 〈T,ID extends Serializable, DAOImpl extends IGenericDAO〈T,ID〉〉 
        implements IGenericDAO〈T,ID〉 
{   
    private Class persistentClass;   
   
    protected Session session;   
   
    public GenericDAOHibernate()   
    {   
        this.persistentClass = (Class) ((ParameterizedType) getClass()   
                .getGenericSuperclass()).getActualTypeArguments()[0];   
    }   
   
    @SuppressWarnings("unchecked")   
    public DAOImpl setSession(Session s)   
    {   
        this.session = s;   
        return (DAOImpl)this;   
    }   
   
    protected Session getSession()   
    {   
        if (session == null)   
            throw new IllegalStateException(   
                    "Session has not been set on DAO before usage");   
        return session;   
    }   
   
    public Class getPersistentClass()   
    {   
        return persistentClass;   
    }   
   
       
    @SuppressWarnings("unchecked")   
    public T findById(ID id)   
    {   
        return (T) getSession().load(getPersistentClass(), id);   
    }   
       
    @SuppressWarnings("unchecked")   
    public T findById(ID id, boolean lock)   
    {   
        T entity;   
        if (lock)   
            entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);   
        else   
            entity = findById(id);   
   
        return entity;   
    }   
   
    @SuppressWarnings("unchecked")   
    public List findAll()   
    {   
        return findByCriteria();   
    }   
   
    @SuppressWarnings("unchecked")   
    public List findByExample(T exampleInstance)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        Example example = Example.create(exampleInstance);   
        crit.add(example);   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    public List findByExample(T exampleInstance, String[] excludeProperty)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        Example example = Example.create(exampleInstance);   
        for (String exclude : excludeProperty)   
        {   
            example.excludeProperty(exclude);   
        }   
        crit.add(example);   
        return crit.list();   
    }   
   
    @SuppressWarnings("unchecked")   
    public T makePersistent(T entity)   
    {   
        getSession().saveOrUpdate(entity);   
        //getSession().save(entity);   
        return entity;   
    }   
   
    public void makeTransient(T entity)   
    {   
        getSession().delete(entity);   
    }   
   
    @SuppressWarnings("unchecked")   
    protected List findByCriteria(Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    /**  
     * 增加了排序的功能。  
     */   
    protected List findByCriteria(Order order,Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   

        if(order!=null)   
            crit.addOrder(order);   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    protected List findByCriteria(int firstResult,int rowCount,Order order,Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   
        if(order!=null)   
            crit.addOrder(order);   
        crit.setFirstResult(firstResult);   
        crit.setMaxResults(rowCount);   
        return crit.list();   
    }   
}   


这样,我们自己所要使用的DAO类,就可以直接从这个Hibernate的DAO类继承:

比如说我们定义一个IUserDAO接口,该接口继承IGenericDAO:


java 代码
public interface IUserDAO extends IGenericDAO〈User,Integer〉 
{   
    public User find(String username,String password);   
    public User find(String username);   
}   

 

该接口从IGenericDAO继承,自然也就定义了IGenericDAO接口所定义的通用CRUD操作。


再来看一下针对IUserDAO 的Hibernate实现UserDAOHibernate:


java 代码
public class UserDAOHibernate extends GenericDAOHibernate〈User,Integer,IUserDAO〉 implements IUserDAO {       

   
    public User find(String username, String password) {   
        //此处省略具体代码   
    }   
   
    public User find(String username) {   
        //此处省略具体代码   
    }   
}   

 

UserDAOHibernate继承GenericDAOHibernate并实现IUserDAO接口,这样,我们的UserDAOHibernate既拥有通用的CRUD操作,也实现了针对用户的特定的业务操作。






但是我在想如果在一个PO对象的操作不是很多的时候有必要分这么多的层次吗....
可能是我学的不够好.....  大家来聊聊吧

分享到:
评论

相关推荐

    2020版Hibernate 12 道.pdf

    以上就是关于Hibernate的一些核心知识点,包括其使用原因、ORM概念、SQL日志、查询方式、类设计原则以及对象状态和缓存机制。学习并理解这些内容对于熟练掌握Hibernate和优化Java应用程序的数据库交互至关重要。

    hibernate培训笔记.docx

    - **事务**:在Hibernate中,通过Session的beginTransaction()和commit()方法进行管理,确保数据一致性。 ### 设计模式 Hibernate利用了多种设计模式,如工厂模式(SessionFactory的创建)、单例模式...

    flex+hibernate 实例

    3. **服务创建**:在Flex端,创建一个AMF通道连接到服务器上的服务,这个服务通常是一个Java Servlet,负责处理Flex发来的请求,调用Hibernate方法进行数据操作。 4. **数据访问**:在Flex应用中,使用Service或...

    struts hibernate spring 集成范例

    1. **Struts2配置**:在struts.xml文件中,定义了各个Action及其对应的执行方法和结果页面。Struts2会根据用户请求找到相应的Action进行处理。 2. **Hibernate配置**:在hibernate.cfg.xml文件中,配置了数据库连接...

    flex4+blazeds+spring+hibernate集成

    6. **数据交互**:Flex客户端通过RemoteObject调用Spring Bean的方法,这些方法会触发Hibernate的数据库操作,然后返回结果给Flex应用显示。 集成Flex4、BlazeDS、Spring和Hibernate可以构建出高度互动的前端和强大...

    flex与spring hibernate的整合

    通过AMF,这些服务请求会直接映射到Spring中的Bean方法。 6. **数据绑定**:Flex的强项在于UI交互,可以利用数据绑定机制,将后台返回的数据直接显示在UI组件上,无需手动处理数据转换。 7. **异常处理**:在...

    JAVA web模式设计之道.pdf

    《JAVA web模式设计之道》是蒋海昌编著的一本专为Java Web J2EE系统架构师准备的书籍,由清华大学出版社出版。本书深入探讨了在Java Web开发中如何运用模式来构建高效、可扩展且易于维护的系统。在本文中,我们将...

    flex 之java+hibernate+Spring完整配置文档

    - Flex使用MXML(标记语言)和ActionScript(基于ECMAScript)来设计和编程UI组件,生成SWF文件在Flash Player中运行。 - Flex组件库提供丰富的UI元素,包括图表、3D效果、动画、音频和视频支持。 2. **Spring...

    使用注解整合ext dwr spring hibernate

    EXT提供了丰富的组件和布局管理,使得前端页面设计和交互变得直观且强大。 DWR(Direct Web Remoting)是一个开源Java库,它允许在浏览器和服务器之间进行实时的、安全的、异步的通信,就像本地对象调用一样。DWR...

    spring2.5+struts2.0+hibernate3.0分页

    接下来是Struts 2.0,它是MVC(Model-View-Controller)设计模式的实现,用于处理用户请求和响应。在分页上下文中,Struts 2.0接收用户的分页请求(例如,第几页,每页多少条记录),并将这些参数传递给后端服务。...

    spring-boot+kafka+hibernate+redis示例

    Kafka是Apache的一个开源项目,主要设计用于构建实时数据管道和流应用程序。在Spring Boot中,我们可以通过`@KafkaListener`注解监听特定的Kafka主题,或者使用`KafkaTemplate`发送消息。Kafka的高吞吐量和分布式...

    j2ee编码问题(mysql,jsp,struts,hibernate)

    例如,ByteBuffer允许直接在内存块上进行操作,具有capacity、limit和position三个属性,以及get/put方法等,以高效地读写数据。 在HTTP数据包的解码控制中,Web应用接收请求并发送响应时,需要处理字符编码。HTTP...

    领域驱动设计与模型驱动开发

    而Eric Evans在2004年发表的《领域驱动设计—软件核心复杂性应对之道》一书,系统化地提出了领域驱动设计的概念,为软件开发实践提供了一种新的视角。 2010年,Greg Young在改造CQS模式的基础上提出了CQRS模式,...

    整合Flash Builder4.0+MyEclipse 8.6+BlazeDS+Sping 3.0+Hibernate3.3+MySQL5.5+Tomcat+JDK1.6.docx

    这篇文档涉及的是一个基于Java和Flex的Web应用开发集成环境的搭建过程,主要涵盖了以下知识点: ...整个过程展示了如何将这些技术组合在一起,形成一个完整的开发流程,从数据库设计到前端展示,再到后端逻辑的实现。

    整合Flash Builder4.0+MyEclipse 8.6+BlazeDS+Sping 3.0+Hibernate3.3+MySQL5.5+Tomcat+JDK1.6.pdf

    4. **MyEclipse 8.6**: MyEclipse是基于Eclipse的集成开发环境,专为Java EE开发设计,集成了多种Web开发工具,如Spring和Hibernate的集成支持。 5. **Flash Builder 4.0**: Flash Builder是用于开发Adobe Flex和...

    JavaWeb程序设计任务教程第2版课后题答案

    7. **JPA(Java Persistence API)**:JPA是Java持久化标准,用于简化数据库操作,与ORM(对象关系映射)框架如Hibernate配合使用。 8. **Spring框架**:Spring是JavaWeb开发中最流行的框架之一,提供依赖注入、AOP...

    软件设计选题包括java SSH方面的

    3. **提升软件测试能力**:掌握有效的软件测试方法,提高调试技巧,确保软件质量。 #### 三、具体设计题目 1. **轨道交通数字图书馆的设计与实现** - **子题目一**:用户登录、图书浏览等功能的实现,涉及界面...

    ssh100道面试题

    例如,可能会要求编写一个简单的Struts2 Action类,或者设计一个Spring Bean的配置,甚至让你解释Hibernate中的懒加载和立即加载策略。此外,面试官还可能询问关于性能优化、异常处理、安全性等方面的问题,这些都是...

    Java自学之道(完整版)

    10. **设计模式**:学习常见的设计模式,如单例、工厂、装饰者、观察者等,这将提升你的代码质量和可维护性。 11. **Spring框架**:了解Spring的核心特性,如依赖注入、AOP(面向切面编程),以及Spring Boot和...

    UML设计模式

    设计模式的理念最早来源于建筑领域,由克里斯托弗·亚历山大在《论建筑的永恒之道》中提出,后来被软件工程领域采纳并发扬光大。 1995年,四位作者Richard Helm、Ralph Johnson、John Vlissides和Erich Gamma合著了...

Global site tag (gtag.js) - Google Analytics