`
zengbo0710
  • 浏览: 415295 次
社区版块
存档分类
最新评论

Generic Data Access Objects

阅读更多

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操作,也实现了针对用户的特定的业务操作。

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

分享到:
评论

相关推荐

    VC++ 中ADO数据库的配置(Access2003-Access2007)

    在VC++中使用ADO(ActiveX Data Objects)与Access数据库进行交互是常见的数据访问技术,尤其是在开发Windows桌面应用程序时。本文将详细介绍如何配置VC++项目,使其能够连接和操作Access 2003到Access 2007的数据库。...

    动态创建access数据库

    本文介绍了一种利用ADOX(ActiveX Data Objects Extensions)技术来动态创建Access数据库的方法。ADOX是一种扩展了ADO(ActiveX Data Objects)的技术,主要用于管理数据库对象,如表、索引等。 #### 三、动态创建...

    advanced and generic programming in abap

    REFERENCETYPE REFTO typename FOR references to arbitrary data objects ADATA: dref TYPE |LIKE &lt;data_object&gt;. GET REFERENCE OF DataObject INTO dref. IF Reference is typed? X = dref-&gt;*. Y = dref-&gt;comp...

    R for beginner

    - **Indexing System**: Access elements of an object using indexing (e.g., `data[1,2]` to access the element in the first row and second column of a matrix). - **Accessing Values with Names**: Use ...

    C#动态创建Access数据库及表的方法

    //Microsoft ActiveX Data Objects 2.8 Library   using System; using System.Collections.Generic; using System.Linq; using System.Text; using ADOX; using System.IO; namespace WebRequestT

    python3.6.5参考手册 chm

    Data Instead Of Unicode Vs. 8-bit Overview Of Syntax Changes New Syntax Changed Syntax Removed Syntax Changes Already Present In Python 2.6 Library Changes PEP 3101: A New Approach To String ...

    Visual C++ 编程资源大全(英文源码 数据库)

    1,01.zip Calling Stored Procedures 调用存储过程(8KB)&lt;END&gt;&lt;br&gt;2,02.zip Create Access data source name dynamically 动态创建Access的数据源名(5KB)&lt;END&gt;&lt;br&gt;3,03.zip Using DAO to read data ...

    ZeosDBO

    4.1PostgreSQL 6.5 - 7.4Firebird 1.0 - 1.5Interbase 5.0 - 7.5Microsoft SQL Server 7, 2000Sybase ASE 12.0, 12.5Oracle 9iSQLite 2.8For other databases we propose to use implemented Active Data Objects ...

    在VC++中建立自定义数据库类

    MFC提供了CDAO(Microsoft Data Access Objects)类库,包括CdaoDatabase、CdaoTableDef、CdaoRecordset和CdaoQueryDef等类,用于数据库的连接、表的操作、记录集的获取和查询定义。然而,MFC的标准向导只适用于基于...

    Swift.3.Object.Oriented.Programming.2nd.epub

    You'll work with examples so you understand how to encapsulate and hide data by working with properties and access control. Then, you'll get to grips with complex scenarios where you use instances ...

    Python 3.7.3

    Python 3.7.3 is the third maintenance ...The insertion-order preservation nature of dict objects is now an official part of the Python language spec. Notable performance improvements in many areas.

    delphi XE8编写的DataSnap三层框架

    在DataSnap中,通常会使用ADO(ActiveX Data Objects)来连接和操作数据库。ADODataSnap1可能指的是包含数据库连接和查询的组件或代码文件,它封装了与数据库的交互,使得业务逻辑层可以专注于业务规则,而不是底层...

    Exploring C++ 11

    Next, you’ll learn to work with operators, objects and data-sources in increasingly realistic situations. Finally, you’ll start putting the pieces together to create sophisticated programs of your ...

    Program in LUA 2nd Edition.rar

    II Tables and Objects 95 11 Data Structures 97 11.1 Arrays 97 Property of Ian Bloss ix 11.2 Matrices and Multi-Dimensional Arrays 98 11.3 Linked Lists 100 11.4 Queues and Double Queues 100 ...

    acpi控制笔记本风扇转速

    Implemented a generic batch command mode for the AcpiExec utility (execute any AML debugger command) (Valery Podrezov). ---------------------------------------- 12 September 2006. Summary of changes ...

    python-3.7.4-docs-pdf-letter.zip

    python3.7.4官方文档。Python 3.7.4 is the ...The insertion-order preservation nature of dict objects is now an official part of the Python language spec;Notable performance improvements in many areas.

    Beginning Microsoft Visual CSharp 2008 Wiley Publishing(english)

    Part IV: Data Access 812 Chapter 24: File System Data 814 Streams 815 The Classes for Input and Output 815 Serialized Objects 842 Monitoring the File Structure 847 Summary 855 ...

    Swift 3 Object Oriented Programming, 2nd Edition [PDF]

    You'll work with examples so you understand how to encapsulate and hide data by working with properties and access control. Then, you'll get to grips with complex scenarios where you use instances ...

Global site tag (gtag.js) - Google Analytics