Hibernate 封装的通用DAO基础类
2019独角兽企业重金招聘Python工程师标准>>>
Spring 虽然为 Hibernate提供了HibernateDaoSupport 和HibernateTemplate等增强的工具类,在实际的使用中,有时候我们需要将查询出来的信息封装到一个bean中,有时候需要只更新几个列的值,有时候需要做自增,有时候仅仅需要查询一个字段的内容等等;所以很多时候还是需要自己封装一个而已复用的抽象层作为Dao的父类,提供一些通用的方法来实现一些经常用的功能; 这里就分享一个自己觉得很好用的Hibernate Dao抽象实现类,来源是出于对SHOP++项目的源代码学习和改进,加上一些平时对用的频率比较高的方法。
package com.fengyunhe.common.hibernate;import com.fengyunhe.common.bean.Page;
import com.fengyunhe.common.bean.PageList;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.engine.query.HQLQueryPlan;
import org.hibernate.engine.query.QueryPlanCache;
import org.springframework.stereotype.Repository;import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;/*** Hibernate dao 基础类,一个Hibernate的dao类继承此抽象类后,需要实现 setSessionFactory 方法,注入数据源** @param <T> 对象类型* @param <PK> 对象主键类型*/
@Repository
public abstract class HibernateBaseDaoImpl<T, PK extends Serializable> implementsHibernateDao<T, PK> {protected SessionFactory sessionFactory;/*** 注入对应的数据源** @param sessionFactory*/protected abstract void setSessionFactory(SessionFactory sessionFactory);private Class<T> entityClass;protected HibernateBaseDaoImpl() {Class c = getClass();Type type = c.getGenericSuperclass();if (type instanceof ParameterizedType) {Type[] parameterizedType = ((ParameterizedType) type).getActualTypeArguments();this.entityClass = (Class<T>) parameterizedType[0];}}@Overridepublic Session getCurrentSession() {return sessionFactory.getCurrentSession();}@Overridepublic Session openSession() {return sessionFactory.openSession();}@Overridepublic void beginTransaction() {getCurrentSession().beginTransaction();}@Overridepublic void commitTransaction() {getCurrentSession().getTransaction().commit();}@Overridepublic void rollbackTransaction() {getCurrentSession().getTransaction().rollback();}@Overridepublic void closeSession(Session session) {session.close();}@Overridepublic T getById(PK id) {return (T) getCurrentSession().get(entityClass, id);}@Overridepublic T loadById(PK id) {return (T) getCurrentSession().load(entityClass, id);}@Overridepublic <T1> T1 getPropertyById(PK id, String propertyName, Class<T1> clazz) {return getUniqueResult(clazz, "select " + propertyName + " from " + entityClass.getName() + " where " + sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName() + "=?", id);}@Overridepublic void save(T model) {getCurrentSession().save(model);}@Overridepublic void saveOrUpdate(T model) {getCurrentSession().saveOrUpdate(model);}@Overridepublic List<T> findListByProperty(String propertyName, Object value) {Query query = getCurrentSession().createQuery("from " + entityClass.getName() + " where " + propertyName + "=?");query.setParameter(0, value);return query.list();}@Overridepublic void delete(T model) {getCurrentSession().delete(model);}@Overridepublic void deleteById(PK... id) {for (int i = 0; i < id.length; i++) {execute("delete from " + entityClass.getName() + " where " + sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName() + "=?", id[i]);}}@Overridepublic void update(T model) {getCurrentSession().update(model);}@Overridepublic List<T> findAll() {return getCurrentSession().createCriteria(entityClass.getName()).list();}@Overridepublic void deleteResultsByProperty(String propertyName, Object value) {Query query = getCurrentSession().createQuery("delete from " + entityClass.getName() + " where " + propertyName + "=?");query.setParameter(0, value);query.executeUpdate();}@Overridepublic PageList<T> findByPage(Page page, String hql, List<Object> params) {Query q = getCurrentSession().createQuery(hql);if (page instanceof Page.Offset) {q.setFirstResult(((Page.Offset) page).getStart()).setMaxResults(((Page.Offset) page).getLimit());} else {q.setFirstResult((page.getPage() - 1) * page.getPageSize()).setMaxResults(page.getPageSize());}if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}page.setTotal(this.getTotalCount(hql, params));return new PageList<T>(page, q.list());}@Overridepublic PageList<T> findByPage(Page page) {return this.findByPage(page, "from " + this.entityClass.getName(),Collections.EMPTY_LIST);}@Overridepublic PageList<T> findByPage(Page page, String hql, Object... params) {return this.findByPage(page, hql, Arrays.asList(params));}@Overridepublic void clear() {getCurrentSession().clear();}@Overridepublic void flush() {getCurrentSession().flush();}@Overridepublic void evict(Object o) {getCurrentSession().evict(o);}@Overridepublic boolean isExist(String propertyName, Object value) {String hql = "select count(*) from " + entityClass.getName()+ " where " + propertyName + "=?";return (Long) getCurrentSession().createQuery(hql).setParameter(0, value).uniqueResult() > 0;}@Overridepublic long getTotalCount() {String hql = "select count(*) from " + entityClass.getName();return Long.valueOf(getCurrentSession().createQuery(hql).uniqueResult().toString());}@Overridepublic long getTotalCount(String hql, List<Object> params) {Query q = getCurrentSession().createQuery(prepareCountHql(hql));if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}Object singleResult = q.uniqueResult();if (singleResult instanceof Object[]) {return Long.valueOf(((Object[]) singleResult)[0].toString()).longValue();}return Long.valueOf(singleResult.toString()).longValue();}@Overridepublic long getTotalCount(String hql, Object... params) {return this.getTotalCount(hql,params == null ? null : Arrays.asList(params));}protected String prepareCountHql(String hql) {String fromHql = hql;fromHql = " from " + StringUtils.substringAfter(fromHql, "from ");fromHql = StringUtils.substringBefore(fromHql, "order by");
//取出查询的字段String selectWhat = StringUtils.substringBetween(hql, "select", "from");
// 如果是new ClassName (x.x.x)格式的处理if (selectWhat != null && selectWhat.contains("new ") && selectWhat.contains("(") && selectWhat.contains(")")) {selectWhat = StringUtils.substringBetween(selectWhat, "(", ")");}
// 第一列查询总行数String countHql = "select count(*)" + (selectWhat == null ? "" : ", " + selectWhat + " ") + fromHql;return countHql;}protected String getCountSql(String originalHql,SessionFactory sessionFactory) {SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;HQLQueryPlan hqlQueryPlan = sessionFactoryImplementor.getQueryPlanCache().getHQLQueryPlan(originalHql, false,Collections.emptyMap());String[] sqls = hqlQueryPlan.getSqlStrings();String countSql = "select count(*) from (" + sqls[0] + ") count";return countSql;}public SessionFactoryImplementor getSessionFactoryImplementor() {return (SessionFactoryImplementor) sessionFactory;}public QueryPlanCache getQueryPlanCache() {return getSessionFactoryImplementor().getQueryPlanCache();}public HQLQueryPlan getHqlQueryPlan(String hql) {return getQueryPlanCache().getHQLQueryPlan(hql, false,Collections.emptyMap());}protected String prepareCountSql(String sql) {return getCountSql(sql, sessionFactory);}@Overridepublic <T> List<T> findList(Class<T> clazz, String hql, List<Object> params) {Query q = getCurrentSession().createQuery(hql);if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}return q.list();}@Overridepublic <T> List<T> findListLimit(Class<T> clazz, String hql, int limit,List<Object> params) {Query q = getCurrentSession().createQuery(hql);if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}q.setFirstResult(0);q.setMaxResults(limit);return q.list();}@Overridepublic T getUniqueResult(String hql, Object... params) {return getUniqueResult(this.entityClass, hql, params);}@Overridepublic <T> T getUniqueResult(Class<T> clazz, String hql, List<Object> params) {Query q = getCurrentSession().createQuery(hql);if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}q.setFirstResult(0);q.setMaxResults(1);List list = q.list();if (list == null || list.isEmpty() || list.get(0) == null) {return null;}return (T) list.get(0);}@Overridepublic <T> List<T> findList(Class<T> clazz, String hql, Object... params) {return this.findList(clazz, hql,params == null ? null : Arrays.asList(params));}@Override/*** 用给定的HQL和参数查询前几条给定类型的数据列表* @param clazz* @param hql* @param limit* @param params* @return*/public <T> List<T> findListLimit(Class<T> clazz, String hql, int limit,Object... params) {return this.findListLimit(clazz, hql, limit, params == null ? null: Arrays.asList(params));}@Overridepublic <T> PageList<T> findPageList(Page page, Class<T> clazz, String hql,Object... params) {return findPageList(page, clazz, hql, Arrays.asList(params));}@Overridepublic <T> PageList<T> findPageList(Page page, Class<T> clazz, String hql,List<Object> params) {Query q = getCurrentSession().createQuery(hql);if (page instanceof Page.Offset) {q.setFirstResult(((Page.Offset) page).getStart()).setMaxResults(((Page.Offset) page).getLimit());} else {q.setFirstResult((page.getPage() - 1) * page.getPageSize()).setMaxResults(page.getPageSize());}if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}page.setTotal(this.getTotalCount(hql, params));return new PageList(page, q.list());}@Overridepublic T getUniqueResultByProperty(String propertyName, Object value) {return this.getUniqueResult("from " + this.entityClass.getName()+ " where " + propertyName + "=?", value);}@Overridepublic <T> T getUniqueResult(Class<T> clazz, String hql, Object... params) {return this.getUniqueResult(clazz, hql,params == null ? null : Arrays.asList(params));}@Overridepublic void execute(String hql, List<Object> params) {Query q = this.getCurrentSession().createQuery(hql);if (params != null) {for (int i = 0; i < params.size(); i++) {q.setParameter(i, params.get(i));}}q.executeUpdate();}@Overridepublic void execute(String hql, Object... params) {this.execute(hql, params == null ? null : Arrays.asList(params));}@Overridepublic void updateProperty(PK id, String propertyName, Object status) {String hql = "update " + this.entityClass.getName() + " set " + propertyName + " = ? where " + sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName() + "= ?";this.execute(hql, status, id);}@Overridepublic void incr(PK id, String propertyName) {String hql = "update " + this.entityClass.getName() + " set " + propertyName + " = " + propertyName + "+1 where " + sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName() + "= ?";this.execute(hql, id);}@Overridepublic void incr(PK id, String propertyName, Integer n) {String hql = "update " + this.entityClass.getName() + " set " + propertyName + " = " + propertyName + "+1 where " + sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName() + "= ?";this.execute(hql, id, n);}@Overridepublic void updateProperties(PK id, String[] propertyNames, Object[] values) {String hql = "update " + entityClass.getName() + " set ";for (int i = 0; i < propertyNames.length; i++) {hql += propertyNames[i] + "= :v" + i;if (i + 1 < propertyNames.length) {hql += ",";}}hql += " where " + getIdPropertyName() + " =:id";Query query = getCurrentSession().createQuery(hql);for (int i = 0; i < values.length; i++) {query.setParameter("v" + i, values[i]);}query.setParameter("id", id).executeUpdate();}public String getIdPropertyName() {return sessionFactory.getClassMetadata(this.entityClass).getIdentifierPropertyName();}@Overridepublic boolean deleteAll() {String hql = "delete " + this.entityClass.getName();this.execute(hql);return true;}
}
tips:
本文由wp2Blog导入,原文链接:http://devonios.com/hibernate-%e5%b0%81%e8%a3%85%e7%9a%84%e9%80%9a%e7%94%a8dao%e5%9f%ba%e7%a1%80%e7%b1%bb.html
转载于:https://my.oschina.net/yangyan/blog/859483
Hibernate 封装的通用DAO基础类相关推荐
- Hibernate通用Dao实现
Hibernate通用Dao实现 @(Hibernate)[dao, hibernate, 反射] Hibernate通用Dao实现 BaseDao接口 BaseDao接口实现类 命名Query在映射 ...
- hibernate 封装 2008-11-12 17:21 (分类:默认分类)
字号: 大 大 中 中 小 小 hibernate封装 有幸和一个技术比较厉害的同事做项目,本来快要失败的项目被死死的整活了,以下是他对hibernate的封装,可以放在线程里使用的哦(以前不 ...
- JPA通用Dao类设计
2019独角兽企业重金招聘Python工程师标准>>> 在上一篇文章中已经配置好struts2+spring+jpa+dwr,这篇我们来讲下通用DAO设计. 设计思路:利用sprin ...
- 通用Dao模板--所有表一个模板即可
通用Dao模板 简述 注意事项 代码 Dao模板 c3p0.properties JdbcPollUtils 使用样例 简述 封装了jdbc的一些对数据库的基本操作,不过当了为了应付课设,写的太着急了 ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- 拒绝无用功,封装一个通用的PopupWindow
作者: 夏至,欢迎转载,但请保留这段申明,谢谢 https://juejin.im/post/5961e03e51882568b13c3308 为了避免重复造轮子,我们一般都会封装一个通用的控件,比如 ...
- 拒绝无用功,封装一个通用的 PopupWindow
https://juejin.im/post/5961e03e51882568b13c3308 为了避免重复造轮子,我们一般都会封装一个通用的控件,比如这次,项目中需要用到比较多的 popupwind ...
- 一个基于JDBC的通用DAO的设计参考(北大青鸟课程)
在S2阶段和Y2阶段的前部分是使用的JDBC来访问数据库,但是通常我们编写的时候在每个工程中都编写代码基本类似却有一点点不同之处的DAO层代码,现在介绍一种相对简化的方式来简化编程 现在我们来分析下S ...
- c语言 将音视频时钟同步封装成通用模块
自定义播放器系列 第一章 视频渲染 第二章 音频(push)播放 第三章 音频(pull)播放 第四章 实现时钟同步 第五章 实现通用时钟同步(本章) 第六章 实现播放器 文章目录 自定义播放器系列 ...
最新文章
- 信息熵和交叉熵的细节理解
- php sodium 加密解密,sodium库(加密)
- android 标题栏颜色渐变和阴影,ScrollView上下滑动监听,及判断scrollView是否滚动到底部
- Python入门进阶篇(六)字典的介绍
- 【CVPR2019】完整论文列表二
- 如何设置显示内容而不是显示对象
- ASP.NET 1.1与ASP.NET 2.0 应用运行并存
- 大学计算机试卷分析报告,(最新整理)大学试卷分析报告
- 拼多多开除即将拿到股票的安全大佬;虾米音乐将永久关停;GitHub 解禁伊朗开发者使用权
- 一个优秀的Android应用从建项目开始
- Eclipse 下用Maven构建ssh框架web工程
- Linux安装Python3详解
- Visual Studio 2019 c#的winform开发,基本操作
- 乐优商城(01)--项目启动
- 交换机接口的双工模式
- vue 实现上拉加载
- 查找、替换使用正则表达式
- 用python编程锁定别人的手机_python输入错误密码用户锁定实现方法
- MATLAB矩阵生成函数
- EQ——音频处理的利器
热门文章
- 深入探索边缘计算:物联网与5G时代的技术趋势
- IBM的医疗AI为何失败
- 中国科学家将绘制最精细人脑三维“地图”
- 机器学习 TOP 10 必读论文 | 资源
- 大脑神经细胞也有老熟人
- 魔性“合成大西瓜”背后,我用 350 行代码解开了碰撞之谜!
- 实名羡慕!蚂蚁员工激励达 1376.9 亿,人均能在杭州买套 283 平的房子?
- 一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
- 可怕!如果张东升是个程序员......
- 最值得你收藏的30个Python常用小技巧