Generic Data Access Objects 設計模式
更新時間: 2007-05-24 11:23:28來源: 粵嵌教育瀏覽量:723
Generic Data Access Objects
普通數(shù)據(jù)訪問對象,這個是Hibernate官方網(wǎng)站上面的一個DAO類的設計模式,基于JDK5.0范型支持,文章地址如下:
http://www.hibernate.org/328.html
我下面的代碼與Hibernate官網(wǎng)上提供的有點不同。
首先定義DAO類的接口IGenericDAO,該接口定義了共同的CRUD操作:
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針對該接口的實現(xiàn)GenericDAOHibernate:
java 代碼
/**
* 這是針對IGenericDAO接口的Hibernate實現(xiàn),完成通用的CRUD操作。
* @author rainlife
* @param POJO類
* @param POJO類的主鍵標識符
* @param 針對每一個POJO類的DAO類實現(xiàn)
*/
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:
java 代碼
public interface IUserDAO extends IGenericDAO〈User,Integer〉
{
public User find(String username,String password);
public User find(String username);
}
該接口從IGenericDAO繼承,自然也就定義了IGenericDAO接口所定義的通用CRUD操作。
再來看一下針對IUserDAO 的Hibernate實現(xiàn)UserDAOHibernate:
java 代碼
public class UserDAOHibernate extends GenericDAOHibernate〈User,Integer,IUserDAO〉 implements IUserDAO {
public User find(String username, String password) {
//此處省略具體代碼
}
public User find(String username) {
//此處省略具體代碼
}
}
UserDAOHibernate繼承GenericDAOHibernate并實現(xiàn)IUserDAO接口,這樣,我們的UserDAOHibernate既擁有通用的CRUD操作,也實現(xiàn)了針對用戶的特定的業(yè)務操作。
說明 :由于范型的符號經(jīng)過在線編輯器發(fā)布后,被過濾掉了,所以上面修改后的幾個符號,都是我在中文狀態(tài)下輸入的。
推薦閱讀
- ·Linux字符設備驅動框架解析:file_operations的核心作用與實現(xiàn)
- ·廣東朝歌數(shù)碼科技股份有限公司專場招聘會
- ·深化產(chǎn)教融合,共筑技能人才培養(yǎng)新生態(tài) —— 廣州華立學院到訪粵嵌從化校區(qū)為深化產(chǎn)教
- ·校企合作新突破 | 粵嵌科技與三亞學院共探產(chǎn)教融合新路徑
- ·粵嵌科技入選國家級職業(yè)數(shù)字展館聯(lián)合建設單位,賦能計算機程序設計員高技能人才培養(yǎng)
- ·嵌入式實時操作系統(tǒng)的性能優(yōu)化與實現(xiàn)路徑
- ·校企攜手賦能教育!粵嵌科技助力海南科技職業(yè)大學探索 AGI 時代教學新范式
- ·嵌入式系統(tǒng)中的低功耗設計策略與實現(xiàn)路徑
- ·深圳市軒宇軟件開發(fā)有限公司專場招聘會
- ·嵌入式系統(tǒng)中的代碼空間優(yōu)化:策略與實踐