Generic Data Access Objects 设计模式

温柔D狼

温柔D狼

2016-02-19 19:11

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

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

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

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

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)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:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)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类继续:

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

展开更多 50%)
分享

猜你喜欢

Generic Data Access Objects 设计模式

编程语言 网络编程
Generic Data Access Objects 设计模式

Add data to the Access database using ADO

编程语言 网络编程
Add data to the Access database using ADO

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Data 控件使用有密码的 Access 数据库

编程语言 网络编程
Data 控件使用有密码的 Access 数据库

使用Data Access Application Block 得到存储过程的返回值

Web开发
使用Data Access Application Block 得到存储过程的返回值

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

.NET 的数据访问应用程序块(Data Access Application Block)

电脑网络
.NET 的数据访问应用程序块(Data Access Application Block)

Data Access Application Block V2 类库中文文档(转贴 )

电脑网络
Data Access Application Block V2 类库中文文档(转贴 )

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

新手学堂:rs.open与conn.execute详细解释

新手学堂:rs.open与conn.execute详细解释

win10如何设置专用网络和公用网络

win10如何设置专用网络和公用网络
下拉加载更多内容 ↓