`

DAO类的设计模式 JDK5.0范型

阅读更多

Generic Data Access Objects

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

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

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

 

首先定义DAO类的接口IGenericDAO,该接口定义了共同的CRUD操作:<o:p></o:p>

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<t></t> findAll();  
  15.   
  16.     //通过给定的一个对象,查找与其匹配的对象。  
  17.     List<t></t> 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 <t></t> POJO类 
  5.  * @param <id></id>  POJO类的主键标识符 
  6.  * @param <daoimpl></daoimpl> 针对每一个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<t></t> persistentClass;  
  12.   
  13.     protected Session session;  
  14.   
  15.     public GenericDAOHibernate()  
  16.     {  
  17.         this.persistentClass = (Class<t></t>) ((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<t></t> 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<t></t> findAll()  
  62.     {  
  63.         return findByCriteria();  
  64.     }  
  65.   
  66.     @SuppressWarnings("unchecked")  
  67.     public List<t></t> 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<t></t> 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<t></t> 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<t></t> 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<t></t> 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类,就可以直接从这个HibernateDAO类继承:

比如说我们定义一个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操作。<o:p>
</o:p>

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

 

java 代码
  1. public class UserDAOHibernate extends GenericDAOHibernate〈User,Integer,IUserDAO〉 implements IUserDAO {      
  2.   
  3.     public User find(String username, String password) {  
  4.         //此处省略具体代码  
  5.     }  
  6.   
  7.     public User find(String username) {  
  8.         //此处省略具体代码  
  9.     }  
  10. }  

 

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

说明 :由于范型的符号经过在线编辑器发布后,被过滤掉了,所以上面修改后的几个符号,都是我在中文状态下输入的。
分享到:
评论

相关推荐

    JDK 5.0.zip

    1. **类型安全的枚举(Enums)**:JDK 5.0引入了枚举类型,使得枚举成为一种独立的、类型安全的类。枚举可以包含方法和常量,增加了代码的可读性和安全性,避免了传统常量类可能导致的问题。 2. **泛型(Generics)...

    JDK5.0_下载-安装-配置

    **JDK5.0下载** Java Development Kit (JDK) 是Java编程语言的软件开发工具包,它包含Java运行环境(JRE)、编译器(javac)和其他工具,用于编写、测试和运行Java应用程序。JDK5.0是Oracle公司于2004年发布的一个...

    良葛格java jdk 5.0学习笔记

    良葛格java jdk 5.0学习笔记,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip。

    良葛格JDK5.0学习笔记

    3. **枚举类型**:JDK5.0之前,枚举通常通过常量类来实现,而JDK5.0引入了内置的枚举类型,提供了更强大的功能和更好的类型安全。枚举可以有方法、构造函数,甚至可以实现接口,例如 enum Color {RED, GREEN, BLUE}...

    (Java 2 SDK)JDK 5.0 的源代码

    从JDK 5.0开始,编译器能够推断出局部变量的类型,这在使用匿名内部类或者泛型时特别有用,如:List&lt;String&gt; list = new ArrayList(); 这里的中的类型可以由编译器推断出来。 七、可变参数(Varargs) 可变参数允许...

    良葛格Java JDK 5.0学习笔记[可打印]

    泛型是JDK 5.0引入的一项重要特性,它允许在类、接口和方法中定义类型参数,提高了代码的类型安全性,避免了强制类型转换,减少了运行时错误。通过使用泛型,可以创建可重用的组件,这些组件可以与多种数据类型一起...

    良葛格Java JDK 5.0学习笔记

    之前的版本中,枚举通常通过常量类来实现,而JDK 5.0引入了枚举类型,使得枚举更加安全、规范,支持方法和字段,方便进行面向对象编程。 3. **泛型(Generics)** 泛型允许在类、接口和方法中使用类型参数,增强...

    jdk5.0 tomcat5.0配置全攻略

    ### JDK 5.0 和 Tomcat 5.0 配置全攻略 #### 环境搭建背景 对于初入Java领域的新手来说,环境配置往往是一个不小的挑战。本篇文章旨在帮助那些在Java学习过程中遇到环境配置问题的朋友,提供一份详尽的JDK 5.0 和 ...

    良葛格————JavaJDK5.0学习笔记PDF

    良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...

    JDK 5.0中文版API

    JDK 5.0引入的泛型允许在类、接口和方法中指定参数类型,提高了代码的类型安全性和可读性。泛型可以减少类型转换,消除`ClassCastException`。 ### 学习资源 这份JDK 5.0中文版API文档是学习Java不可或缺的参考...

    jdk5.0新特性

    在JDK 5.0中,引入了一个非常实用的功能——自动装箱和自动拆箱,这极大地方便了开发者在处理基本数据类型和它们对应的封装类之间的转换。以前,我们可能需要手动将一个`int`类型转换成`Integer`,或者反过来,但...

    jdk 5.0 ban

    1. **泛型(Generics)**:JDK 5.0引入了泛型,允许开发者在类、接口和方法中定义类型参数,增强了类型安全,减少了强制类型转换,使代码更易读、更少出错。例如,ArrayList表示一个只存储字符串的列表。 2. **枚举...

    JDK5.0的11个主要新特征

    JDK5.0引入了枚举类型,这是一种特殊的类,用于定义一组固定的常量,提高了枚举的类型安全性和可编程性。 9. 前向引用(Forward References) 在枚举中,可以向前引用其他枚举常量,增强了枚举的灵活性。 10. ...

    ibm JDK5.0 fro linux

    ibm JDK5.0 fro linux,这个东西很难下的。

    JAVA(JDK5.0)学习笔记

    ### JAVA(JDK5.0)学习笔记:深入理解数组与对象的关系 在深入探讨JAVA(JDK5.0)中数组的特性和应用之前,我们首先需要认识到数组在Java中的地位和作用远超于传统编程语言中纯粹的数据集合概念。数组在Java中被视为...

    JDK5.0新特性(3)——枚举

    在Java编程语言中,JDK 5.0的发布带来了一系列重要的新特性,极大地提升了开发效率和代码质量。其中,枚举(Enum)是引入的一个关键特性,它为表示固定集合中的常量提供了强大而安全的支持。这篇博客将深入探讨JDK ...

    良葛格Java JDK 5.0学习笔记ch05

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。在这个"良葛格Java JDK 5.0学习笔记ch05"中,我们将深入探讨其中的关键知识点。 一、泛型 Java 5.0引入了...

    jdk5.0 资源下载

    1. 泛型(Generics):这是JDK5.0最显著的改进之一,泛型允许开发者在定义类、接口和方法时指定类型参数,增强了类型安全,减少了强制类型转换,并提高了代码的重用性。 2. 自动装箱/拆箱(Autoboxing and Unboxing...

    JDK5.0 新特性

    最后,JDK 5.0还引入了静态导入(Static Import),允许直接使用类的静态成员而无需指定类名,降低了代码的冗余,提高了代码的可读性。 总的来说,JDK 5.0的新特性显著地提升了Java编程的效率和代码质量,使得Java...

    JDK5.0API官方中文版(CHM)

    JDK5.0API官方中文版(CHM)--------part2

Global site tag (gtag.js) - Google Analytics