`
FansUnion
  • 浏览: 154771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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)

分享到:
评论

相关推荐

    crud-api-hibernate:由 code.quarkus.io 生成

    crud-api-hibernate 项目 该项目使用 Quarkus,即超音速亚原子 Java 框架。 如果您想了解有关 Quarkus 的更多信息,请访问其网站: ://quarkus.io/。 在开发模式下运行应用程序 您可以在开发模式下运行您的应用程序...

    crud-jpa-hibernate

    crud-jpa-hibernate 本项目使用的技术 IDE Eclipse Java 8 框架JSF 框架 Primefaces 框架Hibernate API JPA 银行 Apache Maven 3.0.4 Apache Tomcat 8

    支持多数据库的ORM框架ef-orm.zip

    对单个对象进行CRUD的操作API现在和Criteria API合并在一起。Session对象可以直接提供原本要Criteria API才能提供实现的功能。API大大简化。 IQueryableEntity允许你将一个实体直接变化为一个查询(Query)...

    Hibernate框架包

    持久化上下文大体内容:1、ORM元数据,JPA支持annotion(注解)或xml两种形式描述对象/关系映射 2、实体操作API,实现对实体对象的CRUD操作 3、查询语言,约定了面向对象的查询语言JPQL(javaPersistence Query ...

    CRUD-HibernateJPA:使用HibernateJPA框架进行对象关系映射的Java(Maven)中的CRUD

    CRUD-HibernateJPA JPA: Java Persistence API是标准的Java语言API,它描述了数据持久性框架的通用接口。 JPA是Java规范,指示应如何实现ORM框架。 创建它是为了使这些解决方案标准化。 Hibernate: Hibernate是一...

    realworld-api-quarkus:使用quarkus框架的真实世界api的简单案例

    Quarkus Framework代码库包含遵循规范和API的真实示例(CRUD,auth,高级模式等)。 这个代码库的建立是为了展示内置一个完全成熟的应用fullstack 包括CRUD操作,验证,路由,分页等。 我们竭尽全力遵守Quarkus社区...

    api-server:Api Server 的基本框架

    api服务器 这个存储库是带有 Spring、Hibernate、MySQL 和 Liquibase 的 REST API 服务器的演示,它执行基本的 CRUD 操作。

    JavORM框架DarksORM.zip

    它可以像hibernate一样通过简单易用的API接口进行CRUD数据库操作,也可以像mybatis一样通过XML分离进行高效可配的操作;同时它可以混合两种调用方式,简单普遍的操作采用API,复杂的操作采用XML映射,集各家之所长。...

    基于SpringBoot+Vue开发的前后端分离外卖点单系统源码+数据库+项目说明.zip

    3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于...

    interview_project_alexandru_tomuta

    专访_project_alexandru_tomuta ... 我们可以将这些API调用移至客户端和任何CRUD操作中-保存在后端数据库中。 在客户端上显示数据库中的位置 在客户端上启用CRUD操作 Google响应验证-超出了API限制

    s2jh4net:基于SpringMVCSpringJPAHibernate和ReactCordova混合应用程序的企业系统JavaJ2EE开发框架

    项目简介 集结最新主流时尚开源技术的面向企业应用的Hybrid混合式APP及后端管理系统一体的的基础开发框架, 提供一套Java EE相关主流开源技术架构...提供一个基础的代码生成框架,简化实现快速基本的CRUD功能开发 基

    ecommerce-rest-spring-jpa:Java,Spring Boot,JPA,Hibernate,Spring Data,Rest,H2和单元测试的有效集成

    开发用于管理产品和类别的RESTful API 客户端应该能够对产品和类别资源执行CRUD操作。 添加创建价格不同于欧元货币的产品的功能。 将系统与某些开放货币汇率API(例如 )集成。使用Spring作为核心框架。 使用JPA / ...

    Java_HibernateDemoDay1

    第一天:Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的API、Hibernate 的 CRUD) 第二天:Hibernate 的一级缓存、其他的 API 第三天:Hibernate 的一对多配置、Hibernate 的多对多的配置 第四天:Hibernate...

    Struts2 in action中文版

    第一部分 Strut 2:一个全新的框架 第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 ...

    kuangjia:SpringBoot+JWT+Shiro+MybatisPlus后端脚手架

    一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置部署都变得简单,越来越多的互联网公司已经选择SpringBoot作为微服务的入门级微框架。Mybatis-Plus是一个...

    Android数据库应用编程——为企业开发数据驱动Android应用

    学习为企业系统构建数据驱动的Android应用程序 Android设备已经超越消费应用范畴,进入企业领域。如果你准备着手构建与企业...◆ 介绍新的开源和通用同步框架(专门与Android API集成) ◆ 解决应用程序实现中的安全问题

    WeatherDataApplication:一个进行CRUD操作以维护天气数据的Spring Boot应用程序

    一项要求是REST API服务使用Spring Boot框架提供天气信息。 您将需要添加功能以添加和删除信息以及执行一些查询。 您将处理有关纬度,经度,温度等气象数据的典型信息。该团队提出了一系列要求,包括过滤和订购要求...

    Spring攻略(第二版 中文高清版).part2

    11.6 为一个应用的领域类生成CRUD控制器和视图 454 11.6.1 问题 454 11.6.2 解决方案 454 11.6.3 工作原理 455 11.7 国际化(I18n)信息属性 458 11.7.1 问题 458 11.7.2 解决方案 458 11.7.3 工作原理...

    Spring攻略(第二版 中文高清版).part1

    11.6 为一个应用的领域类生成CRUD控制器和视图 454 11.6.1 问题 454 11.6.2 解决方案 454 11.6.3 工作原理 455 11.7 国际化(I18n)信息属性 458 11.7.1 问题 458 11.7.2 解决方案 458 11.7.3 工作原理...

    java-crudyrestaurants

    使用JPA和Hibernate在RDBMS上执行CRUD操作(阅读) 使用JPA和Hibernate实现数据种子类 解释和使用Spring数据关系 使用JsonIgnoreProperties批注来防止无限循环 使用H2控制台和H2 IntelliJ集成来浏览数据 介绍 这是...

Global site tag (gtag.js) - Google Analytics