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. 用VC生成 IDispatch 包装类

    1.创建包装类:View->ClassWizard->Add Class->Add Class From ActiveX Control Wizard 2 .选中Registry 3 ...

  2. 转: sizeof,总结

    源地址:http://blog.csdn.net/freefalcon/article/details/54839 0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少 ...

  3. python+appium真机运行登录例子

    一.手机USB连接电脑(手机打开调试模式) 验证:cmd -> 输入adb devices,查看手机的UDID.显示如下表示 连接成功 二.启动Appium服务 1. 启动Appium,点击 右 ...

  4. vue导航条选中项样式

    html: <div id="app"> <div class="collection"> <a href="#!&qu ...

  5. Mybatis Resultmap 简化之超级父类

    我们在写 mybatis多表关联查询的时候 ,要配置  resultmap ,实在太麻烦.而这个超级父类 可以省去我们查询多表时的map public class SuperPojo extends ...

  6. 面试系列 31 zk都有哪些使用场景

    大致来说,zk的使用场景如下,我就举几个简单的,大家能说几个就好了: (1)分布式协调:这个其实是zk很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B消息消费之后处理了.那A系统如 ...

  7. shell脚本练习02--求字符串的长度

    ######################################################################### # File Name: -.sh # Author ...

  8. [转]WPF——Thumb

    Thumb类,表示可由用户拖动的控件.其主要三个事件分别DragDelta,DragStarted,DragCompleted. DragDelta——当 Thumb 控件具有逻辑焦点和鼠标捕获时,随 ...

  9. 0818NOIP模拟测试赛后总结

    又挂了…… 120 rank19. 第一次两个机房考不同的题目.一开始并不知道应该做哪套题目. 不明真相的吃瓜群众决定先点开B套.通读三道题,只是觉得T2好水.似乎是红题难度吧……(后来证明是我读错题 ...

  10. 「题解」:[BZOJ4358]permu

    问题: permu 时间限制: 30 Sec  内存限制: 512 MB 题面 题目描述 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域 连 ...