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

DaoFactory的设计

阅读更多
本打算在网上找一些资源的,可是发现大多数人都是用的hibernate,对于DaoFacotry并不需要过多的考虑。

后来突然想到个办法,干脆直接去看Hibernate的代码,看看它是怎么设计DaoFactory的。 结果却在Hibernate官网上看到了一篇关于数据持久层的文章,觉得对我的设计应该还是有帮助的。

原文地址:https://www.hibernate.org/328.html

有关Dao接口的设计:
public interface GenericDAO<T, ID extends Serializable> {

    T findById(ID id, boolean lock);

    List<T> findAll();

    List<T> findByExample(T exampleInstance);

    T makePersistent(T entity);

    void makeTransient(T entity);
}


这样的设计号称是面向状态的数据库持久层的标准模式,原话这样讲的:
You can already see that this is going to be a pattern for a state-oriented data access API, with methods such as makePersistent() and makeTransient(). Furthermore, to implement a DAO you have to provide a type and an identifier argument. As for most ORM solutions, identifier types have to be serializable.


接下来是添加实体DAO接口:
public interface ItemDAO extends GenericDAO<Item, Long> {

    public static final String QUERY_MAXBID = "ItemDAO.QUERY_MAXBID";
    public static final String QUERY_MINBID = "ItemDAO.QUERY_MINBID";

    Bid getMaxBid(Long itemId);
    Bid getMinBid(Long itemId);

}

其实对于Hibernate来说,因为HQL的引入,实体Dao接口并不是必须的。而如果不使用Hibernate,那么其实最好是加入实体Dao接口,以便将来对于其它数据库的支持。

Hibernate中对于BaseDao接口的实现方法:
public abstract class GenericHibernateDAO<T, ID extends Serializable>
        implements GenericDAO<T, ID> {

    private Class<T> persistentClass;
    private Session session;

    public GenericHibernateDAO() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
     }

    @SuppressWarnings("unchecked")
    public void setSession(Session s) {
        this.session = s;
    }

    protected Session getSession() {
        if (session == null)
            throw new IllegalStateException("Session has not been set on DAO before usage");
        return session;
    }

    public Class<T> getPersistentClass() {
        return persistentClass;
    }

    @SuppressWarnings("unchecked")
    public T findById(ID id, boolean lock) {
        T entity;
        if (lock)
            entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);
        else
            entity = (T) getSession().load(getPersistentClass(), id);

        return entity;
    }

    @SuppressWarnings("unchecked")
    public List<T> findAll() {
        return findByCriteria();
    }

    @SuppressWarnings("unchecked")
    public List<T> 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);
        return entity;
    }

    public void makeTransient(T entity) {
        getSession().delete(entity);
    }

    public void flush() {
        getSession().flush();
    }

    public void clear() {
        getSession().clear();
    }

    /**
     * Use this inside subclasses as a convenience method.
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByCriteria(Criterion... criterion) {
        Criteria crit = getSession().createCriteria(getPersistentClass());
        for (Criterion c : criterion) {
            crit.add(c);
        }
        return crit.list();
   }

}

这里我们需要关心下,究竟如何注入Session,是用setter方法,还是在构造函数中注入。你的后台数据库连接的管理方式,决定着哪中方法是最合适的。

接下来就是实体Dao的设计,很简单:
public class ItemDAOHibernate
        extends     GenericHibernateDAO<Item, Long>
        implements  ItemDAO {

    public Bid getMaxBid(Long itemId) {
        Query q = getSession().getNamedQuery(ItemDAO.QUERY_MAXBID);
        q.setParameter("itemid", itemId);
        return (Bid) q.uniqueResult();
    }

    public Bid getMinBid(Long itemId) {
        Query q = getSession().getNamedQuery(ItemDAO.QUERY_MINBID);
        q.setParameter("itemid", itemId);
        return (Bid) q.uniqueResult();
    }

}


具体DaoFactory的实现:
public class HibernateDAOFactory extends DAOFactory {

    public ItemDAO getItemDAO() {
        return (ItemDAO)instantiateDAO(ItemDAOHibernate.class);
    }

    public CategoryDAO getCategoryDAO() {
        return (CategoryDAO)instantiateDAO(CategoryDAOHibernate.class);
    }

    public CommentDAO getCommentDAO() {
        return (CommentDAO)instantiateDAO(CommentDAOHibernate.class);
    }

    public ShipmentDAO getShipmentDAO() {
        return (ShipmentDAO)instantiateDAO(ShipmentDAOHibernate.class);
    }

    private GenericHibernateDAO instantiateDAO(Class daoClass) {
        try {
            GenericHibernateDAO dao = (GenericHibernateDAO)daoClass.newInstance();
            dao.setSession(getCurrentSession());
            return dao;
        } catch (Exception ex) {
            throw new RuntimeException("Can not instantiate DAO: " + daoClass, ex);
        }
    }

    // You could override this if you don't want HibernateUtil for lookup
    protected Session getCurrentSession() {
        return HibernateUtil.getSessionFactory().getCurrentSession();
    }

    // Inline concrete DAO implementations with no business-related data access methods.
    // If we use public static nested classes, we can centralize all of them in one source file.

    public static class CommentDAOHibernate
            extends GenericHibernateDAO<Comment, Long>
            implements CommentDAO {}

    public static class ShipmentDAOHibernate
            extends GenericHibernateDAO<Shipment, Long>
            implements ShipmentDAO {}

}


其实这篇文章还是主要讲怎么在Hibernate里面用做数据持久层,不过也可以从中得到很多借鉴。

因为持久层的设计没有采用Hibernate,遇到挺多问题,包括Object类型的使用,许多的重复代码。 可以考虑下能不能通过反射来解决。
分享到:
评论

相关推荐

    当当网(达内项目)

    DAO层采用JDBC),应用DAOFactory设计模式,有利于组件的扩展和替换;表现层应用JSP技术结合struts2标签,并应用JavaScript、AJAX、JQuery技术进行页面表单的客户端验证和异步服务器端验证,减少页面刷新,并运用...

    DaoFactory.rar_daoFactory

    《DaoFactory:深入解析与应用》 在编程领域,工厂模式是一种常见的设计模式,它提供了一种创建对象的最佳方式。本文将围绕“DaoFactory.rar_daoFactory”这一主题,深入探讨DaoFactory.cs文件中的实现细节,以及...

    智慧公交系统_IB智慧公交_daoFactory_java编程_智慧公交_智慧公交系统_

    在这款系统中,daoFactory(数据访问对象工厂)和Java编程技术的运用,使得系统的数据处理和功能实现更为高效和稳定。 首先,让我们深入理解一下“daoFactory”这一概念。DAO(Data Access Object)模式是一种设计...

    DAO设计模式(工厂+代理)

    在DAO设计模式中,我们可以创建一个DAOFactory,它根据传入的参数(如数据库类型)返回相应的DAO实例。这样,代码在需要使用DAO时,只需要调用工厂方法,而无需直接new某个特定的DAO,增加了系统的灵活性。 例如: ...

    留言程序设计的三种方法

    4. 使用工厂类`DAOFactory`实例化DAO对象,实现解耦合。 5. JSP页面负责显示和调用DAO进行数据操作。 #### 优点 - 数据操作与显示逻辑分离。 - 提高了代码的可维护性和可扩展性。 #### 缺点 - JSP页面仍然与...

    Java Web程序设计——图书借阅网站的实现——图书信息实验.docx

    工厂类如DAOFactory通常用于创建DAO实例,DBConnection类则负责数据库的连接和关闭。 在图书借阅网站的实现中,开发者需要创建多个Servlet控制器,如BookTypeAddServlet和BookInfoAddServlet,分别对应图书类型和...

    人事管理系统设计报告

    【人事管理系统设计报告】 在实训期间,我们设计并实现了基于J2EE架构的B/S(Browser/Server)人事管理系统,该系统旨在优化企业的人力资源管理工作,提高效率,减轻人力资源部门的工作负担。以下是对该系统设计的...

    医用洁净空调PLC控制系统的设计与应用.pdf

    本文介绍了基于PLC(可编程逻辑控制器)控制系统的医用洁净空调的设计与应用,深入探讨了PLC控制器的电气控制性能,并提出了一种基于DAOFactory模式的系统设计方法。以下是详细的知识点梳理: 1. PLC控制器概述: ...

    23种设计模式 - 架构设计 - PPT

    - DAO应用:`XMLDB_DAOFactory`根据`dbtype`创建不同的`XMLDB`实现类。 - Hibernate的`SessionFactory`根据配置文件创建`Session`。 - EJB容器作为EJB的工厂,管理EJB实例。 **抽象工厂模式(The Abstract ...

    java课程设计报告--javadao模式设计.docx

    7. **建立数据层工厂类**:为了方便地创建和管理DAO对象,可以创建一个工厂类,如`DAOFactory`,通过工厂方法返回不同类型的DAO实例。 8. **业务层实现类**:这部分处理业务逻辑,调用DAO层的方法完成实际的数据...

    面向节能环保的PLC控制系统设计.pdf

    软件设计是PLC控制系统节能环保设计的关键环节之一,其中平台数据持久层设计通常采用Factory模式或DAOFactory模式,利用配置文件创建大数据对象,对接不同数据库,实现数据的持久化处理。平台服务层设计则为应用提供...

    dao设计模式(1)

    DAO(Data Access Object)设计模式是软件开发中用于处理数据访问的一种常见模式,尤其是在Java企业级应用(J2EE)中。DAO模式的主要目的是将业务逻辑与数据存储操作分离,提高代码的可测试性、可维护性和解耦度。...

    Java Web课程设计-贫困认定管理系统.zip

    **Java Web课程设计详解——贫困认定管理系统** 在Java Web开发领域,课程设计是培养学生实践技能的重要环节。本项目“贫困认定管理系统”就是这样一个实例,它综合运用了多种核心技术,包括JSP、Servlet以及Dao...

    设计模式个人总结

    ### 设计模式个人总结 #### 单例模式(Singleton) 单例模式的主要目的是确保一个类在Java应用程序中只有一个实例,并且提供一个全局访问点。这种模式对于那些需要频繁访问但又希望保持单一状态的对象非常有用,...

    J2EE之DAO设计模式

    ### J2EE之DAO设计模式详解 #### 一、引言 在J2EE开发过程中,DAO(Data Access Object)设计模式是一种非常重要的模式,它主要用于处理数据访问逻辑,并将其与业务逻辑分离。通过这种方式,我们可以更好地管理和...

    JAVA设计模式之事务处理.docx

    Java设计模式中的事务处理是构建企业级应用时不可或缺的一部分,主要关注数据的一致性和完整性。在J2EE环境中,Java Transaction API (JTA) 提供了全面的事务管理能力,适用于涉及多个事务资源的情况。然而,对于...

    tp-garage-2:TP车库实施jdbc,DAOFactory和EDT进行摆动

    在IT行业中,数据库操作是应用程序不可或缺的一部分,而Java作为广泛使用的后端开发语言,提供了丰富的库和设计模式来处理数据库交互。"tp-garage-2: TP车库实施jdbc,DAOFactory和EDT进行摆动"这个项目显然是一个...

    Java Web实验六 基于组件的文件上传程序设计

    基于组件的文件上传程序设计 在 Java Web 实验六中,我们将学习如何设计基于组件的文件上传程序。该实验的目的是在雇员表中增加一个字段为 photo,在雇员增加时进行雇员照片的操作。 一、实验结果截图 在实验中,...

    struts2 出错

    首先,Struts2框架基于MVC(Model-View-Controller)设计模式,它提供了强大的动作调度、拦截器、结果类型和插件等特性,使得开发人员能够更高效地构建Web应用。然而,由于其复杂的内部机制,初学者或开发者在使用...

    Java DAO 设计模式.pdf

    ### Java DAO 设计模式 #### 一、DAO设计模式的概念 **DAO**(Data Access Object)设计模式是一种在Java EE环境中广泛使用的数据访问模式,它主要应用于处理数据存储组件的交互。这种模式的主要目的是将底层数据...

Global site tag (gtag.js) - Google Analytics