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. git学习(6)多人协作

    git学习(6)多人协作 当我们从远程仓库克隆的时候,git会自动的把本地的master和远程的master对应起来,并且远程仓库的默认名称是origin 查看远程库的信息 $ git remote ...

  2. WeQuant交易策略—EMV

    EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一 ...

  3. zzuli1783: 简单的求和---求因子和

    1783: 简单的求和 Description 定义f(i)代表i的所有因子和(包括1和i),给定一个l,r.求f(l)+f(l+1)+...+f(r). Input 第一行输入一个t(t<10 ...

  4. CMDB实现的四种方式

    第一种(agent): 这种方式是通过向每一台服务器安装agent脚本,然后通过中控机的API,来收集所需要的数据,最后放到数据库中,在通过web的方式显示出来. 实现流程图: 1.录入资产(主机名, ...

  5. MySQL 最基本的SQL语法/语句

    DDL—数据定义语言(Create,Alter,Drop,DECLARE) DML—数据操纵语言(Select,Delete,Update,Insert) DCL—数据控制语言(GRANT,REVOK ...

  6. Loadrunner中参数化取值方式分析

    Loadrunner中参数化取值依赖两个维度: 1.取值顺序分为“顺序”“随机”“唯一”.    select next row:Sequential , Random,unique 2.更新值时分为 ...

  7. centOS7下安装laravel + composer

    1.wget https://dl.laravel-china.org/composer.phar -O /usr/local/bin/composer chmod a+x /usr/local/bi ...

  8. Selenium2.0 Webdriver 随笔

    Webdriver can't action the element when the element is out of view 1. Scroll to the element use Java ...

  9. Linux系统——账号管理

    用户账号管理 分类: 超级用户 root uid=0 gid=0 权限最大 普通用户 uid=>500 ,一般权限的系统管理 程序用户 1=<uid,为了提升系统安全性,支持所对应服务对系 ...

  10. JavaScript:学习笔记(8)——对象扩展运算符

    JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...