- 浏览: 48710 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
horsequan:
oracle的sqlnet.ora , tnsnames.ora , Listener.ora 文件的作用 -
dontal:
struts.serve.static.browserCach ...
struts2中的constant详解 -
IceWee:
楼主是原创么?我一直想找作者聊聊。。。因为上传速度实在是太慢了 ...
采用dwr+ajax和struts开发文件上传进度条
泛型是JDK1.5的一个新的特性,使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上,建议多使用泛型来代替无休止的对象转换。
在软件设计中我们开始对系统进行三层甚至是多层架构了,目的是职责更加的明确,功能更加的分离。而常常使用的三层架构就是将表现层、业务逻辑层和持久层进行分离,每一层关注点不同,职能更加的清晰。所以DAO的设计模式现在已经被我们所接受,下面就介绍一下泛型DAO的设计和实现。
这次的DAO例子是基于接口的.很多工具, 像Hibernate已经提供了数据库的便携访问,所以我们不是为持久层的轻便而设计接口. 然而, DAO接口在较为复杂的应用中更有意义, 当有几个持久化服务被封装到一个持久层的时候, 我想在很多情况下你应该直接使用Hibernate或者JPA, 而使用外加的DAO层最好的理由是为了实现更高的抽象化(例如:定义方法名findAll(String hql)而不是无数次地重复session.createQuery(...))
通用DAO接口:
- package com.baiyyy.util.dao;
- import java.io.Serializable;
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.LockMode;
- import org.hibernate.criterion.Criterion;
- import org.hibernate.criterion.DetachedCriteria;
- /**
- * 承有业务数据的基础访问接口
- * <p>
- * 承有CRUD (创建,读取,修改和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都可以使用这些基本实玿
- *
- * @author yongtree
- *
- * @date:2008-03-04
- */
- public interface IBaseDAO<T, ID extends Serializable> {
- /***************************************************************************
- * -------------------基本棿索㿁增加㿁修改㿁删除操使---------------------------- *
- **************************************************************************/
- // --------findById()方法是鿚过get(ID id)得到实体对象-----------------------
- /**
- * 通过ID来得到实体对豿
- *
- * @param id
- * 实体对象的标识符
- * @param lock
- * 使用的锁模式
- * @return 该主键忼对应的实体对象
- */
- public T findById(ID id, LockMode lock);
- /**
- * 通过ID来得到实体对豿
- *
- * @param id
- * @return T
- */
- public T findById(ID id);
- /**
- * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序,保留使甿)
- *
- * @param c
- * @param id
- * @return T
- */
- public T findById(Class c, ID id);
- // -------------loadById()是调用hibernate的load方法------------
- public T loadById(ID id);
- /**
- * 通过id load对象
- *
- * @param id
- * @param lock
- * @return
- */
- public T loadById(ID id, LockMode lock);
- /**
- * 获取全部的实使
- *
- * @return
- */
- public List<T> loadAll();
- /**
- * 保存丿个实体对豿
- *
- * @param entity
- */
- public T saveEntity(T entity);
- /**
- * 更新丿个实体对豿
- *
- * @param entity
- */
- public void updateEntity(T entity);
- public void updateEntity(T entity, LockMode lock);
- /**
- * 增加或更新集合中的全部实使
- *
- * @param entities
- */
- public void saveOrUpdateAll(Collection<T> entities);
- /**
- * 删除丿个实使
- *
- * @param entity
- * @throws Exception
- */
- public void deleteEntity(T entity);
- public void deleteEntity(T entity, LockMode lock);
- /**
- * 根据主键删除指定实体
- *
- * @param id
- */
- public void deleteEntityById(ID id);
- public void deleteEntityById(ID id, LockMode lock);
- /**
- * 批量删除
- *
- * @param entities
- */
- public void deleteAll(Collection<T> entities);
- /**
- * 通过合并的方式更新对豿
- *
- * @param entity
- * void
- */
- public void merge(T entity);
- /***************************************************************************
- * ------------------------------使用HQL语句-------------------------------- *
- **************************************************************************/
- /**
- * 使用HQL语句进行对象的查诿
- *
- * @param hsql
- * 查询语句
- * @return 符合条件的对豿
- */
- public T getEntity(String hsql);
- /**
- * 使用HQL语句进行查询
- *
- * @param hsql
- * 查询语句
- * @return 符合条件的对象集吿
- */
- public List<T> getEntities(String hsql);
- /**
- * 使用带参数的HQL语句进行查询
- *
- * @param hsql
- * @param obj
- * @return
- */
- public List<T> getEntities(String hsql, Object[] values);
- public List<T> getEntities(String hql, int start, int number);
- public List<T> getEntities(String hql, int start, int number,
- Object[] values);
- /**
- * 使用命名的HQL语句棿索数捿
- *
- * @param queryName
- * @return
- */
- public List<T> findByNamedQuery(String queryName);
- /**
- * 使用带参数的命名HSQL语句棿索数捿
- *
- * @param queryName
- * @param values
- * @return
- */
- public List<T> findByNamedQuery(String queryName, Object[] values);
- /**
- * 使用带命名参数的命名HSQL语句棿索数捿
- *
- * @param queryName
- * @param paramNames
- * @param values
- * @return
- */
- public List<T> findByNamedQuery(String queryName, String[] paramNames,
- Object[] values);
- /**
- * 使用HQL语句棿索数据,返回 Iterator
- *
- * @param queryString
- * @return
- */
- public Iterator<T> iterate(String queryString);
- /**
- * 使用带参数HSQL语句棿索数据,返回 Iterator
- *
- * @param queryString
- * @param values
- * @return
- */
- public Iterator<T> iterate(String queryString, Object[] values);
- /***************************************************************************
- * -----------------------------Criteria动濁查诿---------------------------- *
- **************************************************************************/
- /**
- * 创建与会话无关的棿索标准对豿
- */
- public DetachedCriteria createDetachedCriteria();
- /**
- * 创建与会话绑定的棿索标准对豿
- *
- * @return
- */
- public Criteria createCriteria();
- /**
- * 使用指定的检索标准检索数捿
- *
- * @param criteria
- * @return
- */
- public List<T> findByCriteria(DetachedCriteria criteria);
- /**
- * 使用指定的检索标准检索数据,返回部分记录
- *
- * @param criteria
- * @param firstResult
- * @param maxResults
- * @return
- */
- public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
- int maxResults);
- /**
- * 通过动濁查询条件进行查诿
- *
- * @param criterion
- * @return List<T>
- */
- @SuppressWarnings("unchecked")
- public List<T> findByCriteria(Criterion... criterion);
- /**
- * 使用指定的检索标准检索数据,返回指定范围的记彿
- *
- * @param criteria
- * @return
- */
- public Integer getRowCount(DetachedCriteria criteria);
- /**
- * 使用指定的检索标准检索数据,返回指定统计倿
- *
- * @param criteria
- * @param propertyName
- * @param StatName
- * (max,min,avg,sum)
- * @return
- */
- public Object getStatValue(DetachedCriteria criteria, String propertyName,
- String StatName);
- /**
- * 通过给定的一个对象,查找与其匹配的对象,表关联比较多时,用户可以自己根据霿要扩展㿿
- *
- * @param entity
- * @return List<T>
- */
- public List<T> findByExample(T entity);
- /***************************************************************************
- * -------------------------Others ----------------------------------------*
- **************************************************************************/
- /**
- * 加锁指定的实使
- *
- * @param entity
- * @param lockMode
- */
- public void lock(T entity, LockMode lockMode);
- /**
- * 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)
- */
- public void flush();
- /**
- * 清空缓存
- *
- * void
- */
- public void clear();
- /***************************************************************************
- * --------------------------------相关知识炿--------------------------------*
- *
- * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象㿂但两个斿*
- * 法的区别在于:当数据库不存在于ID对应的记录时,load()方法抛出异常,迌get()方法返回null*
- ***************************************************************************/
- }
- 设计完接口,我们就要实现我们创建的接口,我们如果使用Hibernate,那么就做一个hibernate的实现,如果使用JPA,那么就做一个JPA实现。以下采用hibernate进行实现。
- 通用Hibernate DAO实现:
- package com.baiyyy.util.dao;
- /**
- * @filename:BaseHibernateDAO.java
- */
- import java.io.Serializable;
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.LockMode;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.criterion.Criterion;
- import org.hibernate.criterion.DetachedCriteria;
- import org.hibernate.criterion.Example;
- import org.hibernate.criterion.MatchMode;
- import org.hibernate.criterion.Projections;
- import com.baiyyy.workflow.pojo.TWfPackage;
- /**
- * 用Hibernate实现通用DAO接口
- *
- * @author yongtree
- * @date 2008-3-10
- * @param <T>
- * @param <ID>
- */
- public class BaseHibernateDAO<T, ID extends Serializable> implements
- IBaseDAO<T, ID> {
- // 保持实体对象类的类型
- private Class<T> persistentClass;
- private Session session;
- /**
- * 构鿠方泿
- */
- @SuppressWarnings("unchecked")
- public BaseHibernateDAO() {
- //下面这种方式丿直有错误,不能得到真正的T.class,迌是Object.class
- // this.persistentClass=GenericsUtils.getSuperClassGenricType(getClass());
- // System.out.println(obj.getClass().getName());
- }
- @SuppressWarnings("unchecked")
- public BaseHibernateDAO(Class clazz) {
- this.persistentClass = clazz;
- }
- /**
- * @param session
- * the session to set
- */
- public void setSession(Session session) {
- this.session = session;
- }
- /**
- * 得到当前线程的Session对象的实便
- *
- * @return
- */
- protected Session getSession() {
- System.out.println("get session");
- return HibernateUtil.getCurrentSession();
- }
- /**
- * 得到持久化对象的类型
- *
- * @return 持久化类的类垿
- */
- protected Class<T> getPersistentClass() {
- return persistentClass;
- }
- @SuppressWarnings("unchecked")
- public T findById(ID id, LockMode lock) {
- // TODO Auto-generated method stub
- T entity = (T) getSession().get(getPersistentClass(), id, lock);
- if (entity != null) {
- this.flush();
- }
- return entity;
- }
- @SuppressWarnings("unchecked")
- public T findById(Class c, ID id) {
- // TODO Auto-generated method stub
- T entity;
- entity = (T) getSession().get(c, id);
- return entity;
- }
- @SuppressWarnings("unchecked")
- public T findById(ID id) {
- // TODO Auto-generated method stub
- T entity = (T) getSession().get(getPersistentClass(), id);
- return entity;
- }
- @SuppressWarnings("unchecked")
- public T loadById(ID id) {
- // TODO Auto-generated method stub
- T entity = (T) getSession().load(getPersistentClass(), id);
- return entity;
- }
- @SuppressWarnings("unchecked")
- public T loadById(Class c, ID id) {
- // TODO Auto-generated method stub
- T entity = (T) getSession().load(c, id);
- return entity;
- }
- @SuppressWarnings("unchecked")
- public T loadById(ID id, LockMode lock) {
- // TODO Auto-generated method stub
- T entity = (T) getSession().load(getPersistentClass(), id, lock);
- return entity;
- }
- @SuppressWarnings("unchecked")
- public List<T> loadAll() {
- List<T> list = getSession().createQuery(
- "from " + getPersistentClass().getName()).list();
- return list;
- }
- public T saveEntity(T entity) {
- // TODO Auto-generated method stub
- getSession().save(entity);
- this.flush();
- return entity;
- }
- public void updateEntity(T entity) {
- // TODO Auto-generated method stub
- getSession().saveOrUpdate(entity);
- this.flush();
- }
- /**
- * 该实现类暂时没有实现更新加锁的操使
- */
- public void updateEntity(T entity, LockMode lock) {
- // TODO Auto-generated method stub
- getSession().saveOrUpdate(entity);
- this.flush();
- }
- public void saveOrUpdateAll(Collection<T> entities) {
- getSession().saveOrUpdate(entities);
- this.flush();
- }
- public void deleteEntity(T entity) {
- // TODO Auto-generated method stub
- getSession().delete(entity);
- this.flush();
- }
- /**
- * 该实现没有实现加锁删除对象的操作,在spring的DAO实现中已经实玿
- */
- public void deleteEntity(T entity, LockMode lock) {
- // TODO Auto-generated method stub
- getSession().delete(entity);
- this.flush();
- }
- public void deleteEntityById(ID id) {
- this.deleteEntity(this.loadById(id));
- this.flush();
- }
- // 该实现没有实现加锁的删除,在spring的dao中已经实现了
- public void deleteEntityById(ID id, LockMode lock) {
- this.deleteEntity(this.loadById(id));
- this.flush();
- }
- public void deleteAll(Collection<T> entities) {
- this.flush();
- getSession().delete(entities);
- }
- public void merge(T entity){
- getSession().merge(entity);
- this.flush();
- }
- @SuppressWarnings("unchecked")
- public T getEntity(String hsql) {
- T uniqueResult = (T) getSession().createQuery(hsql).uniqueResult();
-
// TODO Auto-generated method
发表评论
相关推荐
本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可维护性。 首先,`HibernateBaseDao.java`是基础的Hibernate DAO类,它提供了对Hibernate操作的基本封装。这个类通常会...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
相比传统的DAO设计,泛型DAO层具有以下显著优势: 1. **类型安全性**:泛型允许开发者在编译时检查类型,避免了运行时的ClassCastException。 2. **代码复用性**:一个泛型DAO类可以用于处理任何实体类型,大大减少...
泛型DAO是一种设计模式,它通过定义一个通用的DAO接口或抽象类,可以适用于不同的实体类,减少了重复的代码。这种模式的核心在于利用Java的泛型特性,使得DAO方法可以处理任何类型的实体对象,而无需为每个实体类...
【泛型DAO】是一种在Java开发中常见的设计模式,它利用了Java泛型特性来提高代码的可重用性和类型安全性。在Java中,DAO(Data Access Object)模式是用来封装对数据库的操作,将业务逻辑与数据访问逻辑分离,使得...
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
`JdbcTemplate`的泛型Dao实现是一种设计模式,目的是提高代码的可重用性和可维护性。通过定义一个泛型接口,我们可以创建一个通用的数据访问对象(DAO),这个DAO可以处理任何类型的实体类,只要它们遵循一定的规则...
6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...
泛型DAO模式通过抽象化设计,增强了程序的复用性和简化了编程语言,同时在程序运行结束后进行类型检查,避免了运行时的问题,并提高了运行速度。 文章进一步讨论了泛型DAO模式的查询功能设计。查询功能是泛型DAO...
泛型DAO(Generic DAO)是DAO模式的一个扩展,它引入了泛型的概念,提高了代码的复用性和类型安全性。本篇文章将深入探讨泛型DAO的实现原理、优势以及如何在实际项目中应用。 首先,我们来理解什么是泛型。泛型是...
本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...
【泛型DAO模型设计】是Java开发中一种高效且可复用的数据访问对象(DAO)设计方式,结合了泛型和反射技术。泛型在Java中引入,旨在提高代码的安全性和可读性,减少类型转换的繁琐过程。DAO设计模式主要用于数据库...
- `泛型DAO设计.doc`:可能探讨了泛型DAO的多种设计策略和最佳实践。 - `泛型dao的实现.doc`:可能详细描述了创建泛型DAO的具体步骤,包括如何处理CRUD(Create, Read, Update, Delete)操作。 - `使用AOP实现类型...
而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...
而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...
4. **泛型DAO**: 在SSH框架中,泛型DAO是一种常见的设计模式,用于封装对数据库的基本操作,如增删查改。通过泛型,我们可以创建一个通用的DAO接口和实现,减少代码重复,提高代码复用。例如,我们可以创建一个`...
标题中的“基于Hibernate的泛型Dao框架”是指在Java开发中使用Hibernate ORM工具,并结合泛型设计模式构建的数据库访问对象(DAO)框架。这样的框架旨在提高代码复用性,减少重复工作,使得数据访问层的实现更加简洁...
总的来说,"ssh通用泛型DAO"是一种设计模式,旨在简化SSH框架下的数据访问层开发,提高代码复用性,减少重复工作,同时通过泛型提供类型安全的保障。理解和熟练运用这一模式,能够有效地提升Java Web应用的开发效率...