数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Generic Data Access Objects 设


发布日期:2021年05月06日
 
Generic Data Access Objects 设

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操作也实现了针对用户的特定的业务操作

说明 由于范型的符号经过在线编辑器发布后被过滤掉了所以上面修改后的几个符号都是我在中文状态下输入的

               

上一篇:多线程成共享数据方式

下一篇:使用SQLMaps 进行对象关系映射