Hibernate通用Dao
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的更多相关文章
- Hibernate的Dao层通用设计
hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...
- [Hibernate] - Generic Dao
使用泛型写了一个通用的Hibernate DAO类. GenericDao接口 package com.my.dao; import java.io.Serializable; import java ...
- 《项目架构那点儿事》——Hibernate泛型Dao,让持久层简洁起来
[前言]hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据 库.同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么 ...
- hibernate基础dao类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- hibernate的dao中参数的传递取值
hibernate的dao中参数的传递取值 private Query setParameter(Query query, Map<String, Object> map) { if (m ...
- 使用mybatis完成通用dao和通用service
使用mybatis完成通用dao和通用service 概述: 使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如Spr ...
- Java反射结合JDBC写的一个通用DAO
以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
随机推荐
- 云-腾讯云-笔记:pom.xml 配置
ylbtech-云-腾讯云-笔记:pom.xml 配置 1. pom.xml返回顶部 1.1 com.qcloud / 腾讯云 <!-- https://mvnrepository.com/ar ...
- Spring有关面试问题
问题清单: 什么是Spring框架?Spring框架有哪些主要模块? 使用Spring框架有什么好处? 什么是控制反转(IOC)?什么是依赖注入? 请解释下Spring中的IOC? BeanFacto ...
- oracle增加用户密码,cmd导入数据库
1.tomcat中sql语句 用户名 pdmis 密码pdmis create USER pdmis IDENTIFIED BY pdmis;grant create session to pdmis ...
- Git初次使用,记录自己看
Git官网下载:https://git-scm.com/downloads 官网如果太慢,可以去这下载:http://www.wmzhe.com/soft-38801.html,注意选择如下图地址下载 ...
- 第二周课堂笔记2th
---恢复内容开始--- 1. 2.索引取单个值 取多个值叫切片, 切片:取多个值 从左到右取值: 原则:顾头不顾尾 1, a[0:3] abc 2, a[-5:-2] abc 3, a[0:-2] ...
- UMP系统架构 RabbitMQ
- Ip- Linux必学的60个命令
1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户.几乎所有的Linux发行版本都支持该命令. ...
- Spring Boot 整合 ActiveMQ
依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...
- 阿里巴巴大数据产品最新特性介绍--机器学习PAI
以下内容根据演讲视频以及PPT整理而成. 本次分享主要围绕以下五个方面: PAI产品简介 自定义算法上传 数加智能生态市场 AutoML2.0自动调参 AutoLearning自动学习 一.PAI产品 ...
- csps模拟测试74梦境,玩具,飘雪圣域题解
题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...