1、DAO接口
/**
* 数据库通用操作基类接口
*/
public interface IObjectDao<T> extends Serializable {
/**
* 不需确定新建实体是否已经存在
*/
public T save(T t);
/**
* 不需确定新建实体是否已经存在
*/
public Collection<T> save(Collection<T> ts);
/**
* 可确定为新建实体;返回处于托管状态的实例
*/
public T persist(T t);
public boolean persist(Collection<T> ts);
/**
* 若数据库中已有此记录,置为托管状态
*/
public T merge(T t);
/**
* 若数据库中已有此记录,置为托管状态
*/
public Collection<T> merge(Collection<T> t);
/**
* 删除
*/
public void remove(T t);
/**
* 批量删除 传入集合
*/
public void remove(Collection<T> ts);
/**
* 删除指定id、指定class的实例
*/
public void remove(Class<T> clazz, String id);
/**
* 删除指定id、指定class的实例
*/
public void remove(Class<T> clazz, Collection<String> ids);
/**
* 清除一级缓存
*/
public void clear();
/**
* 将对象置为游离状态
*/
public void detach(T t);
/**
* 将对象置为游离状态
*/
public void detach(Collection<T> ts);
/**
* 检查实例是否处于托管状态
*/
public boolean isManaged(T t);
/**
* 同步jpa容器和数据库
*/
public void flush();
接口的实现类
package cn.jjsoft.bp.dao.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import org.springframework.stereotype.Component;
import cn.jjsoft.bp.dao.IObjectDao;
import cn.jjsoft.bp.model.BaseModel;
import cn.jjsoft.bp.model.Company;
import cn.jjsoft.bp.web.PageResult;
import cn.jjsoft.util.ObjectUtil;
/**
* 数据库通用操作基类 包含共同方法
*/
@Component("objectDao")
public class ObjectDaoImpl<T extends BaseModel> implements IObjectDao<T> {
private static final long serialVersionUID = -4988809011506973125L;
public EntityManager entityManager;
/**
* 不需确定新建实体是否已经存在
*/
@Override
public T save(T t) throws RuntimeException {
try {
t = entityManager.contains(t) ? t : entityManager.merge(t);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("保存失败,请联系管理员!");
}
return t;
}
/**
* 不需确定新建实体是否已经存在 传入对象集合
*/
@Override
public Collection<T> save(Collection<T> ts) {
Collection<T> collection = new HashSet<T>();
for (T t : ts) {
collection.add(save(t));
}
return collection;
}
/**
* 可确定为新建实体
*/
@Override
public T persist(T t) throws RuntimeException {
try {
entityManager.persist(t);
return t;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("错误:保存新建实例时,发生异常:" + e.getMessage());
}
}
/**
* 可确定为新建实体 成功返回true 失败返回false
*/
@Override
public boolean persist(Collection<T> ts) {
try {
for (T t : ts) {
entityManager.persist(t);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 若数据库中已有此记录,置为托管状态并刷新实体信息
*/
@Override
public T merge(T t) throws RuntimeException {
try {
t = entityManager.contains(t) ? t : entityManager.merge(t);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("更新失败,请联系管理员!");
}
return t;
}
/**
* 若数据库中已有此记录,置为托管状态
*/
@Override
public Collection<T> merge(Collection<T> ts) {
Collection<T> collection = new HashSet<T>();
for (T t : ts) {
collection.add(merge(t));
}
return collection;
}
/**
* 删除
*/
@Override
public void remove(T t) {
if (null == t || isEmpty(t.getId())) {
throw new RuntimeException("传入条件错误!");
}
if (entityManager.contains(t)) {
entityManager.remove(t);
} else {
Object object = entityManager.find(t.getClass(), t.getId());
if (null == object) {
throw new RuntimeException("删除数据不存在!");
}
entityManager.remove(object);
}
}
/**
* 批量删除 传入集合
*/
@Override
public void remove(Collection<T> ts) {
for (T t : ts) {
remove(t);
}
}
/**
* 删除
*/
@Override
public void remove(Class<T> clazz, String id) {
if (isEmpty(id)) {
throw new RuntimeException("请求删除的对象为空!");
}
entityManager.remove(entityManager.find(clazz, id));
}
/**
* 删除
*/
@Override
public void remove(Class<T> clazz, Collection<String> ids) {
for (String id : ids) {
remove(clazz, id);
}
}
/**
* 若数据库中存在,返回最新状态;否则,返回空
*
* @param clazz
* @param t
* @param id
* @return
*/
@Override
public T refresh(Class<T> clazz, T t) throws RuntimeException {
if (null == t || isEmpty(t.getId())) {
throw new RuntimeException("请求刷新的实体为空!");
}
if (entityManager.contains(t)) {
entityManager.refresh(t);
return t;
} else {
return entityManager.find(clazz, t.getId());
}
}
/**
* 清除一级缓存
*/
@Override
public void clear() {
entityManager.clear();
}
/**
* 将对象置为游离状态
*/
@Override
public void detach(T t) {
entityManager.detach(t);
}
/**
* 将对象置为游离状态
*/
@Override
public void detach(Collection<T> ts) {
for (T t : ts) {
detach(t);
}
}
/**
* 判断实体是否处于托管状态
*/
@Override
public boolean isManaged(T t) {
return entityManager.contains(t);
}
/**
* 同步jpa容器和数据库
*/
@Override
public void flush() {
entityManager.flush();
}
DataBaseTool
<span style="font-size:10px;">public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
/**
* 判断一个字符串是否为空
*/
protected boolean isEmpty(String string) {
return null == string || string.trim().equals("") ? true : false;
}
/**
* 判断company是否为空
*/
protected boolean isEmpty(Company company) {
return null == company || isEmpty(company.getId()) ? true : false;
}
/**
* 日期转换 :将java.util.Date类型转换为java.sql.Date
*/
protected java.sql.Date getSqlDate(java.util.Date date) {
Long times = date.getTime();
java.sql.Date sqlDate = new java.sql.Date(times);
return sqlDate;
}
/**
* 无条件查询 对象集 + 总数
*/
protected PageResult<T> getResult(CriteriaQuery<T> cq, CriteriaQuery<Long> cqCount, int start,
int pageSize) {
return getResult(cq, null, cqCount, null, start, pageSize);
}
/**
* 统计符合条件的总数
*/
protected long getResultCountQuery(CriteriaQuery<Long> cqCount, List<Predicate> predicatesCount) {
if (null != predicatesCount) {
cqCount.where(predicatesCount.toArray(new Predicate[0]));
}
try {
// 查询符合条件的数据总数
return getEntityManager().createQuery(cqCount).getSingleResult();
} catch (Exception e) {
return 0;
}
}
/**
* 查询对象集
*/
protected PageResult<T> getResultQuery(CriteriaQuery<T> cq, List<Predicate> predicates,
int start, int pageSize) {
return getResult(cq, predicates, null, null, start, pageSize);
}
/**
* 数据查询
*
* @param start
* 数据起始游标值
* @param pageSize
* 分页大小
* @param pageResult
* 结果集封装对象
* @param cq
* 数据查询
* @param cqCount
* 符合条件的总条数
* @return
*/
protected PageResult<T> getResult(CriteriaQuery<T> cq, List<Predicate> predicates,
CriteriaQuery<Long> cqCount, List<Predicate> predicatesCount, int start, int pageSize) {
PageResult<T> pageResult = new PageResult<T>();
if (null != cqCount) {
if (null != predicatesCount) {
cqCount.where(predicatesCount.toArray(new Predicate[0]));
}
try {
// 查询符合条件的数据总数
long total = getEntityManager().createQuery(cqCount).getSingleResult();
// 如果结果总数超过了Integer的最大值 则Integer的返回最大值
pageResult.setTotalCount(total <= Integer.MAX_VALUE ? (int) total
: Integer.MAX_VALUE);
} catch (Exception e) {
// e.printStackTrace();
pageResult.setTotalCount(0);
}
}
// 判断分页
if (start > pageResult.getTotalCount() && pageSize > 0) {
int newIndex = pageResult.getTotalCount() % pageSize == 0 ? pageResult.getTotalCount()
/ pageSize : pageResult.getTotalCount() / pageSize + 1;
start = (newIndex - 1) * pageSize;
pageResult.setChangeIndex(newIndex);
pageResult.setFirst(start);
pageResult.setPageSize(pageSize);
}
if (null == cq) {
return pageResult;
}
if (null != predicates) {
cq.where(predicates.toArray(new Predicate[0]));
}
// 分页查询
TypedQuery<T> tq = entityManager.createQuery(cq);
if (start >= 0 && pageSize > 0) {
tq.setFirstResult(start).setMaxResults(pageSize);
}
pageResult.setPageResultList(tq.getResultList());
return pageResult;
}
/**
* 返回指定类的静态元模型名称
*
* @param clazz
* @return
*/
protected String getStaticMetamodelName(Class<T> clazz) {
return clazz.getName() + "_";
}
/**
* 根据company Id查找单个对象
*
* @param company
* company不能为空,若为空以异常处理
* @param clazz
* 查询数据类型
* @param id
* @return
* @throws RuntimeException
*/
protected T findById(Company company, Class<T> clazz, String id) throws RuntimeException {
if (null == company || isEmpty(company.getId())) {
throw new RuntimeException("公司信息不能为空!");
}
if (isEmpty(id)) {
return null;
}
T t = entityManager.find(clazz, id);
if (null == t) {
return null;
}
Object object = ObjectUtil.getFieldValueFromObject(
ObjectUtil.getFieldValueFromObject(t, "company"), "id");
if (object.equals(company.getId())) {
return t;
} else {
return null;
}
}
@Override
public T findById(Class<T> clazz, String id) throws RuntimeException {
if (isEmpty(id)) {
throw new RuntimeException("ID 不能为空!");
}
return entityManager.find(clazz, id);
}
}</span>
转载自http://www.oschina.net/code/snippet_555465_11678#19149