舞动的代码

不是因为看到希望才坚持,是坚持了才有可能看到希望

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 接口

package com.coder163.main.dao;

import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 功能描述: Hibernate通用的持久层接口
 *
 * @author 侯叶飞
 * @create 2018-04-12 14:24
 **/
public interface BaseDaoI<T> {

    /**
     * 保存
     *
     * @param entity 对象
     *
     * @return id
     */
     Serializable save(T entity);
    /**
     * 将实体对象 集合保存到数据库中
     *
     * @param collection
     *            实体对象 集合
     */
     void saveAll(Collection<T> collection);

    /**
     * 更新
     *
     * @param entity 对象
     */
     void update(T entity);

    /**
     * 保存或更新
     *
     * @param entity 对象
     */
     void saveOrUpdate(T entity);

    /**
     * 删除
     *
     * @param entity 删除的对象
     */
     void delete(T entity);

    /**
     * 通过对象标识符获取对象
     *
     * @param id 主键
     * @return 标识符对应的对象,没找到则返回null
     */
     T findById(Serializable id);

    /**
     * 返回所有对象的列表
     *
     * @return
     */
     List<T> findAll();

    /**
     * 查找满足条件的总记录数
     *
     * @param detachedCriteria 查询条件
     * @return
     */
    Integer findRecordNumByPage(DetachedCriteria detachedCriteria);

    /**
     * 向分页对象中设置记录
     *
     * @param detachedCriteria
     *            离线查询对象
     * @param startIndex
     *            开始索引
     * @param pageSize
     *            每页记录数
     * @return
     */
    List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);

    /**
     * 通过条件查询
     *
     * @param detachedCriteria
     * @return
     */
    List<T> findByCriteria(DetachedCriteria detachedCriteria);

    /**
     * 通用更新方法
     *
     * @param queryName
     *            命名查询的名字,在映射文件中定义
     * @param objects
     *            参数列表
     */
     void executeUpdate(String queryName, Object... objects);

    /**
     * 按条件统计
     * @param deCriteria
     * @return
     */
    Integer count(DetachedCriteria deCriteria);
}

2. 实现类

package com.coder163.main.dao;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;

/**
 * 功能描述: Hibernate通用持久层接口实现类
 *
 * @author 侯叶飞
 * @date 2018-04-12 14:30
 **/
public class BaseDaoImpl<T>  extends HibernateDaoSupport implements BaseDaoI<T> {
    // 存储泛型的实际参数
    private Class entity;

    public BaseDaoImpl() {
        // 谁实现该类,这就是谁的类字节码
        Class c = this.getClass();
        // 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
        Type type = c.getGenericSuperclass();
        // 将类型强转为参数化类型
        ParameterizedType pType = (ParameterizedType) type;
        // 获取该类的父类的所有实际类型参数,也就是泛型的实际参数
        // 这里也就是获取BaseDaoImpl的实际类型参数
        Type[] actualTypeArguments = pType.getActualTypeArguments();
        // 将实际类型参数赋值给成员变量
        entity = (Class) (actualTypeArguments[0]);
    }

    @Override
    public Serializable save(T entity) {
        return this.getHibernateTemplate().save(entity);
    }

    @Override
    public void saveAll(Collection<T> collection) {
        for (T t : collection) {
            this.getHibernateTemplate().save(t);
        }
    }

    @Override
    public void update(T entity) {
        this.getHibernateTemplate().update(entity);
    }

    @Override
    public void saveOrUpdate(T entity) {
        this.getHibernateTemplate().saveOrUpdate(entity);
    }

    @Override
    public void delete(T entity) {
        this.getHibernateTemplate().delete(entity);
    }

    @Override
    public T findById(Serializable id) {
        return (T) this.getHibernateTemplate().get(this.entity, id);
    }
    @Override
    public List<T> findAll() {
        StringBuffer hql = new StringBuffer("from ");

        hql.append(entity.getName());

        return this.getHibernateTemplate().find(hql.toString());
    }

    @Override
    public Integer findRecordNumByPage(DetachedCriteria detachedCriteria) {
        // 设置记录数投影
        detachedCriteria.setProjection(Projections.rowCount());
        List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
        // 将投影置为空
        detachedCriteria.setProjection(null);
        if (list.size() > 0) {
            return list.get(0).intValue();
        }
        return null;
    }

    @Override
    public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
        // 指定hibernate在连接查询时,只封装成一个对象
        detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
        return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, startIndex, pageSize);
    }

    @Override
    public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
        return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
    }

    @Override
    public void executeUpdate(String queryName, Object... objects) {
        // 获取当前session
        Session session = this.getSessionFactory().getCurrentSession();
        // 获取命名查询对象
        Query query = session.getNamedQuery(queryName);
        int i = 0;
        // 设置参数
        if (objects != null) {
            for (Object object : objects) {
                query.setParameter(i++, object);
            }
        }
        query.executeUpdate();
    }

    @Override
    public Integer count(DetachedCriteria deCriteria) {
        deCriteria.setProjection(Projections.rowCount());
        return Integer.parseInt(deCriteria.getExecutableCriteria(this.getSession()).uniqueResult().toString());
    }
}

posted on 2018-05-08 13:00  舞动的代码  阅读(419)  评论(0编辑  收藏  举报