`
Frederick
  • 浏览: 117959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个范型的Dao通用类

DAO 
阅读更多
        首先说明,这个东西最开始是我从网上找到的,但是不记得在那里找到的了。只是觉得非常有用,所以就根据我的需要做了修改,放在了这里,当作一个备忘录吧。

        这个是接口:

java 代码
  1. /**  
  2.  * @author Fred  
  3.  * Jun 25, 2007 5:52:47 PM  
  4.  */  
  5. public interface BaseDao\<T\><t></t><t></t> {   
  6.   
  7.     /**  
  8.      * 根据对象ID来查询对象。  
  9.      * @param id 对象ID。  
  10.      * @return 如果找到对应的对象,则返回该对象。如果不能找到,则返回null。  
  11.      */  
  12.     public T findById(Long id);      
  13.      
  14.     /**  
  15.      * 查询所有的指定对象。  
  16.      */       
  17.     public List<t></t><t></t> listAll();      
  18.        
  19.     /**  
  20.      * 查询,并指定起始的纪录和最大的查询结果集大小以及需要排序的属性和排序的方向。  
  21.      * @param startPos 起始纪录的序号。  
  22.      * @param amount 最大的查询结果集大小。  
  23.      * @param conditions 一个以属性名为key,以属性值为value的Map  
  24.      * @param sortableProperty 需要排序的属性。  
  25.      * @param desc 排序的方向。  
  26.      * @return 结果集。  
  27.      */  
  28.     public List<t></t><t></t> listAndSort(int startPos, int amount, Map conditions, String sortableProperty, boolean asc);   
  29.   
  30.     /**  
  31.      * 统计当前的总纪录数.  
  32.      */  
  33.     public Long countTotalAmount();   
  34.        
  35.     /**  
  36.      * 持久化指定的对象。  
  37.      * @param entity 将要持久化的对象。  
  38.      * @return 持久化以后的对象。  
  39.      */  
  40.     public T save(T entity);     
  41.        
  42.     /**  
  43.      * 在数据库中删除指定的对象。该对象必须具有对象ID。  
  44.      * @param entity 将要被删除的对象。  
  45.      */  
  46.     public void delete(T entity);   
  47.        
  48.     /**  
  49.      * 更新给定的对象。  
  50.      * @param entity 含有将要被更新内容的对象。  
  51.      * @return 更新后的对象。  
  52.      */  
  53.     public T update(T entity);   
  54.   
  55.     /**  
  56.      * 获取标志是否被删除的标志字段。如果是直接删除,返回 null  
  57.      */  
  58.     public String getDeleteToken();   
  59. }  

      然后是其实现类:

java 代码
  1.   
  2. /**  
  3.  * 范型化的BaseDao的实现,作为其他实际被Service层调用的Dao实现的基类。  
  4.  * @author Fred  
  5.  * Jun 25, 2007 5:56:38 PM  
  6.  */  
  7. public class BaseDaoImpl<t class="keyword"></t>extends Model> extends HibernateDaoSupport implements BaseDao<t></t><t></t> {   
  8.   
  9.     private Class<t></t> persistentClass;     
  10.        
  11.     protected static final String DEFAULT_INDEIRECTLY_DELETE_TOKEN = "disused";   
  12.        
  13.     /**  
  14.      * @return the persistentClass  
  15.      */  
  16.     public Class<t></t> getPersistentClass() {   
  17.         return this.persistentClass;   
  18.     }   
  19.        
  20.     /**  
  21.      * 默认构造函数,用于获取范型T的带有类型化信息的Class对象  
  22.      */  
  23.     @SuppressWarnings("unchecked")   
  24.     public BaseDaoImpl() {   
  25.         this.persistentClass = (Class<t></t>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];    
  26.     }   
  27.        
  28.     @SuppressWarnings("unchecked")   
  29.     public T findById(Long id) {   
  30.         return (T) this.getHibernateTemplate().get(this.getPersistentClass(), id);   
  31.     }   
  32.   
  33.     public List<t></t><t></t> listAll() {   
  34.         return this.findByCriteria();   
  35.     }   
  36.        
  37.     @Override  
  38.     public List<t></t><t></t> listAndSort(int startPos, int amount, Map conditions, String sortableProperty,   
  39.             boolean asc) {   
  40.         return this.listAndSort(this.getPersistentClass(), startPos, amount, conditions, sortableProperty, asc, false);   
  41.     }   
  42.        
  43.     @Override  
  44.     public Long countTotalAmount() {   
  45.         StringBuilder hql = new StringBuilder()   
  46.         .append("select count(obj.id) from ")   
  47.         .append(BaseDaoImpl.this.getPersistentClass().getSimpleName())   
  48.         .append(" obj ");   
  49.         if (BaseDaoImpl.this.getDeleteToken() != null) {   
  50.             hql.append("where obj.")   
  51.                .append(BaseDaoImpl.this.getDeleteToken())   
  52.                .append(" = false");   
  53.         }   
  54.         final String hqlString = hql.toString();    
  55.         return (Long) this.getHibernateTemplate().execute(new HibernateCallback() {   
  56.             @Override  
  57.             public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  58.                 Query query = session.createQuery(hqlString.toString());   
  59.                 return query.uniqueResult();   
  60.             }   
  61.         });   
  62.     }   
  63.   
  64.     public T save(T entity) {   
  65.         this.getHibernateTemplate().saveOrUpdate(entity);      
  66.         return entity;      
  67.     }   
  68.        
  69.     public T update(T entity) {   
  70.         this.getHibernateTemplate().update(entity);      
  71.         return entity;      
  72.     }   
  73.        
  74.     public void delete(T entity) {   
  75.         this.getHibernateTemplate().delete(entity);     
  76.     }   
  77.   
  78.     @SuppressWarnings("unchecked")      
  79.     protected List<t></t><t></t> findByCriteria(Criterion... criterion) {      
  80.         DetachedCriteria detachedCrit = DetachedCriteria      
  81.                 .forClass(getPersistentClass());      
  82.         for (Criterion c : criterion) {      
  83.             detachedCrit.add(c);      
  84.         }      
  85.         return getHibernateTemplate().findByCriteria(detachedCrit);      
  86.     }    
  87.        
  88.     /**  
  89.      * 查询,并指定起始的纪录和最大的查询结果集大小以及需要排序的属性和排序的方向。  
  90.      * @param clazz 要被查询的对象对应的Class 
  91.      * @param startPos 起始纪录的序号。  
  92.      * @param amount 最大的查询结果集大小。  
  93.      * @param conditions 一个以属性名为key,以属性值为value的Map  
  94.      * @param sortableProperty 需要排序的属性。  
  95.      * @param desc 排序的方向。  
  96.      * @return 结果集。  
  97.      */  
  98.     @SuppressWarnings("unchecked")   
  99.     protected List<t></t><t></t> listAndSort(Class<t></t> clazz, final int startPos, final int amount,    
  100.             final Map conditions, String sortableProperty, boolean asc, boolean getDisused) {   
  101.            
  102.         boolean hasCondition = false;   
  103.            
  104.         StringBuilder hql = new StringBuilder().append("from ").append(clazz.getSimpleName()).append(" obj ");   
  105.            
  106.         //是否查询被删掉的   
  107.         if (this.getDeleteToken() != null) {   
  108.             hasCondition = true;   
  109.             hql.append("where obj.")   
  110.                .append(this.getDeleteToken())   
  111.                .append(" ");   
  112.             if (getDisused) {   
  113.                 hql.append("is true ");   
  114.             } else {   
  115.                 hql.append("is false ");   
  116.             }   
  117.         }   
  118.            
  119.         //设置查询条件   
  120.         boolean needsAnd = false;   
  121.         if (!conditions.isEmpty()) {   
  122.             if (!hasCondition) {   
  123.                 hql.append("where ");   
  124.             } else {   
  125.                 needsAnd = true;   
  126.             }   
  127.         }   
  128.         for (String property : conditions.keySet()) {   
  129.             if (needsAnd) {   
  130.                 hql.append("and ");   
  131.             }   
  132.             hql.append("obj.").append(property).append(" = :").append(property).append(" ");   
  133.         }   
  134.            
  135.         //排序   
  136.         hql.append("order by ").append(" obj.").append(sortableProperty).append(" ");   
  137.         if (asc) {   
  138.             hql.append("asc");   
  139.         } else {   
  140.             hql.append("desc");   
  141.         }   
  142.            
  143.         //分页   
  144.         final String hqlString = hql.toString();   
  145.         return (List<t></t>) this.getHibernateTemplate().execute(new HibernateCallback() {    
  146.             @Override  
  147.             public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  148.                 Query query = session.createQuery(hqlString);   
  149.                 query.setFirstResult(startPos);   
  150.                 query.setMaxResults(amount);   
  151.                    
  152.                 //给查询条件赋值   
  153.                 for (String property : conditions.keySet()) {   
  154.                     query.setParameter(property, conditions.get(property));   
  155.                 }   
  156.                    
  157.                 return query.list();   
  158.             }   
  159.         });   
  160.     }   
  161.        
  162.     @Override  
  163.     public String getDeleteToken() {   
  164.         return null;   
  165.     }   
  166. }  

      最后,你的实际使用的Dao就可以继承这个基本的Dao实现,只需要添加在实际中需要的特定方法就可以了,对在基本的Dao实现中提供的方法可以直接使用,而且不用考虑类型问题。比如:

       我有一个UserDao,是作对用户对象的操作的:

       接口如下:

java 代码
  1. /**  
  2.  * @author Fred  
  3.  * Jun 26, 2007 12:16:47 AM  
  4.  */  
  5. public interface UserDao extends BaseDao<user></user><user></user> {   
  6.        
  7.     /**  
  8.      * 根据用户ID查找用户  
  9.      */  
  10.     public User find(String userId);   
  11. }  

      实现类如下:

java 代码
  1. /**  
  2.  * @author Fred  
  3.  * Jun 26, 2007 12:20:49 AM  
  4.  */  
  5. public class UserDaoImpl extends BaseDaoImpl<user></user><user></user> implements UserDao {   
  6.   
  7.     @SuppressWarnings("unchecked")   
  8.     public User find(final String userId) {   
  9.         return (User) this.getHibernateTemplate().execute(new HibernateCallback() {   
  10.             @Override  
  11.             public Object doInHibernate(Session session)   
  12.                     throws HibernateException, SQLException {   
  13.                 String hql = "from User user where user.userId = :userId";   
  14.                 Query query = session.createQuery(hql);   
  15.                 query.setString("userId", userId);   
  16.                 return query.uniqueResult();   
  17.             }   
  18.         });   
  19.     }   
  20.        
  21.     @Override  
  22.     public String getDeleteToken() {   
  23.         return "expired";   
  24.     }   
  25. }   

 

      我们的这个UserDaoImpl没有提供对

java 代码
  1. public User findById(Long id);     

      这样的方法的实现,但是通过

java 代码
  1. public class UserDaoImpl extends BaseDaoImpl<user></user> implements UserDao {   
  2.     ......   
  3. }  

      这样的继承,我们的UserDaoImpl一样拥有了这样的方法。

分享到:
评论

相关推荐

    第9章 范型和容器类.ppt

    在示例中,我们创建了两个容器,一个Set用于存储字符串,另一个List用于存储整数。通过调用add()方法添加元素,然后使用size()方法获取容器中元素的数量,最后通过System.out.println()打印出容器内容。 在遍历容器...

    C++多范型设计

    这本书的核心主题是C++中的泛型编程,它是C++编程中一个极其重要的概念,能够实现代码的高效复用和抽象化。 C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据...

    范型程序设计与 STL.pdf

    《范型程序设计与 STL》是一本深入探讨C++编程中的关键概念和技术的书籍,主要聚焦于范型(Generic Programming)和标准模板库(Standard Template Library,简称STL)。范型编程是一种强大的软件开发方法,它允许...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型中,数据通过消息形式在发送者(sender)和接收者(receiver)之间进行交换。消息传递机制的优点在于它的异步性质,能够支持分布式...

    C++ 多范型设计

    2. 类模板:类模板则允许我们创建一个可以适用于多种数据类型的类。例如,`template, typename Value&gt; class HashMap` 定义了一个哈希映射类,其中键和值可以是任何类型。类模板创建的实例称为模板特例化,每个不同...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...

    一个很好的范型立例题

    Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...

    Java 范型Java 范型.doc

    Java 范型Java 范型

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    分布式系统原理与范型

    《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...

    c++多范型设计

    标题中的“C++多范型设计”指的是C++编程语言中的多范型(Multimodality)特性,这是C++的一个关键概念,它允许程序员在不同的抽象级别上编写代码,以适应不同场景的需求。C++的多范型主要包括模板(Templates)、...

    C++多范型设计(pdg)

    C++多范型设计是C++编程语言中的一个重要概念,它允许程序员在不指定具体类型的情况下编写代码,从而实现代码的通用性和复用性。这种设计模式极大地提升了软件的灵活性和可扩展性,使得程序能够适应不同的数据类型,...

    范型编程与设计模式之应用

    2. **函数模板**:函数模板允许定义一个通用的函数,该函数可以处理多种数据类型。例如,`swap()`函数模板可以交换任意类型的数据,只需编译器在运行时自动推断数据类型即可。 3. **类模板**:类模板是用于创建具有...

    分布式系统原理与范型答案(第二版)答案

    分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...

    C++ 多范型设计.rar

    类模板定义了一个通用的类骨架,用户可以通过不同的类型参数来实例化这些类,以满足不同需求。 多范型设计还涉及到模板特化(template specialization)。在某些情况下,我们可能希望为特定的数据类型提供定制的...

    C++多范型设计 作者:[美]James O.Coplien

    书名:C++多范型设计 作者:[美]James O.Coplien 译者: 出版社:中国电力出版社 本书详细地介绍了从“应用领域”到“方案领域”的C++设计实现方法,以及开发者在设计思考和设计实践过程中需要用到的记法、图表和设计...

Global site tag (gtag.js) - Google Analytics