一、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;
}
}