• Hibernate通用Dao


    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());
        }
    }
    
    
  • 相关阅读:
    location url 反向代理到来机的其它端口 gitlab
    PortSentry是入侵检测工具中配置最简单、效果最直接的工具之一
    iptables下state的4种形式
    windows  远程桌面命令 mstsc
    linux中解决SSH连接慢问题 关键点GSSAPIAuthentication
    无密码登录远程主机
    openfire 服务器名称:后面的黄色叹号
    ssh -v root@xxxxx 显示登录的细节
    mysql 只导数据不含表结构
    磁盘空间占满inode结点没用完 并删除了文件但是释放不了
  • 原文地址:https://www.cnblogs.com/coder163/p/9007597.html
Copyright © 2020-2023  润新知