熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Generic Data Access Objects 設

2022-06-13   來源: Java高級技術 

Generic Data Access Objects

  普通數據訪問對象這個是Hibernate官方網站上面的一個DAO類的設計模式基於JDK范型支持文章地址如下

  我下面的代碼與Hibernate官網上提供的有點不同

  首先定義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針對該接口的實現GenericDAOHibernate


java 代碼

 

    /** 
     * 這是針對IGenericDAO接口的Hibernate實現完成通用的CRUD操作 
     * @author rainlife 
     * @param  POJO類 
     * @param   POJO類的主鍵標識符 
     * @param  針對每一個POJO類的DAO類實現  
     */  
    public abstract class GenericDAOHibernate 〈TID extends Serializable DAOImpl extends IGenericDAO〈TID〉〉
            implements IGenericDAO〈TID〉
    {  
        private Class persistentClass;  
      
        protected Session session;  
      
        public GenericDAOHibernate()  
        {  
            thispersistentClass = (Class) ((ParameterizedType) getClass()  
                    getGenericSuperclass())getActualTypeArguments()[];  
        }  
      
        @SuppressWarnings(unchecked)  
        public DAOImpl setSession(Session s)  
        {  
            thissession = 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 LockModeUPGRADE);  
            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 = Examplecreate(exampleInstance);  
            critadd(example);  
            return critlist();  
        }  
          
        @SuppressWarnings(unchecked)  
        public List findByExample(T exampleInstance String[] excludeProperty)  
        {  
            Criteria crit = getSession()createCriteria(getPersistentClass());  
            Example example = Examplecreate(exampleInstance);  
            for (String exclude : excludeProperty)  
            {  
                exampleexcludeProperty(exclude);  
            }  
            critadd(example);  
            return critlist();  
        }  
      
        @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)  
            {  
                critadd(c);  
            }  
            return critlist();  
        }  
          
        @SuppressWarnings(unchecked)  
        /** 
         * 增加了排序的功能 
         */  
        protected List findByCriteria(Order orderCriterion criterion)  
        {  
            Criteria crit = getSession()createCriteria(getPersistentClass());  
            for (Criterion c : criterion)  
            {  
                critadd(c);  
            }  
            if(order!=null)  
                critaddOrder(order);  
            return critlist();  
        }  
          
        @SuppressWarnings(unchecked)  
        protected List findByCriteria(int firstResultint rowCountOrder orderCriterion criterion)  
        {  
            Criteria crit = getSession()createCriteria(getPersistentClass());  
            for (Criterion c : criterion)  
            {  
                critadd(c);  
            }  
            if(order!=null)  
                critaddOrder(order);  
            critsetFirstResult(firstResult);  
            critsetMaxResults(rowCount);  
            return critlist();  
        }  
    }  

  這樣我們自己所要使用的DAO類就可以直接從這個Hibernate的DAO類繼承

  比如說我們定義一個IUserDAO接口該接口繼承IGenericDAO:


java 代碼

    public interface IUserDAO extends IGenericDAO〈UserInteger〉
    {  
        public User find(String usernameString password);  
        public User find(String username);  
    }  

  該接口從IGenericDAO繼承自然也就定義了IGenericDAO接口所定義的通用CRUD操作

  再來看一下針對IUserDAO 的Hibernate實現UserDAOHibernate:


java 代碼

    public class UserDAOHibernate extends GenericDAOHibernate〈UserIntegerIUserDAO〉 implements IUserDAO {      

      
        public User find(String username String password) {  
            //此處省略具體代碼  
        }  
      
        public User find(String username) {  
            //此處省略具體代碼  
        }  
    }  

  UserDAOHibernate繼承GenericDAOHibernate並實現IUserDAO接口這樣我們的UserDAOHibernate既擁有通用的CRUD操作也實現了針對用戶的特定的業務操作

說明 由於范型的符號經過在線編輯器發布後被過濾掉了所以上面修改後的幾個符號都是我在中文狀態下輸入的


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27427.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.