`
FansUnion
  • 浏览: 166427 次
  • 性别: 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)

分享到:
评论

相关推荐

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    总的来说,`hibernate-jpa-2.1-api-1.0.0.final.jar`为开发者提供了丰富的JPA 2.1特性的实现,使得在Java项目中使用Hibernate进行数据库操作变得更加便捷和标准化。通过深入理解和熟练运用这个API,我们可以构建出...

    Struts_Spring_Hibernate_CRUD操作案例_-分页查询

    Struts、Spring和Hibernate是Java开发中常用的三大框架,它们分别负责不同的职责:Struts作为MVC(模型-视图-控制器)框架处理请求和响应,Spring提供了依赖注入和事务管理,而Hibernate则是对象关系映射(ORM)框架...

    Hibernate-3.2-API-EN.rar

    这个压缩包“Hibernate-3.2-API-EN.rar”包含了Hibernate 3.2版本的API文档,是英文版的资料,对于深入理解和使用Hibernate具有重要的参考价值。 一、Hibernate概述 Hibernate作为一种流行的ORM工具,通过提供一种...

    hibernate-jpa-2.1-api-1.0.0.draft-6-sources

    Java Persistence API是Java EE平台的一部分,提供了一种标准的方式来管理和持久化Java对象到关系数据库。JPA通过定义实体类(Entity)和注解,将对象模型与关系数据模型进行映射,从而实现了ORM。 Hibernate JPA ...

    hibernate-distribution-3.5.0-Final-dist文档

    3. **CRUD操作**: Hibernate提供了save(), update(), delete()方法进行增删改操作,Query或Criteria API用于执行查询。 4. **事务管理**: 使用Session的beginTransaction(), commit(), rollback()方法进行事务控制...

    hibernate-cglib-repack-2.1_3.jar.zip

    Hibernate通过提供一组API和元数据来实现对象和数据库之间的映射,极大地提高了开发效率和代码的可维护性。 CGLIB,全称Code Generation Library,是Java平台上的一个强大的代码生成库。它主要用于生成Java字节码,...

    spring-boot-04-web-restfulcrud

    3. **Spring Data JPA与Hibernate** Spring Data JPA是Spring的一个模块,简化了ORM(对象关系映射)操作。我们将使用它与Hibernate集成,处理数据库交互。通过定义Repository接口,我们可以轻松地完成数据的CRUD...

    hibernate-distribution-3.5.6-Final.rar

    接下来,"lib"目录下的"hibernate3.jar"文件是Hibernate 3.5.6的核心库,包含了所有必需的类和接口,使得开发者能够在项目中直接引用并使用Hibernate的功能。这个JAR文件内部包含了对JDBC(Java Database ...

    hibernate-release-5.2.10

    在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的复杂性。SSH框架的组合使得企业级应用开发更加高效和便捷。 "hibernate-release-5.2.10" 是Hibernate的一个...

    Strust2+Hibernate实现CRUD操作网页

    在这个"Struts2+Hibernate实现CRUD操作网页"项目中,我们能看到开发者如何结合这两个框架来创建一个能够进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作的Web应用程序。以下是这个项目中的关键...

    hibernate-3.3.2.GA-jar包集合

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程语言(如Java)来处理数据库操作,极大地简化了数据库应用程序的开发。在这个“hibernate-3.3.2.GA-jar包集合”中,我们聚焦的是...

    hibernate-api-3.1.1.rar

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作数据库。...学习和掌握Hibernate API能够极大地提升数据库操作的效率,减少与数据库交互的复杂性,并提高代码的可维护性。

    hibernate_4.1.6.Final-api

    《Hibernate 4.1.6.Final API:Java对象关系映射的艺术》 Hibernate,作为Java领域中的一个著名持久化框架,一直以来都是开发者们进行数据库操作的重要工具。它以其强大的对象关系映射(ORM)能力,极大地简化了...

    Hibernate-CRUD自用基础模板

    在Java开发中,CRUD(Create, Read, Update, Delete)是数据库操作的基础,而Hibernate通过提供便捷的API,使得开发者可以轻松实现这些操作。以下是对`Hibernate-CRUD自用基础模板`的详细解释。 ### Hibernate 概述...

    hibernate+junit+mysql-jdbc开发核心jar包三合一

    总之,“hibernate+junit+mysql-jdbc开发核心jar包三合一”是Java Web开发中的关键组件,它们共同构成了数据持久化、单元测试和数据库连接的基础。掌握这些工具的使用,对于提升开发效率和保证软件质量具有重要意义...

    CRUD项目核心框架

    CRUD,全称为Create(创建)、Read(读取)、Update(更新)和Delete(删除),是数据库操作的基础,也是软件开发中的核心概念。在IT行业中,CRUD项目通常指的是一个以处理这些基本数据操作为主的系统或应用。在这个...

    Hibernate实战----创建RedSaga论坛

    【标题】"Hibernate实战----创建RedSaga论坛"是关于如何使用Hibernate框架开发一个名为RedSaga的在线论坛的教程。在本实战中,我们将探讨如何利用Hibernate这一强大的对象关系映射(ORM)工具来处理数据库操作,提高...

    hibernate框架基础教程适合新手

    Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来处理数据库操作。这个基础教程针对新手,旨在让初学者从零开始掌握Hibernate的核心概念和使用方法。 1. **Hibernate概述** ...

    hibernate-3.6.5.Final-dist.zip

    本压缩包`hibernate-3.6.5.Final-dist.zip`包含了Hibernate 3.6.5最终稳定版的所有组件和文档,是开发人员学习和使用Hibernate 3.x系列的重要资源。 ### Hibernate ORM框架概述 Hibernate ORM框架的核心功能在于将...

    hibernate-core-5.0.11.Final.jar

    Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,如实体管理、事务处理、查询语言(HQL)等。`5.0.11.Final`版本是一个稳定且广泛使用的版本,提供了诸多改进和优化。 二、源码结构解析 `...

Global site tag (gtag.js) - Google Analytics