- 浏览: 253339 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
mabusyao:
漠北空城 写道请问下,你这个是JDK版本是多少呢?!忘记了,应 ...
HashMap 源码解读 -
漠北空城:
请问下,你这个是JDK版本是多少呢?!
HashMap 源码解读 -
schumee:
完美团队~
项目沉思录 - 1.1 -
winie:
整理下 搞成引擎嘛 国产需要这样的engine
简单工作流引擎 -
mabusyao:
某位同学给我提供的堪称完美的解决方案:1. 将三个int数组放 ...
CraneWork
本打算在网上找一些资源的,可是发现大多数人都是用的hibernate,对于DaoFacotry并不需要过多的考虑。
后来突然想到个办法,干脆直接去看Hibernate的代码,看看它是怎么设计DaoFactory的。 结果却在Hibernate官网上看到了一篇关于数据持久层的文章,觉得对我的设计应该还是有帮助的。
原文地址:https://www.hibernate.org/328.html
有关Dao接口的设计:
这样的设计号称是面向状态的数据库持久层的标准模式,原话这样讲的:
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接口:
其实对于Hibernate来说,因为HQL的引入,实体Dao接口并不是必须的。而如果不使用Hibernate,那么其实最好是加入实体Dao接口,以便将来对于其它数据库的支持。
Hibernate中对于BaseDao接口的实现方法:
这里我们需要关心下,究竟如何注入Session,是用setter方法,还是在构造函数中注入。你的后台数据库连接的管理方式,决定着哪中方法是最合适的。
接下来就是实体Dao的设计,很简单:
具体DaoFactory的实现:
其实这篇文章还是主要讲怎么在Hibernate里面用做数据持久层,不过也可以从中得到很多借鉴。
因为持久层的设计没有采用Hibernate,遇到挺多问题,包括Object类型的使用,许多的重复代码。 可以考虑下能不能通过反射来解决。
后来突然想到个办法,干脆直接去看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类型的使用,许多的重复代码。 可以考虑下能不能通过反射来解决。
发表评论
-
大数据下的实体解析
2016-07-07 12:03 671大数据时代的实体解析困境 <!--[if !sup ... -
中文相似度匹配算法
2015-12-30 14:44 1921基于音形码的中文字 ... -
简单工作流引擎
2012-07-06 16:58 2414从公司的一个项目中挖出来的工作流引擎的代码,虽然是一个很简单的 ... -
在线词典的数据结构实现。
2012-05-18 08:37 0昨天在网上看到了一道百度的面试题: Baidu写道 ... -
Log4j 代码学习 - Factory
2012-05-17 08:47 1110我们最早提到,Log4j的初始代码在LogManager的静态 ... -
Log4j 代码学习 - Appender
2012-05-16 09:09 1357在上一篇文章里,我们 ... -
Log4j 代码学习
2012-05-15 14:58 1163最近闲来无事,正好手头上有Log4j的代码,于是就拿来学习了下 ... -
java7中的ThreadLocalRandom(转)
2012-01-20 09:08 4348今天早上看到一个关于java7中的ThreadLocalRan ... -
(转)追MM与23种设计模式
2011-11-16 14:13 10001、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德 ... -
项目开发过程 - 转载
2010-08-04 13:35 1112一位软件工程师的软件过程总结 ... -
LAMP网站架构(转载)
2010-06-30 09:04 897LAMP(Linux-Apache-MySQL-PHP)网 ... -
个人发展成长路线
2010-06-28 14:25 1184其实对自己的发展路线,一直存在着很多困惑,究竟应该成为什么样的 ... -
Decorator
2010-03-15 16:35 1141看java与模式中装饰器模式,没有看懂。。。 在网上找了一篇 ... -
关于WAS LDAP验证页面跳转问题
2009-12-03 09:50 3389很多门户网站的用户验证都是通过服务器提供的验证方式来实现的, ... -
设计模式解读之一: 策略模式
2009-10-13 00:03 789转载 当我们掌握了Java的语法,当我们了解了面向对象的封装 ... -
贫血模式or领域模式
2009-09-13 10:53 4133在论坛看到一个好帖: ... -
整体设计
2009-09-10 14:46 778目前的思路是这样的: -
Junit 的模式
2009-09-08 23:32 829Junit的Composite模式, 跟享元模式很接近: ... -
IBaseDao的设计
2009-09-08 09:30 1367去网上查了下,发现泛型Dao的设计比较热门,比较起来也相对通用 ... -
数据库连接池
2009-09-06 18:53 1187感谢网络提供资源的朋友,自己做了个版本,正在测试,看看是否有问 ...
相关推荐
DAO层采用JDBC),应用DAOFactory设计模式,有利于组件的扩展和替换;表现层应用JSP技术结合struts2标签,并应用JavaScript、AJAX、JQuery技术进行页面表单的客户端验证和异步服务器端验证,减少页面刷新,并运用...
《DaoFactory:深入解析与应用》 在编程领域,工厂模式是一种常见的设计模式,它提供了一种创建对象的最佳方式。本文将围绕“DaoFactory.rar_daoFactory”这一主题,深入探讨DaoFactory.cs文件中的实现细节,以及...
在这款系统中,daoFactory(数据访问对象工厂)和Java编程技术的运用,使得系统的数据处理和功能实现更为高效和稳定。 首先,让我们深入理解一下“daoFactory”这一概念。DAO(Data Access Object)模式是一种设计...
在DAO设计模式中,我们可以创建一个DAOFactory,它根据传入的参数(如数据库类型)返回相应的DAO实例。这样,代码在需要使用DAO时,只需要调用工厂方法,而无需直接new某个特定的DAO,增加了系统的灵活性。 例如: ...
4. 使用工厂类`DAOFactory`实例化DAO对象,实现解耦合。 5. JSP页面负责显示和调用DAO进行数据操作。 #### 优点 - 数据操作与显示逻辑分离。 - 提高了代码的可维护性和可扩展性。 #### 缺点 - JSP页面仍然与...
工厂类如DAOFactory通常用于创建DAO实例,DBConnection类则负责数据库的连接和关闭。 在图书借阅网站的实现中,开发者需要创建多个Servlet控制器,如BookTypeAddServlet和BookInfoAddServlet,分别对应图书类型和...
【人事管理系统设计报告】 在实训期间,我们设计并实现了基于J2EE架构的B/S(Browser/Server)人事管理系统,该系统旨在优化企业的人力资源管理工作,提高效率,减轻人力资源部门的工作负担。以下是对该系统设计的...
本文介绍了基于PLC(可编程逻辑控制器)控制系统的医用洁净空调的设计与应用,深入探讨了PLC控制器的电气控制性能,并提出了一种基于DAOFactory模式的系统设计方法。以下是详细的知识点梳理: 1. PLC控制器概述: ...
- DAO应用:`XMLDB_DAOFactory`根据`dbtype`创建不同的`XMLDB`实现类。 - Hibernate的`SessionFactory`根据配置文件创建`Session`。 - EJB容器作为EJB的工厂,管理EJB实例。 **抽象工厂模式(The Abstract ...
7. **建立数据层工厂类**:为了方便地创建和管理DAO对象,可以创建一个工厂类,如`DAOFactory`,通过工厂方法返回不同类型的DAO实例。 8. **业务层实现类**:这部分处理业务逻辑,调用DAO层的方法完成实际的数据...
软件设计是PLC控制系统节能环保设计的关键环节之一,其中平台数据持久层设计通常采用Factory模式或DAOFactory模式,利用配置文件创建大数据对象,对接不同数据库,实现数据的持久化处理。平台服务层设计则为应用提供...
DAO(Data Access Object)设计模式是软件开发中用于处理数据访问的一种常见模式,尤其是在Java企业级应用(J2EE)中。DAO模式的主要目的是将业务逻辑与数据存储操作分离,提高代码的可测试性、可维护性和解耦度。...
**Java Web课程设计详解——贫困认定管理系统** 在Java Web开发领域,课程设计是培养学生实践技能的重要环节。本项目“贫困认定管理系统”就是这样一个实例,它综合运用了多种核心技术,包括JSP、Servlet以及Dao...
### 设计模式个人总结 #### 单例模式(Singleton) 单例模式的主要目的是确保一个类在Java应用程序中只有一个实例,并且提供一个全局访问点。这种模式对于那些需要频繁访问但又希望保持单一状态的对象非常有用,...
### J2EE之DAO设计模式详解 #### 一、引言 在J2EE开发过程中,DAO(Data Access Object)设计模式是一种非常重要的模式,它主要用于处理数据访问逻辑,并将其与业务逻辑分离。通过这种方式,我们可以更好地管理和...
Java设计模式中的事务处理是构建企业级应用时不可或缺的一部分,主要关注数据的一致性和完整性。在J2EE环境中,Java Transaction API (JTA) 提供了全面的事务管理能力,适用于涉及多个事务资源的情况。然而,对于...
在IT行业中,数据库操作是应用程序不可或缺的一部分,而Java作为广泛使用的后端开发语言,提供了丰富的库和设计模式来处理数据库交互。"tp-garage-2: TP车库实施jdbc,DAOFactory和EDT进行摆动"这个项目显然是一个...
基于组件的文件上传程序设计 在 Java Web 实验六中,我们将学习如何设计基于组件的文件上传程序。该实验的目的是在雇员表中增加一个字段为 photo,在雇员增加时进行雇员照片的操作。 一、实验结果截图 在实验中,...
首先,Struts2框架基于MVC(Model-View-Controller)设计模式,它提供了强大的动作调度、拦截器、结果类型和插件等特性,使得开发人员能够更高效地构建Web应用。然而,由于其复杂的内部机制,初学者或开发者在使用...
### Java DAO 设计模式 #### 一、DAO设计模式的概念 **DAO**(Data Access Object)设计模式是一种在Java EE环境中广泛使用的数据访问模式,它主要应用于处理数据存储组件的交互。这种模式的主要目的是将底层数据...