zoukankan      html  css  js  c++  java
  • HibernateCRUD基础框架(3)-简单的和较为复杂的标准的CRUD API

    优点:简单的和基础的CRUD功能可以很快实现,可以说是比较的“标准化”。维护起来也很容易。

    缺点:性能没有保障。不支持特别复杂的CRUD。

    可以适用的场景:小型Web项目

    1.CrudDao完成最基本的增删改查

      包括增加一个对象create、根据主键获得对象get、更新一个持久化的对象update、逻辑删除一个对象remove、逻辑恢复一个对象recover、物理删除一个持久化的对象delete、更新属性(TODO,需要增加where限制)、更新属性update。

    package cn.fansunion.hibernate;
    
    import java.lang.reflect.ParameterizedType;
    import java.util.Map;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import cn.fansunion.hibernate.constants.CommonConstants;
    import cn.fansunion.hibernate.constants.StatusConstants;
    import cn.fansunion.hibernate.sql.update.HqlUpdateBuilder;
    import cn.fansunion.hibernate.util.Pair;
    
    /**
     * Dao基类,完成最基本的增删改查操作。
     *
     * @author LeiWen@FansUnion.cn
     */
    public class CrudDao<T> {
    
        /**
         * 表的实体类型
         */
        protected Class<T> modelClazz;
    
        @Autowired
        protected SessionFactory sessionFactory;
    
        public CrudDao() {
            this.modelClazz = (Class<T>) ((ParameterizedType) getClass()
                    .getGenericSuperclass()).getActualTypeArguments()[0];
        }
    
        // //////////////////////////////////////////////////////
        // ///////////泛型方法-CRUD/////////////////////////
        // /////////////////////////////////////////////////////
    
        /**
         * 根据主键(唯一标志)查询一条记录
         *
         * @param id
         *            主键
         * @return 一条记录对应的实体对象
         */
        public T get(Integer id) {
            T entity = (T) getCurrentSession().get(modelClazz, id);
            return entity;
        }
    
        /**
         * 向数据库插入一条记录
         *
         * @param entity
         *            与数据库表对应的实体对象
         */
        public void create(T entity) {
            getCurrentSession().save(entity);
        }
    
        /**
         * 更新一条记录
         *
         * @param entity
         *            持久态的实体对象
         */
        public void update(T entity) {
            getCurrentSession().update(entity);
        }
    
        /**
         * 根据主键(唯一标志),逻辑删除一条记录
         *
         * @param id
         *            主键
         */
        public void remove(Integer id) {
            updateProperties(new Pair(CommonConstants.ID, id), new Pair(
                    CommonConstants.IS_DELETED, StatusConstants.DELETED));
        }
    
        /**
         * 根据主键(唯一标志),恢复一条记录
         *
         * @param id
         *            主键
         */
        public void recover(Integer id) {
            updateProperties(new Pair(CommonConstants.ID, id), new Pair(
                    CommonConstants.IS_DELETED, StatusConstants.NORMAL));
        }
    
        /**
         * 物理删除一条记录
         *
         * @param entity
         *            持久态的实体对象
         */
        public void delete(T entity) {
            getCurrentSession().delete(entity);
    
        }
    
        /**
         * 获取主数源
         */
        protected Session getCurrentSession() {
            return sessionFactory.getCurrentSession();
    
        }
    
        // ///////////////////////////////////////////////
        // /////根据属性更新(TODO 增加where限制)//////////
        // ///////////////////////////////////////////////
        /**
         * 根据1个属性更新(谨慎使用)
         *
         * @param key
         *            属性名称
         * @param value
         *            属性的值
         * @return 更新的记录数
         */
        public Integer updateProperty(String key, Object value) {
            HqlUpdateBuilder builder = new HqlUpdateBuilder();
            String hql = builder.param(key, value).toHql();
            return update(hql, key, value);
        }
    
        /**
         * 根据0个、1个或多个属性更新(强烈建议,至少使用2个键值对)
         */
        public Integer updateProperties(Pair... pair) {
            HqlUpdateBuilder builder = new HqlUpdateBuilder();
            String hql = builder.param(pair).toHql();
            return update(hql, pair);
        }
    
        /**
         * 根据多个键值对,更新记录
         */
        public Integer updateProperties(Map<String, Object> params) {
            HqlUpdateBuilder builder = new HqlUpdateBuilder();
            String hql = builder.param(params).toHql();
            return update(hql, params);
        }
    
        /**
         * 根据hql语句和键值对,更新记录
         *
         * @param hql
         *            hql语句
         * @param key
         *            属性名称
         * @param value
         *            属性的值
         * @return
         */
        public Integer update(String hql, String key, Object value) {
            Map<String, Object> params = createMap(key, value);
            return update(hql, params);
        }
    
    
        public Integer update(String hql, Pair... pair) {
            Map<String, Object> params = createMap(pair);
            return update(hql, params);
        }
    
        public Integer update(String hql, Map<String, Object> params) {
            Query query = createQuery(hql, params);
            return query.executeUpdate();
        }
    
        // ///////////////////////////////////////////////
        // ////////////创建Query对象/////////////////////////
        // ///////////////////////////////////////////////
        protected Query createQuery(String hql, Map<String, Object> params) {
            return DaoUtils.createQuery(getCurrentSession(), hql, params);
        }
    
        protected Query createQuery(String hql, String key, Object value) {
            return DaoUtils.createQuery(getCurrentSession(), hql, key, value);
        }
    
        protected Query createQuery(String hql) {
            return DaoUtils.createQuery(getCurrentSession(), hql);
        }
    
        protected Map<String, Object> createMap() {
            return DaoUtils.createMap();
        }
    
        protected Map<String, Object> createMap(String key, Object value) {
            return DaoUtils.createMap(key, value);
        }
    
        protected Map<String, Object> createMap(Pair... pair) {
            return DaoUtils.createMap(pair);
    
        }
    }

    2.BasicQueryUpdateDao完成几个较为通用的几个功能

      包括获取记录总数count、获取一个列表list、获得唯一结果unique。

    package cn.fansunion.hibernate;
    
    import java.util.List;
    import java.util.Map;
    
    import org.hibernate.Query;
    
    import cn.fansunion.hibernate.util.EmptyUtils;
    import cn.fansunion.hibernate.util.PageConstants;
    import cn.fansunion.hibernate.util.PageUtils;
    import cn.fansunion.hibernate.util.Pair;
    
    /**
     * 完成基本的查询操作。
     *
     * @author LeiWen@FansUnion.cn
     */
    public class BasicQueryUpdateDao<T> extends CrudDao<T> {
    
        public static final boolean NOT_PAGE = false;
    
        public static final boolean NEED_PAGE = true;
        
        // ///////////////////////////////////////////////
        // ////////////获取记录总数/////////////////////////
        // ///////////////////////////////////////////////
        public Integer count(String hql) {
            Query query = createQuery(hql);
            Integer count = doCount(query);
            return count;
        }
    
        public Integer count(String hql, String key, Object value) {
            Query query = createQuery(hql, key, value);
            Integer count = doCount(query);
            return count;
        }
    
        public Integer count(String hql, Pair... pair) {
            Map<String, Object> params = createMap(pair);
            return count(hql, params);
    
        }
    
        public Integer count(String hql, Map<String, Object> params) {
            Query query = createQuery(hql, params);
            Integer count = doCount(query);
            return count;
        }
    
        protected Integer doCount(Query query) {
            Integer count = 0;
            Object uniqueResult = query.uniqueResult();
            if (uniqueResult != null) {
                count = Integer.parseInt(uniqueResult.toString());
            }
            return count;
        }
    
        // ///////////////////////////////////////////////
        // ///////获取一个列表(不使用泛型 List<T>)/////////////////
        // ///////////////////////////////////////////////
        // 执行不带参数的hql查询,返回一个结果集List
        public List list(String hql, boolean needPage) {
            return list(hql, needPage);
        }
    
        public List list(String hql, String key, Object value, boolean needPage) {
            Map<String, Object> params = createMap(key, value);
            return list(hql, params, needPage);
        }
    
        public List list(String hql, Map<String, Object> params, boolean needPage) {
            if (needPage) {
                PageUtils.fillDefaultPageParams(params);
            }
            List list = list(hql, params, needPage);
            return list;
        }
    
        // 执行带参数并且含有分页的hql查询
        private List doList(String hql, Map<String, Object> params) {
            Query query = createQuery(hql, params);
            fillPageParams(query, params);
            List list = doQuery(query);
            return list;
        }
    
        /**
         * 向查询对象Query中设置分页参数
         *
         * @param query
         *            查询对象
         * @param params
         *            查询参数
         */
        private void fillPageParams(Query query, Map<String, Object> params) {
            Integer firstResult = (Integer) params.get(PageConstants.FIRST_RESULT);
            Integer maxResults = (Integer) params.get(PageConstants.MAX_RESULTS);
            if (firstResult > 0) {
                query.setFirstResult(firstResult);
            }
    
            if (maxResults > 0) {
                query.setMaxResults(maxResults);
            }
        }
    
        /**
         * 执行查询语句
         *
         * @param query
         *            查询对象
         * @return 查询结果
         */
        protected List doQuery(Query query) {
            return query.list();
        }
    
        public T unique(String hql) {
            List<T> list = list(hql,NOT_PAGE);
            T result = doGetFirst(list);
            return result;
        }
    
        public T unique(String hql, String key, Object value) {
            Map<String, Object> params = createMap(key, value);
            return unique(hql, params);
        }
    
        public T unique(String hql, Pair... pair) {
            Map<String, Object> params = createMap(pair);
            return unique(hql, params);
        }
    
        public T unique(String hql, Map<String, Object> params) {
            List<T> list = list(hql, params,NOT_PAGE);
            T result = doGetFirst(list);
            return result;
        }
    
        protected T doGetFirst(List<T> list) {
            T result = null;
            if (EmptyUtils.notEmpty(list)) {
                result = list.get(0);
            }
            return result;
        }
    }


    3.BasicSqlQueryUpdateDao

      使用原生的SQL,而不是HQL,实现一些较为通用的功能,与BasicQueryUpdateDao类似。

      更多功能,与上面的几个都差不多。只是封装程度不同而已。

    4.BaseDao

      更多类似的功能,还有

      searchListByProperty: 根据一个或多个键值对模糊搜索符合条件的结果集

      findListByProperty:根据一个键值对精确查找对象

      findByPropertyUnique:根据1个键值对精确查找一个对象

      countFindByPropertyListAnd:计算查询记录的个数count

    5.More API

      更多功能需要结合实际需求,整理了...

    小结

    网站开发最基础最常用的功能就是增删改查CRUD。

    无论是用Hibernate还是Mybatis,都会有自己的优势和不足。

    如果只是站在开发和技术的角度想问题,永远有做不完的问题,数不清的重复代码。

    不去思考和总结,高富帅级的程序员也会被弄成码农,被折磨。

    原文链接http://blog.fansunion.cn/articles/3624(小雷博客-blog.fansunion.cn)

  • 相关阅读:
    (原)Lazarus 异构平台下多层架构思路、DataSet转换核心代码
    (学)新版动态表单研发,阶段成果3
    (学) 如何将 Oracle 序列 重置 清零 How to reset an Oracle sequence
    (学)XtraReport WebService Print 报错
    (原)三星 i6410 刷机 短信 无法 保存 解决 办法
    (原) Devexpress 汉化包 制作工具、测试程序
    linux下网络配置
    apache自带ab.exe小工具使用小结
    Yii::app()用法小结
    PDO使用小结
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463313.html
Copyright © 2011-2022 走看看