封装JPA数据库操作的DAO类

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值