package com.cky.dao;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.util.Assert; import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class BaseDao<T> {
private Class<T> entityClass;
private HibernateTemplate hibernateTemplate;
@Autowired
public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate=hibernateTemplate;
}
  //反射获取泛型类型
public BaseDao(){
Type genType=getClass().getGenericSuperclass();
Type[] types=((ParameterizedType)genType).getActualTypeArguments();
entityClass=(Class)types[0];
}
  //通过Id查找对象
public T findById(Serializable id){
return getHibernateTemplate().get(entityClass,id);
}
  //离线查询对象
public List<T> findByCriteria(DetachedCriteria criteria){
return (List<T>) getHibernateTemplate().findByCriteria(criteria);
}
  //查询所有对象
public List<T> findAll(){
return getHibernateTemplate().loadAll(entityClass);
}
  //保存对象
public void save(T entity){
getHibernateTemplate().save(entity);
}
  //删除对象
public void removeByEntity(T entity){
getHibernateTemplate().delete(entity);
}
  //根据id删除对象
public void removeById(final Serializable id){
T obj=findById(id);
getHibernateTemplate().delete(obj);
}
  //更新对象
  //更新操作通常是先查询数据库对象,然后修改此对象,最后再更新。
  //需要注意的是如果查询和修改在一个session中(或同一事务),不用使用update()。
  //因为session缓存和快照的存在,会自动进行修改,如果使用update(),反而会报缓存中已存在此对象的异常
public void update(T entity){
getHibernateTemplate().update(entity);
}
  //获取HibernateTemplate
public HibernateTemplate getHibernateTemplate(){
return hibernateTemplate;
}
  //获取当前线程的session
public Session getSession(){
return hibernateTemplate.getSessionFactory().getCurrentSession();
}
  //分页查询
public Pager pagedQuery(String hql,int pageNo,int pageSize,Object... values){
Assert.hasText(hql);
Assert.isTrue(pageNo >= 1, "pageNo should start from 1");
// Count查询
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
List countlist = getHibernateTemplate().find(countQueryString, values);
long totalCount = (Long) countlist.get(0); if (totalCount < 1)
return new Pager();
// 实际查询返回分页对象
int startIndex = Pager.getStartOfPage(pageNo, pageSize);
Query query = createQuery(hql, values);
List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Pager(startIndex, pageSize, totalCount,list);
} /**
* 创建Query对象. 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
* 留意可以连续设置,如下:
* <pre>
* dao.getQuery(hql).setMaxResult(100).setCacheable(true).list();
* </pre>
* 调用方式如下:
* <pre>
* dao.createQuery(hql)
* dao.createQuery(hql,arg0);
* dao.createQuery(hql,arg0,arg1);
* dao.createQuery(hql,new Object[arg0,arg1,arg2])
* </pre>
*
* @param values 可变参数.
*/
public Query createQuery(String hql, Object... values) {
Assert.hasText(hql);
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
return query;
}
/**
* 去除hql的select 子句,未考虑union的情况,用于pagedQuery.
*
* @see #pagedQuery(String,int,int,Object[])
*/
private static String removeSelect(String hql) {
Assert.hasText(hql);
int beginPos = hql.toLowerCase().indexOf("from");
Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'");
return hql.substring(beginPos);
} /**
* 去除hql的orderby 子句,用于pagedQuery.
*
* @see #pagedQuery(String,int,int,Object[])
*/
private static String removeOrders(String hql) {
Assert.hasText(hql);
Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(hql);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "");
}
m.appendTail(sb);
return sb.toString();
}
}

分页pager.java

package com.cky.dao;

import lombok.Data;

import java.util.ArrayList;
import java.util.List; @Data
public class Pager<T> {
private static int DEFAULT_PAGE_SIZED=20; private int start; //开始位置
private int pageSize=DEFAULT_PAGE_SIZED;//一页显示的个数
private long totalCount;//总记录数 private List<T> data;//当前页存放的记录 public Pager(){
this(0,0,DEFAULT_PAGE_SIZED,new ArrayList<T>());
} public Pager(int start, int pageSize, long totalCount, List<T> data) {
this.start = start;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.data = data;
} /**
* 取总页数
*/
public long getTotalPageCount(){
if(totalCount%pageSize==0)
return totalCount/pageSize;
else
return totalCount/pageSize+1;
} /**
*获取当前页
*/
public long getCurrentPageNo(){
return start/pageSize+1;
} /**
*是否有下一页
*/
public boolean isHasNextPage(){
return this.getCurrentPageNo()<this.getTotalPageCount();
} /**
*是否有上一页
*/
public boolean isHasPreviousPage(){
return this.getCurrentPageNo()>1;
} /**
*
* @param pageNo 页数
* @param pageSize 一页显示记录数
* @return 该页第一条数据位置
*/
public static int getStartOfPage(int pageNo,int pageSize){
return (pageNo-1)*pageSize;
} /**
* 任意一页第一条数据在数据集的位置
*/
protected static int getStartOfPage(int pageNo){
return getStartOfPage(pageNo,DEFAULT_PAGE_SIZED);
} public int getStart() {
return start;
} public void setStart(int start) {
this.start = start;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public long getTotalCount() {
return totalCount;
} public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
} public List<T> getData() {
return data;
} public void setData(List<T> data) {
this.data = data;
}
}

Hibernate抽取BaseDao的更多相关文章

  1. 案例50-crm练习dao层的抽取BaseDao

    1 抽取BaseDao 2 BaseDao设计思路 3 BaseDao接口书写 package www.test.dao; import java.io.Serializable; import ja ...

  2. 使用HibernateDaoSupport抽取BaseDao

            在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以 ...

  3. Hibernate的BaseDao辅助类

    1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...

  4. jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具

    jDialects(https://git.oschina.net/drinkjava2/jdialects) 是一个收集了大多数已知数据库方言的Java小项目,通常可用来创建分页SQL和建表DDL语 ...

  5. 基于hibernate的BaseDao及其实现类的设计

    以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了.但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来.不过,有了反射,我们可以通过泛型来实现我们想要做的功 ...

  6. ssm框架整合抽取BaseDao接口

    import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...

  7. Dao层抽取BaseDao公共方法

    设计IBseDao接口,定义公共的CRUD方法. // IBaseDao 接口,定义公共的CRUD方法 public interface IBaseDao<T> { public void ...

  8. 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

    想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...

  9. JAVAEE——SSH项目实战02:客户列表和BaseDao封装

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...

随机推荐

  1. poj1742 Coins【多重背包】【贪心】

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions:43969   Accepted: 14873 Descriptio ...

  2. ubuntu 卸载 google-chrome

    sudo apt-get autoremove google-chrome-stable

  3. 第九课——MySQL优化之索引和执行计划

    一.创建索引需要关注什么? 1.关注基数列唯一键的数量: 比如性别,该列只有男女之分,所以性别列基数是2: 2.关注选择性列唯一键与行数的比值,这个比值范围在0~1之前,值越小越好: 其实,选择性列唯 ...

  4. java面试基础题------》Java 中的final关键字有哪些用法

    (1)修饰类:表示该类不能被继承: (2)修饰方法:表示方法不能被重写: (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).

  5. 使用ganymed工具调用ssh2

    需要引入ganymed-ssh2-build210.jar包. 其实很简单.所以直接贴代码,代码说话. package com.eshore.framework.util; import java.i ...

  6. trust an HTTPS connection

    https://zh.wikipedia.org/wiki/传输安全协议 SSL协议客户端要收发几个握手信号: 发送一个“ClientHello”消息,内容包括:支持的协议版本,比如TLS1.0版,一 ...

  7. devops model

    1,自动部署() 2,在线监控 (可视化,智能化) 3,故障诊断 (故障识别,故障隔离) 4,快速定位 (识别环境与程序,数据等问题) 评测工具开发---- 统计条目增加大项目: BI中权限―拨测数据 ...

  8. 剑指Offer——最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析: 建一个K大小的大根堆,存储最小的k个数字. 先将K个数进堆 ...

  9. 消息编解码Nanopb - protocol buffers

    Google Protocol Buffer 有各种版本的代码包,Python C/C++.JAVA.C.OBJ-C..NET等,嵌入式设备中使用的protobuf版本,我们选择的是nanoprobu ...

  10. Linux的日志管理

    Linux日志的管理 日志:记录了你几乎所有的操作记录,用于系统的审核,故障的排除.日志文件永久存放在日志目录中,系统日志保存在/var/log中 rsyslog 按照日志类型分类,把所有日志记录到/ ...