1. 接口

package com.coder163.main.dao;

import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.Collection;
import java.util.List; /**
* 功能描述: Hibernate通用的持久层接口
*
* @author 侯叶飞
* @create 2018-04-12 14:24
**/
public interface BaseDaoI<T> { /**
* 保存
*
* @param entity 对象
*
* @return id
*/
Serializable save(T entity);
/**
* 将实体对象 集合保存到数据库中
*
* @param collection
* 实体对象 集合
*/
void saveAll(Collection<T> collection); /**
* 更新
*
* @param entity 对象
*/
void update(T entity); /**
* 保存或更新
*
* @param entity 对象
*/
void saveOrUpdate(T entity); /**
* 删除
*
* @param entity 删除的对象
*/
void delete(T entity); /**
* 通过对象标识符获取对象
*
* @param id 主键
* @return 标识符对应的对象,没找到则返回null
*/
T findById(Serializable id); /**
* 返回所有对象的列表
*
* @return
*/
List<T> findAll(); /**
* 查找满足条件的总记录数
*
* @param detachedCriteria 查询条件
* @return
*/
Integer findRecordNumByPage(DetachedCriteria detachedCriteria); /**
* 向分页对象中设置记录
*
* @param detachedCriteria
* 离线查询对象
* @param startIndex
* 开始索引
* @param pageSize
* 每页记录数
* @return
*/
List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize); /**
* 通过条件查询
*
* @param detachedCriteria
* @return
*/
List<T> findByCriteria(DetachedCriteria detachedCriteria); /**
* 通用更新方法
*
* @param queryName
* 命名查询的名字,在映射文件中定义
* @param objects
* 参数列表
*/
void executeUpdate(String queryName, Object... objects); /**
* 按条件统计
* @param deCriteria
* @return
*/
Integer count(DetachedCriteria deCriteria);
}

2. 实现类

package com.coder163.main.dao;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections; import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List; /**
* 功能描述: Hibernate通用持久层接口实现类
*
* @author 侯叶飞
* @date 2018-04-12 14:30
**/
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDaoI<T> {
// 存储泛型的实际参数
private Class entity; public BaseDaoImpl() {
// 谁实现该类,这就是谁的类字节码
Class c = this.getClass();
// 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
Type type = c.getGenericSuperclass();
// 将类型强转为参数化类型
ParameterizedType pType = (ParameterizedType) type;
// 获取该类的父类的所有实际类型参数,也就是泛型的实际参数
// 这里也就是获取BaseDaoImpl的实际类型参数
Type[] actualTypeArguments = pType.getActualTypeArguments();
// 将实际类型参数赋值给成员变量
entity = (Class) (actualTypeArguments[0]);
} @Override
public Serializable save(T entity) {
return this.getHibernateTemplate().save(entity);
} @Override
public void saveAll(Collection<T> collection) {
for (T t : collection) {
this.getHibernateTemplate().save(t);
}
} @Override
public void update(T entity) {
this.getHibernateTemplate().update(entity);
} @Override
public void saveOrUpdate(T entity) {
this.getHibernateTemplate().saveOrUpdate(entity);
} @Override
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
} @Override
public T findById(Serializable id) {
return (T) this.getHibernateTemplate().get(this.entity, id);
}
@Override
public List<T> findAll() {
StringBuffer hql = new StringBuffer("from "); hql.append(entity.getName()); return this.getHibernateTemplate().find(hql.toString());
} @Override
public Integer findRecordNumByPage(DetachedCriteria detachedCriteria) {
// 设置记录数投影
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
// 将投影置为空
detachedCriteria.setProjection(null);
if (list.size() > 0) {
return list.get(0).intValue();
}
return null;
} @Override
public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
// 指定hibernate在连接查询时,只封装成一个对象
detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, startIndex, pageSize);
} @Override
public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
} @Override
public void executeUpdate(String queryName, Object... objects) {
// 获取当前session
Session session = this.getSessionFactory().getCurrentSession();
// 获取命名查询对象
Query query = session.getNamedQuery(queryName);
int i = 0;
// 设置参数
if (objects != null) {
for (Object object : objects) {
query.setParameter(i++, object);
}
}
query.executeUpdate();
} @Override
public Integer count(DetachedCriteria deCriteria) {
deCriteria.setProjection(Projections.rowCount());
return Integer.parseInt(deCriteria.getExecutableCriteria(this.getSession()).uniqueResult().toString());
}
}

Hibernate通用Dao的更多相关文章

  1. Hibernate的Dao层通用设计

    hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...

  2. [Hibernate] - Generic Dao

    使用泛型写了一个通用的Hibernate DAO类. GenericDao接口 package com.my.dao; import java.io.Serializable; import java ...

  3. 《项目架构那点儿事》——Hibernate泛型Dao,让持久层简洁起来

    [前言]hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据 库.同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么 ...

  4. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  5. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  6. hibernate的dao中参数的传递取值

    hibernate的dao中参数的传递取值 private Query setParameter(Query query, Map<String, Object> map) { if (m ...

  7. 使用mybatis完成通用dao和通用service

    使用mybatis完成通用dao和通用service 概述: 使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如Spr ...

  8. Java反射结合JDBC写的一个通用DAO

    以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...

  9. Spring Boot-------JPA——EntityManager构建通用DAO

    EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...

随机推荐

  1. 使用docker安装redis

    1.安装docker .检查内核版本,必须是3.10及以上 [root@localhost ~]# uname -r .安装docker [root@localhost ~]# yum install ...

  2. jquery判断是pc端还是移动端

    原文地址:https://www.cnblogs.com/mo-cha/p/6038872.html $(function(){ var system = { win: false, mac: fal ...

  3. 深入浅出写一个多级异步回调从基础到Promise实现的Demo

    今天一时兴起,写了一个渐进升级的异步调用demo,记录一下. 1. 最基础的同步调用 //需求:f2在f1之后执行,且依赖f1的返回值.如下: function f1(){ var s="1 ...

  4. PAT甲级——A1111 Online Map【30】

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  5. 第八篇:ZTree操作总结

    花了一个多星期,终于完成了这个完整的功能,今天周五是时候总结下加深理解了. 项目要实现的功能:将树形目录发布到发布库,若是根目录,没有发布,连同自己和下面所有的子目录们全部发布:不是根目录,判断父目录 ...

  6. java中 ++a 与 a++ 的区别

    public static void main(String[] args) { int a = 5; a ++; System.out.println(a); int b = 5; ++ b; Sy ...

  7. HDU 1147 /// 判断两线段相交

    题目大意: 给定n条线段的端点 依次放上n条线段 判断最后在最上面(不被覆盖)的线段有哪些 到当前线段后 直接与之前保存的未被覆盖的线段判断是否相交就可以了 #include <cstdio&g ...

  8. curl http_code 状态码

    1.只得到一个url的http_code的状态码 curl -I -m 10 -o /dev/null -s -w %{http_code} http://127.0.0.1/a.html 查询hea ...

  9. JavaScript特效源码(8、其他特效)

    1.中文日期 中文日期[无须修改][共1步]] ====1.将以下代码加入HEML的<body></body>之间 <script LANGUAGE="Java ...

  10. commons lang3的StringUtils中isEmpty()方法和isBlank()方法的区别

    先给结论: 1. StringUtils.isEmpty()中的空格作非空处理2. StringUtils.isNotEmpty()是StringUtils.isEmpty()取反后的结果3. Str ...