优点:简单的和基础的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)

HibernateCRUD基础框架(3)-简单的和较为复杂的标准的CRUD API的更多相关文章

  1. HibernateCRUD基础框架(1)-实体类

    HibernateCRUD基础框架包括3篇文章,主要讲述整个CRUD基础框架的思路. 第1篇:讲述最基本的实体类,这些实体类是对SQL语言中的一些概念的封装. 第2篇:在这些实体类的基础上,开发一个& ...

  2. HibernateCRUD基础框架(2)-HQL语句构造器(HqlQueryBuilder,HqlUpdateBuilder)

    上篇讲述了最基本的实体类,本篇接着讲述HQL语句构造器,包括查询和更新等. 优点:通过面向对象的方式构造HQL语句,更快捷,不需要手动拼接HQL. 缺点:封装可能降低性能,只能支持常用的和较为简单的H ...

  3. 一个简单的、面向对象的javascript基础框架

    如果以后公司再能让我独立做一套新的完整系统,那么我肯定会为这个系统再写一个前端框架,那么我到底该如何写这个框架呢? 在我以前的博客里我给大家展示了一个我自己写的框架,由于当时时间很紧张,做之前几乎没有 ...

  4. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构.近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spr ...

  5. LayIM.AspNetCore Middleware 开发日记(三)基础框架搭建

    前言 在上一篇中简单讲了一些基础知识,例如Asp.Net Core Middleware 的使用,DI的简单使用以及嵌入式资源的使用方法等.本篇就是结合基础知识来构建一个基础框架出来. 那么框架有什么 ...

  6. jeesite 框架的简单应用

    个人觉得比较完善的一个讲解jeesite的网站 https://www.w3cschool.cn/jeesite/ jeesite官网 http://jeesite.com/ 公司项目都是基于jees ...

  7. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    本文转自:http://mt.sohu.com/20160803/n462486707.shtml 最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论 微服务架构 .近期也看到 ...

  8. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

  9. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)

    一直希望能够搭建一个完整的,基础Web框架,方便日后接一些外快的时候,能够省时省力,终于花了一周的时间,把这个东西搞定了.特此写下此博客,一来是纪念,二来是希望能够为别人提供方便.顺带说一下,恩,组合 ...

随机推荐

  1. 使用Gmail邮箱

    由于国内不能直接访问google,所以其相关产品也不能直接使用.因为Gmail简洁,使用方便,国际上用的人很多.最近发现网易邮箱大师可以直接访问Gmail,所以将方法介绍给大家,如果大家只有访问Gma ...

  2. Java图像渐变

    图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的RBG,每个点就减去相同的量,而且这个量是个渐变的量.是的,就是这样,我们的程序也是这个思路,不过就是没有单纯的“想”这么简单了.我这里只编写 ...

  3. BZOJ 4582 贪心

    思路: 显然是个贪心 排个序 然后扫几遍就好了 (重叠的区间不能取) //By SiriusRen #include <cstdio> #include <algorithm> ...

  4. Android ijkplayer详解使用教程

    1.认识ijkplayer 最近公司准备开发一款视频播放及直播的应用,找了许多开源的框架,大部分都是基于ffmpeg开发的.最开始准备用Vitamio框架开发的,相关的文章也比较丰富,结果对于非个人移 ...

  5. c# for 和 foreach

    1给定长度 不需要计算长度的 for比foreach循环效率高 2 在不确定长度 或者计算长度有性能损耗的时候 用foreach比较方便 2336 循环语句是编程的基本语句,在C#中除了沿用C语言的循 ...

  6. DG性能

    网络带宽 根据primary database redo产生的速率,计算传输redo需要的带宽. 出去tcp/ip网络其余30%的开销,计算需要的带宽公式: 需求带宽=((每秒产生redo的速率峰值/ ...

  7. 在物理 Data Guard 中对异构主备系统的支持 (文档 ID 1602437.1)

    Data Guard中主数据库与物理备用数据库(Redo Apply)之间可以有什么差别?本说明针对重做应用和 Oracle Data Guard 12 发行版 1 进行了更新.它适用于 Oracle ...

  8. C/C++(文件操作二)

    二进制读写才是本质 二进制的读写对文件标记不敏感. eg: 对图片进行加密与解密: 用命令的形式去执行: //xx.exe -c src dest 加密 //xx.exe -d src dest 解密 ...

  9. C/C++(基础-运算符详解)

    运算符 任何表达式是有值的 int a = 2; int b = 3; a*=b+4;//a=a*(b+4);"*"*=的优先级层次和=号的层次一样. printf("% ...

  10. LuoguP2765 魔术球问题(最大流)

    题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...