Generic Data Access Objects
普通数据访问对象这个是Hibernate官方网站上面的一个DAO类的设计模式基于JDK范型支持文章地址如下
我下面的代码与Hibernate官网上提供的有点不同
首先定义DAO类的接口IGenericDAO该接口定义了共同的CRUD操作
java 代码
/**
*定义通用的CRUD操作
*@authorrainlife
*/
public interface IGenericDAO 〈T ID extends Serializable〉
{
//通过主键标识查找某个对象
publicTfindById(IDid);
//通过主键标识查找某个对象可以锁定表中对应的记录
TfindById(IDidbooleanlock);
//得到所有的对象
ListfindAll();
//通过给定的一个对象查找与其匹配的对象
ListfindByExample(TexampleInstance);
//持久化对象
TmakePersistent(Tentity);
//删除对象
voidmakeTransient(Tentity);
}
下面是使用Hibernate针对该接口的实现GenericDAOHibernate
java 代码
/**
*这是针对IGenericDAO接口的Hibernate实现完成通用的CRUD操作
*@authorrainlife
*@paramPOJO类
*@paramPOJO类的主键标识符
*@param针对每一个POJO类的DAO类实现
*/
publicabstractclassGenericDAOHibernate 〈TID extendsSerializableDAOImplextendsIGenericDAO〈TID〉〉
implementsIGenericDAO〈TID〉
{
privateClasspersistentClass;
protectedSessionsession;
publicGenericDAOHibernate()
{
thispersistentClass=(Class)((ParameterizedType)getClass()
getGenericSuperclass())getActualTypeArguments()[];
}
@SuppressWarnings(unchecked)
publicDAOImplsetSession(Sessions)
{
thissession=s;
return(DAOImpl)this;
}
protectedSessiongetSession()
{
if(session==null)
thrownewIllegalStateException(
SessionhasnotbeensetonDAObeforeusage);
returnsession;
}
publicClassgetPersistentClass()
{
returnpersistentClass;
}
@SuppressWarnings(unchecked)
publicTfindById(IDid)
{
return(T)getSession()load(getPersistentClass()id);
}
@SuppressWarnings(unchecked)
publicTfindById(IDidbooleanlock)
{
Tentity;
if(lock)
entity=(T)getSession()load(getPersistentClass()idLockModeUPGRADE);
else
entity=findById(id);
returnentity;
}
@SuppressWarnings(unchecked)
publicListfindAll()
{
returnfindByCriteria();
}
@SuppressWarnings(unchecked)
publicListfindByExample(TexampleInstance)
{
Criteriacrit=getSession()createCriteria(getPersistentClass());
Exampleexample=Examplecreate(exampleInstance);
critadd(example);
returncritlist();
}
@SuppressWarnings(unchecked)
publicListfindByExample(TexampleInstanceString[]excludeProperty)
{
Criteriacrit=getSession()createCriteria(getPersistentClass());
Exampleexample=Examplecreate(exampleInstance);
for(Stringexclude:excludeProperty)
{
exampleexcludeProperty(exclude);
}
critadd(example);
returncritlist();
}
@SuppressWarnings(unchecked)
publicTmakePersistent(Tentity)
{
getSession()saveOrUpdate(entity);
//getSession()save(entity);
returnentity;
}
publicvoidmakeTransient(Tentity)
{
getSession()delete(entity);
}
@SuppressWarnings(unchecked)
protectedListfindByCriteria(Criterioncriterion)
{
Criteriacrit=getSession()createCriteria(getPersistentClass());
for(Criterionc:criterion)
{
critadd(c);
}
returncritlist();
}
@SuppressWarnings(unchecked)
/**
*增加了排序的功能
*/
protectedListfindByCriteria(OrderorderCriterioncriterion)
{
Criteriacrit=getSession()createCriteria(getPersistentClass());
for(Criterionc:criterion)
{
critadd(c);
}
if(order!=null)
critaddOrder(order);
returncritlist();
}
@SuppressWarnings(unchecked)
protectedListfindByCriteria(intfirstResultintrowCountOrderorderCriterioncriterion)
{
Criteriacrit=getSession()createCriteria(getPersistentClass());
for(Criterionc:criterion)
{
critadd(c);
}
if(order!=null)
critaddOrder(order);
critsetFirstResult(firstResult);
critsetMaxResults(rowCount);
returncritlist();
}
}
这样我们自己所要使用的DAO类就可以直接从这个Hibernate的DAO类继承
比如说我们定义一个IUserDAO接口该接口继承IGenericDAO:
java 代码
publicinterfaceIUserDAOextends IGenericDAO〈UserInteger〉
{
publicUserfind(StringusernameStringpassword);
publicUserfind(Stringusername);
}
该接口从IGenericDAO继承自然也就定义了IGenericDAO接口所定义的通用CRUD操作
再来看一下针对IUserDAO 的Hibernate实现UserDAOHibernate:
java 代码
public class UserDAOHibernate extends GenericDAOHibernate〈UserIntegerIUserDAO〉 implements IUserDAO {
publicUserfind(StringusernameStringpassword){
//此处省略具体代码
}
publicUserfind(Stringusername){
//此处省略具体代码
}
}
UserDAOHibernate继承GenericDAOHibernate并实现IUserDAO接口这样我们的UserDAOHibernate既拥有通用的CRUD操作也实现了针对用户的特定的业务操作
说明 由于范型的符号经过在线编辑器发布后
被过滤掉了
所以上面修改后的几个符号
都是我在中文状态下输入的