Generic Data Access Objects 设计模式

2016-02-19 19:11 3 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是Generic Data Access Objects 设计模式,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

Generic Data Access Objects

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

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

首先定义DAO类的接口IGenericDAO,该接口定义了共同的CRUD操作:?XML:NAMESPACE PREFIX = O />

Java 代码 /**   * 定义通用的CRUD操作   * @author rainlife   */   public interface IGenericDAO 〈T, ID extends Serializable〉 {   //  通过主键标识查找某个对象。       public T findById(ID id);          //  通过主键标识查找某个对象,可以锁定表中对应的记录。       T findById(ID id, boolean lock);          //得到所有的对象。       List findAll();          //通过给定的一个对象,查找与其匹配的对象。       List findByExample(T exampleInstance);          //持久化对象。       T makePersistent(T entity);          //删除对象。       void makeTransient(T entity);   }  

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

java 代码 /**   * 这是针对IGenericDAO接口的Hibernate实现,完成通用的CRUD操作。   * @author rainlife   * @param  POJO类   * @param   POJO类的主键标识符   * @param  针对每一个POJO类的DAO类实现    */   public abstract class GenericDAOHibernate 〈T,ID extends Serializable, DAOImpl extends IGenericDAO〈T,ID〉〉         implements IGenericDAO〈T,ID〉 {       private Class persistentClass;          protected Session session;          public GenericDAOHibernate()       {           this.persistentClass = (Class) ((ParameterizedType) getClass()                   .getGenericSuperclass()).getActualTypeArguments()[0];       }          @SuppressWarnings("unchecked")       public DAOImpl setSession(Session s)       {           this.session = s;           return (DAOImpl)this;       }          protected Session getSession()       {           if (session == null)               throw new IllegalStateException(                       "Session has not been set on DAO before usage");           return session;       }          public Class getPersistentClass()       {           return persistentClass;       }                 @SuppressWarnings("unchecked")       public T findById(ID id)       {           return (T) getSession().load(getPersistentClass(), id);       }              @SuppressWarnings("unchecked")       public T findById(ID id, boolean lock)       {           T entity;           if (lock)               entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);           else               entity = findById(id);              return entity;       }          @SuppressWarnings("unchecked")       public List findAll()       {           return findByCriteria();       }          @SuppressWarnings("unchecked")       public List findByExample(T exampleInstance)       {           Criteria crit = getSession().createCriteria(getPersistentClass());           Example example = Example.create(exampleInstance);           crit.add(example);           return crit.list();       }              @SuppressWarnings("unchecked")       public List findByExample(T exampleInstance, String[] excludeProperty)       {           Criteria crit = getSession().createCriteria(getPersistentClass());           Example example = Example.create(exampleInstance);           for (String exclude : excludeProperty)           {               example.excludeProperty(exclude);           }           crit.add(example);           return crit.list();       }          @SuppressWarnings("unchecked")       public T makePersistent(T entity)       {           getSession().saveOrUpdate(entity);           //getSession().save(entity);           return entity;       }          public void makeTransient(T entity)       {           getSession().delete(entity);       }          @SuppressWarnings("unchecked")       protected List findByCriteria(Criterion... criterion)       {           Criteria crit = getSession().createCriteria(getPersistentClass());           for (Criterion c : criterion)           {               crit.add(c);           }           return crit.list();       }              @SuppressWarnings("unchecked")       /**       * 增加了排序的功能。       */       protected List findByCriteria(Order order,Criterion... criterion)       {           Criteria crit = getSession().createCriteria(getPersistentClass());           for (Criterion c : criterion)           {               crit.add(c);           }           if(order!=null)               crit.addOrder(order);           return crit.list();       }              @SuppressWarnings("unchecked")       protected List findByCriteria(int firstResult,int rowCount,Order order,Criterion... criterion)       {           Criteria crit = getSession().createCriteria(getPersistentClass());           for (Criterion c : criterion)           {               crit.add(c);           }           if(order!=null)               crit.addOrder(order);           crit.setFirstResult(firstResult);           crit.setMaxResults(rowCount);           return crit.list();       }   }  

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

!-- frame contents --!-- /frame contents -- java 代码public interface IUserDAO extends IGenericDAO〈User,Integer〉 {       public User find(String username,String passWord);       public User find(String username);   }  

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

来源:https://www.tulaoshi.com/n/20160219/1620236.html

延伸阅读
标签: PHP
转自:http://www.cnblogs.com/team/DesignPattern.html 1、 FACTORY 一追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德基就是生产鸡翅的Factory     工厂模式 :客户类和工厂类分开。消费...
Smo是SqlServer Management Objects的简称,由SQL2005提供的管理对象,sql-dmo的逻辑进化版本,主要功能由C:Program FilesMicrosoft SQL Server90SDKAssemblies下面的Microsoft.SqlServer.Smo.dll文件中的相关 对象来实现,可以直接由vs2005开发的程序来引用。 msdn参考文档: http://msdn.microsoft.com/en-us/library/microso...
上节提示:在前两节中我们主要介绍了建立表及查询的方法和步骤,它们是为窗口设计作数据准备的,下面我们将介绍窗口设计的具体步骤。 此次试卷的设计中共有5个窗体,现分别做详细说明。 一、选择题窗体 它是考生做选择题的窗口,建立过程如下:单击图1中的下面的,再单击按钮,在打开的对话框中使用默认的选项,单击右...
上节提示:在前两节中我们主要介绍了建立表及查询的方法和步骤,它们是为窗口设计作数据准备的,下面我们将介绍窗口设计的具体步骤。 此次试卷的设计中共有5个窗体,现分别做详细说明。 一、选择题窗体 它是考生做选择题的窗口,建立过程如下:单击图1中的【对象】下面的【窗体】,再单击【新建】按钮,在打开的【新建窗体...
对于教师来说,如何编制联机试卷,如何实现考试的无纸化,是目前比较关心的事情。本人采用Microsoft Access 2000编制的试卷,具有通用性强、界面友好美观、易于修改扩充等优点,愿与大家分享。 系统简介 在Access中,把以往传统的数据库称为表,即表由标题字段(库结构)及各条记录组成,表与对表的各种操作如查询、生成窗体、...

经验教程

70

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部