hibernate使用jpa對(duì)于基礎(chǔ)dao的封裝

一、dao的接口

package com.hm.dao;

import java.util.List;
import java.util.Map;

import com.hm.common.util.QueryParameter;

/**
 * 數(shù)據(jù)操作基類接口
 */
public interface BaseDAO<T, PK extends java.io.Serializable> {
    
    /**
     * 保存對(duì)象
     * @param entity    實(shí)體
     * @return          1:操作成功 0:操作失敗
     */
    public int save(T entity);
    
    /**
     * 更新對(duì)象信息
     * @param entity    實(shí)體
     * @return          1:操作成功 0:操作失敗
     */
    public int update(T entity);
    
    /**
     * 刪除對(duì)象
     * @param entity    實(shí)體
     * @return          >0:操作成功
     */
    public int delete(T entity );
    
    /**
     * 刪除對(duì)象
     * @param id        主鍵
     * @return          >0:操作成功
     */
    public int delete(PK id);
    
    /**
     * 根據(jù)ID獲取實(shí)體對(duì)象
     * @param id    ID主鍵
     * @return      實(shí)體
     */
    public T findById(PK id);

    /**
     * 根據(jù)EJB-QL查詢對(duì)象
     * @param queryString   QL語句
     * @return              數(shù)據(jù)集合
     */
    public List<T> findByQL(String queryString);

    /**
     * 根據(jù)EJB-QL查詢對(duì)象
     * @param queryString   QL語句
     * @param map           參數(shù)
     * @return              數(shù)據(jù)集合
     */
    public List<T> findByQL(String queryString, Map<String, Object> map);
    
    /**
     * 根據(jù)SQL查詢對(duì)象
     * @param queryString   SQL語句
     * @return              數(shù)據(jù)集合
     */
    public List<Object> findBySQL(String queryString);
    
    /**
     * 根據(jù)SQL查詢對(duì)象
     * @param queryString   SQL語句
     * @param map           參數(shù)
     * @return              數(shù)據(jù)集合
     */
    public List<Object> findBySQL(String queryString, Map<String, Object> map);
    
    /**
     * 根據(jù)EJB-QL返回對(duì)象記錄數(shù)
     * @param queryString   EJ-QL語句
     * @return              總記錄數(shù)
     */
    public int getCountByQL(String queryString);

    /**
     * 根據(jù)EJB-QL返回對(duì)象記錄數(shù)
     * @param queryString   EJ-QL語句
     * @param map           參數(shù)
     * @return              總記錄數(shù)
     */
    public int getCountByQL(String queryString, Map<String, Object> map);
    
    /**
     * 根據(jù)SQL返回對(duì)象記錄數(shù)
     * @param queryString   SQL語句
     * @return              總記錄數(shù)
     */
    public int getCountBySQL(String queryString);

    /**
     * 根據(jù)SQL返回對(duì)象記錄數(shù)
     * @param queryString   SQL語句
     * @param map           參數(shù)
     * @return              總記錄數(shù)
     */
    public int getCountBySQL(String queryString, Map<String, Object> map);

    /**
     * 根據(jù)SQL返回對(duì)象記錄數(shù)
     * @param queryString   SQL語句
     * @param map           參數(shù)
     * @return              總記錄數(shù)
     */
    public int getCountBySQL2(String queryString, Map<String, Object> map);
    
    /**
     * 根據(jù)EJB-QL查詢對(duì)象
     * @param queryString   QL語句
     * @param maxSize       最大數(shù)量
     * @param firstId       第一條記錄
     * @return              數(shù)據(jù)集合
     */
    public List<T> findByQL(String queryString, int maxSize, int firstId);

    /**
     * 根據(jù)EJB-QL查詢對(duì)象
     * @param queryString   QL語句
     * @param maxSize       最大數(shù)量
     * @param firstId       第一條記錄
     * @param map           參數(shù)
     * @return              數(shù)據(jù)集合
     */
    public List<T> findByQL(String queryString, int maxSize, int firstId, Map<String, Object> map);
    
    /**
     * 根據(jù)SQL查詢對(duì)象
     * @param queryString   SQL語句
     * @param maxSize       最大數(shù)量
     * @param firstId       第一條記錄
     * @return              數(shù)據(jù)集合
     */
    public List<Object> findBySQL(String queryString, int maxSize, int firstId);
    
    /**
     * 根據(jù)SQL查詢對(duì)象
     * @param queryString   SQL語句
     * @param maxSize       最大數(shù)量
     * @param firstId       第一條記錄
     * @param map           參數(shù)
     * @return              數(shù)據(jù)集合
     */
    public List<Object> findBySQL(String queryString, int maxSize, int firstId, Map<String, Object> map);
    
    /**
     * 執(zhí)行更新語句
     * @param queryString   EJ-QL語句
     * @return              影響記錄數(shù)
     */
    public int executeUpdateByQL(String queryString);

    /**
     * 執(zhí)行更新語句
     * @param queryString   EJ-QL語句
     * @param map           參數(shù)
     * @return              影響記錄數(shù)
     */
    public int executeUpdateByQL(String queryString, Map<String, Object> map);
    
    /**
     * 執(zhí)行更新語句
     * @param queryString   SQL語句
     * @return              影響記錄數(shù)
     */
    public int executeUpdateBySQL(String queryString);
    
    /**
     * 執(zhí)行更新語句
     * @param queryString   SQL語句
     * @param map           參數(shù)
     * @return              影響記錄數(shù)
     */
    public int executeUpdateBySQL(String queryString, Map<String, Object> map);

    /**
     * 執(zhí)行事務(wù)
     * @param queryParameterList    要執(zhí)行的QL語句集合
     * @return                      操作結(jié)果 true | false
     */
    public boolean executeTransactionalByQL(List<QueryParameter> queryParameterList);

    /**
     * 執(zhí)行事務(wù)
     * @param queryParameterList    要執(zhí)行的SQL語句集合
     * @return                      操作結(jié)果 true | false
     */
    public boolean executeTransactionalBySQL(List<QueryParameter> queryParameterList);
    
    /**
     * 根據(jù)HQL查詢對(duì)象
     * @param queryString   SQL語句
     * @param maxSize       最大數(shù)量
     * @param firstId       第一條記錄
     * @param map           參數(shù)
     * @return              數(shù)據(jù)集合
     */
    public List<Object> findObjectByQL(String queryString, int maxSize, int firstId, Map<String, Object> map);
}

二、dao的實(shí)現(xiàn)

package com.hm.dao.jpa;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.transaction.Transactional;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.hm.common.util.QueryParameter;
import com.hm.dao.BaseDAO;

/**
 * 數(shù)據(jù)操作基類實(shí)現(xiàn)類
 */
@SuppressWarnings("unchecked")
public class BaseDAOImpl<T, PK extends java.io.Serializable> implements BaseDAO<T, PK> {
    
    private static Log log;

    private Class<T> entityClass;

    @PersistenceContext
    private EntityManager entityManager;

    // @PersistenceContext
    private EntityManagerFactory entityManagerFactory;
    
    @PersistenceUnit
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.entityManagerFactory = emf;
    }

    /**
     * 構(gòu)造方法
     */
    public BaseDAOImpl(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    public Log getLog() {
        if(null == log) {
            log = LogFactory.getLog(this.getClass());
        }
        return log;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public Class<T> getEntityClass() {
        return entityClass;
    }

    public void setEntityClass(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    @Transactional
    public int save(T entity) {
        try {
            entityManager.persist(entity);
        } catch (Exception e) {
            getLog().error("保存對(duì)象發(fā)生異常:" +e.getMessage());
            return 0;
        }
        return 1;
    }

    @Transactional
    public int update(T entity) {
        try {
            entity = entityManager.merge(entity);
        } catch (Exception e) {
            getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
            return 0;
        } 
        return 1;
    }

    @Transactional
    public int delete(T entity) {
        try {
            entityManager.remove(entityManager.merge(entity));
            return 1;
        } catch (Exception e) {
            getLog().error("刪除對(duì)象發(fā)生異常:"+e.getMessage());
            return 0;
        }
    }

    @Transactional
    public int delete(PK id) {
        return this.delete(this.findById(id));
    }

    public T findById(PK id) {
        T entity = null;
        try {
            entity = entityManager.find(entityClass, id);
        } catch (Exception e) {
            getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        }
        return entity;
    }

    public List<T> findByQL(String queryString) {
        List<T> rList = new ArrayList<T>();
        try {
            rList = (List<T>)entityManager.createQuery(queryString).getResultList();
        } catch (Exception e) {
            getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }

    public List<T> findByQL(String queryString, Map<String, Object> map) {
        List<T> rList = new ArrayList<T>();
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            rList = (List<T>)q.getResultList();
        } catch (Exception e) {
            getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }
    
    public List<Object> findBySQL(String queryString) {
        List<Object> rList = new ArrayList<Object>();
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }
    
    public List<Object> findBySQL(String queryString, Map<String, Object> map) {
        List<Object> rList = new ArrayList<Object>();
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }

    public List<T> findByQL(String queryString, int maxSize, int firstId) {
        List<T> rList = new ArrayList<T>();
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            q.setMaxResults(maxSize);
            q.setFirstResult(firstId);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }

    public List<T> findByQL(String queryString, int maxSize, int firstId, Map<String, Object> map) {
        List<T> rList = new ArrayList<T>();
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            q.setMaxResults(maxSize);
            q.setFirstResult(firstId);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return rList;
    }
    
    public List<Object> findObjectByQL(String queryString, int maxSize, int firstId, Map<String, Object> map) {
        List<Object> rList = new ArrayList<Object>();
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            q.setMaxResults(maxSize);
            q.setFirstResult(firstId);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }
    
    public List<Object> findBySQL(String queryString, int maxSize, int firstId) {
        List<Object> rList = new ArrayList<Object>();
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            q.setMaxResults(maxSize);
            q.setFirstResult(firstId);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }
    
    public List<Object> findBySQL(String queryString, int maxSize, int firstId, Map<String, Object> map) {
        List<Object> rList = new ArrayList<Object>();
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            q.setMaxResults(maxSize);
            q.setFirstResult(firstId);
            rList = q.getResultList();
        } catch (Exception e) {
            this.getLog().error("獲取對(duì)象發(fā)生異常:"+e.getMessage());
        } 
        return rList;
    }

    public int getCountByQL(String queryString) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            intCount = ((Long)q.getSingleResult()).intValue();
        } catch (Exception e) {
            getLog().error("獲取對(duì)象總數(shù)發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }

    public int getCountByQL(String queryString, Map<String, Object> map) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            intCount = ((Long)q.getSingleResult()).intValue();
            
        } catch (Exception e) {
            getLog().error("獲取對(duì)象總數(shù)發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }
    
    public int getCountBySQL(String queryString) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            intCount = ((Integer)q.getSingleResult()).intValue();
        } catch (Exception e) {
            getLog().error("獲取對(duì)象總數(shù)發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }
    
    public int getCountBySQL(String queryString, Map<String, Object> map) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            intCount = ((Integer)q.getSingleResult()).intValue();
        } catch (Exception e) {
            getLog().error("獲取對(duì)象總數(shù)發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }

    public int getCountBySQL2(String queryString, Map<String, Object> map) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            String str  = q.getSingleResult().toString();
            intCount = Integer.parseInt(str);
        } catch (Exception e) {
            getLog().error("獲取對(duì)象總數(shù)發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }
    
    @Transactional
    public int executeUpdateByQL(String queryString) {
        int intCount = 0;
        try {
            intCount = this.getEntityManager().createQuery(queryString).executeUpdate();
        } catch (Exception e) {
            getLog().error("執(zhí)行更新語句發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }

    @Transactional
    public int executeUpdateByQL(String queryString, Map<String, Object> map) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            intCount = q.executeUpdate();
        } catch (Exception e) {
            getLog().error("執(zhí)行更新語句發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }

    @Transactional
    public int executeUpdateBySQL(String queryString) {
        int intCount = 0;
        try {
            intCount = this.getEntityManager().createNativeQuery(queryString).executeUpdate();
        } catch (Exception e) {
            getLog().error("執(zhí)行更新語句發(fā)生異常:"+e.getMessage());
        } 
        return intCount;
    }

    @Transactional
    public int executeUpdateBySQL(String queryString, Map<String, Object> map) {
        int intCount = 0;
        try {
            Query q = this.getEntityManager().createNativeQuery(queryString);
            if(null != map) {
                for (String key : map.keySet()) {
                    q.setParameter(key, map.get(key));
                }
            }
            intCount = q.executeUpdate();
        } catch (Exception e) {
            getLog().error("執(zhí)行更新語句發(fā)生異常:"+e.getMessage());
            e.printStackTrace();
        } 
        return intCount;
    }

    @Override
    public boolean executeTransactionalByQL(List<QueryParameter> queryParameterList) {
        if(null == queryParameterList || queryParameterList.isEmpty()) {
            return false;
        }
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try {
            //this.getEntityManager().getTransaction().begin();
            entityManager.getTransaction().begin();
            for(QueryParameter queryParameter : queryParameterList) {
                //Query q = this.getEntityManager().createQuery(queryParameter.getQueryString());
                Query q;
                if(StringUtils.indexOf(queryParameter.getQueryString(), "insert") >= 0 || queryParameter.getType() == "SQL")
                {
                    q = entityManager.createNativeQuery(queryParameter.getQueryString());
                }
                else 
                {
                    q = entityManager.createQuery(queryParameter.getQueryString());
                }
                if(null != queryParameter.getParameterMap()) {
                    for (String key : queryParameter.getParameterMap().keySet()) {
                        q.setParameter(key, queryParameter.getParameterMap().get(key));
                    }
                }
                q.executeUpdate();
            }
            //this.getEntityManager().getTransaction().commit();
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            getLog().error("執(zhí)行事務(wù)發(fā)生異常:"+e.getMessage());
            //this.getEntityManager().getTransaction().rollback();
            entityManager.getTransaction().rollback();
            e.printStackTrace();
            return false;
        } finally {
            entityManager.close();
        }
        return true;
    }

    @Override
    public boolean executeTransactionalBySQL(List<QueryParameter> queryParameterList) {
        if(null == queryParameterList || queryParameterList.isEmpty()) {
            return false;
        }
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try {
            //this.getEntityManager().getTransaction().begin();
            entityManager.getTransaction().begin();
            for(QueryParameter queryParameter : queryParameterList) {
                //Query q = this.getEntityManager().createQuery(queryParameter.getQueryString());
                Query q = entityManager.createNativeQuery(queryParameter.getQueryString());
                if(null != queryParameter.getParameterMap()) {
                    for (String key : queryParameter.getParameterMap().keySet()) {
                        q.setParameter(key, queryParameter.getParameterMap().get(key));
                    }
                }
                q.executeUpdate();
            }
            //this.getEntityManager().getTransaction().commit();
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            getLog().error("執(zhí)行事務(wù)發(fā)生異常:"+e.getMessage());
            //this.getEntityManager().getTransaction().rollback();
            entityManager.getTransaction().rollback();
            e.printStackTrace();
            return false;
        } finally {
            entityManager.close();
        }
        return true;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容