WEB开发网
开发学院WEB开发Jsp Generic Data Access Objects 设计模式 阅读

Generic Data Access Objects 设计模式

 2008-01-05 20:31:41 来源:WEB开发网   
核心提示:Generic Data access Objects 普通数据访问对象,这个是Hibernate官方网站上面的一个DAO类的设计模式,Generic Data Access Objects 设计模式,基于JDK5.0范型支持,文章地址如下:http://www.hibernate.org/328.Html我下面的代

Generic Data access Objects

   普通数据访问对象,这个是Hibernate官方网站上面的一个DAO类的设计模式,基于JDK5.0范型支持,文章地址如下:

http://www.hibernate.org/328.Html

我下面的代码与Hibernate官网上提供的有点不同。

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

java 代码  
  1. /** 
  2.  * 定义通用的CRUD操作 
  3.  * @author rainlife 
  4.  */ 
  5. public interface IGenericDAO 〈T, ID extends Serializable〉
  6. { 
  7. // 通过主键标识查找某个对象。 
  8.   public T findById(ID id); 
  9.    
  10. // 通过主键标识查找某个对象,可以锁定表中对应的记录。 
  11.   T findById(ID id, boolean lock); 
  12.  
  13.   //得到所有的对象。 
  14.   List findAll(); 
  15.  
  16.   //通过给定的一个对象,查找与其匹配的对象。 
  17.   List findByExample(T exampleInstance); 
  18.  
  19.   //持久化对象。 
  20.   T makePersistent(T entity); 
  21.  
  22.   //删除对象。 
  23.   void makeTransient(T entity); 
  24. } 

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

java 代码  
  1. /** 
  2.  * 这是针对IGenericDAO接口的Hibernate实现,完成通用的CRUD操作。 
  3.  * @author rainlife 
  4.  * @param  POJO类 
  5.  * @param  POJO类的主键标识符 
  6.  * @param  针对每一个POJO类的DAO类实现  
  7.  */ 
  8. public abstract class GenericDAOHibernate 〈T,ID extends Serializable, DAOImpl extends IGenericDAO〈T,ID〉〉
  9.     implements IGenericDAO〈T,ID〉
  10. { 
  11.   PRivate Class persistentClass; 
  12.  
  13.   protected session session; 
  14.  
  15.   public GenericDAOHibernate() 
  16.   { 
  17.     this.persistentClass = (Class) ((ParameterizedType) getClass() 
  18.         .getGenericSuperclass()).getActualTypeArguments()[0]; 
  19.   } 
  20.  
  21.   @SuppressWarnings("unchecked") 
  22.   public DAOImpl setSession(Session s) 
  23.   { 
  24.     this.session = s; 
  25.     return (DAOImpl)this; 
  26.   } 
  27.  
  28.   protected Session getSession() 
  29.   { 
  30.     if (session == null) 
  31.       throw new IllegalStateException( 
  32.           "Session has not been set on DAO before usage"); 
  33.     return session; 
  34.   } 
  35.  
  36.   public Class getPersistentClass() 
  37.   { 
  38.     return persistentClass; 
  39.   } 
  40.  
  41.    
  42.   @SuppressWarnings("unchecked") 
  43.   public T findById(ID id) 
  44.   { 
  45.     return (T) getSession().load(getPersistentClass(), id); 
  46.   } 
  47.    
  48.   @SuppressWarnings("unchecked") 
  49.   public T findById(ID id, boolean lock) 
  50.   { 
  51.     T entity; 
  52.     if (lock) 
  53.       entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE); 
  54.     else 
  55.       entity = findById(id); 
  56.  
  57.     return entity; 
  58.   } 
  59.  
  60.   @SuppressWarnings("unchecked") 
  61.   public List findAll() 
  62.   { 
  63.     return findByCriteria(); 
  64.   } 
  65.  
  66.   @SuppressWarnings("unchecked") 
  67.   public List findByExample(T exampleInstance) 
  68.   { 
  69.     Criteria crit = getSession().createCriteria(getPersistentClass()); 
  70.     Example example = Example.create(exampleInstance); 
  71.     crit.add(example); 
  72.     return crit.list(); 
  73.   } 
  74.    
  75.   @SuppressWarnings("unchecked") 
  76.   public List findByExample(T exampleInstance, String[] excludeProperty) 
  77.   { 
  78.     Criteria crit = getSession().createCriteria(getPersistentClass()); 
  79.     Example example = Example.create(exampleInstance); 
  80.     for (String exclude : excludeProperty) 
  81.     { 
  82.       example.excludeProperty(exclude); 
  83.     } 
  84.     crit.add(example); 
  85.     return crit.list(); 
  86.   } 
  87.  
  88.   @SuppressWarnings("unchecked") 
  89.   public T makePersistent(T entity) 
  90.   { 
  91.     getSession().saveOrUpdate(entity); 
  92.     //getSession().save(entity); 
  93.     return entity; 
  94.   } 
  95.  
  96.   public void makeTransient(T entity) 
  97.   { 
  98.     getSession().delete(entity); 
  99.   } 
  100.  
  101.   @SuppressWarnings("unchecked") 
  102.   protected List findByCriteria(Criterion... criterion) 
  103.   { 
  104.     Criteria crit = getSession().createCriteria(getPersistentClass()); 
  105.     for (Criterion c : criterion) 
  106.     { 
  107.       crit.add(c); 
  108.     } 
  109.     return crit.list(); 
  110.   } 
  111.    
  112.   @SuppressWarnings("unchecked") 
  113.   /** 
  114.    * 增加了排序的功能。 
  115.    */ 
  116.   protected List findByCriteria(Order order,Criterion... criterion) 
  117.   { 
  118.     Criteria crit = getSession().createCriteria(getPersistentClass()); 
  119.     for (Criterion c : criterion) 
  120.     { 
  121.       crit.add(c); 
  122.     } 
  123.     if(order!=null) 
  124.       crit.addOrder(order); 
  125.     return crit.list(); 
  126.   } 
  127.    
  128.   @SuppressWarnings("unchecked") 
  129.   protected List findByCriteria(int firstResult,int rowCount,Order order,Criterion... criterion) 
  130.   { 
  131.     Criteria crit = getSession().createCriteria(getPersistentClass()); 
  132.     for (Criterion c : criterion) 
  133.     { 
  134.       crit.add(c); 
  135.     } 
  136.     if(order!=null) 
  137.       crit.addOrder(order); 
  138.     crit.setFirstResult(firstResult); 
  139.     crit.setMaxResults(rowCount); 
  140.     return crit.list(); 
  141.   } 
  142. } 

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

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

java 代码
  1. public interface IUserDAO extends IGenericDAO〈User,Integer〉
  2. { 
  3.   public User find(String username,String passWord); 
  4.   public User find(String username); 
  5. } 

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

Tags:Generic Data Access

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接