Hibernate抽取BaseDao
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的更多相关文章
- 案例50-crm练习dao层的抽取BaseDao
1 抽取BaseDao 2 BaseDao设计思路 3 BaseDao接口书写 package www.test.dao; import java.io.Serializable; import ja ...
- 使用HibernateDaoSupport抽取BaseDao
在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以 ...
- Hibernate的BaseDao辅助类
1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...
- jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具
jDialects(https://git.oschina.net/drinkjava2/jdialects) 是一个收集了大多数已知数据库方言的Java小项目,通常可用来创建分页SQL和建表DDL语 ...
- 基于hibernate的BaseDao及其实现类的设计
以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了.但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来.不过,有了反射,我们可以通过泛型来实现我们想要做的功 ...
- ssm框架整合抽取BaseDao接口
import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...
- Dao层抽取BaseDao公共方法
设计IBseDao接口,定义公共的CRUD方法. // IBaseDao 接口,定义公共的CRUD方法 public interface IBaseDao<T> { public void ...
- 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)
想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...
- JAVAEE——SSH项目实战02:客户列表和BaseDao封装
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...
随机推荐
- HDU_5510_Bazinga
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- android mock location
原理:用 setTestProviderLocation 设置模拟gps的位置 http://androidcookbook.com/Recipe.seam?recipeId=1229 http:// ...
- time-based DB
这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...
- 关于spring的applicationContext.xml配置文件的ref和value之自我想法
今天在做SSH的一个项目的时候,因为需要定时操作,所以就再sping里面加入了一个quartz的小定时框架,结果在运行时候,发生了一个小bug. Caused by: org.springframew ...
- springData 整合 Rrdis
导包(使用maven的话,采用坐标的方式) <!-- redis nosql 内存数据库 --> <dependency> <groupId>redis.clien ...
- Zipline Beginner Tutorial
Zipline Beginner Tutorial Basics Zipline is an open-source algorithmic trading simulator written in ...
- 转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报 java.net.SocketException: Too many open files错误,错误 ...
- SpringBoot-模板渲染
模板 开发Web站点的本质,其实就是根据浏览器发起的请求(输入),生成HTML代码返回给浏览器(输出).在之前的学习中,我们已经通过文件的形式存储起来而不是直接在Java代码中生成HTML代码.另一方 ...
- springmvc 之 easyUI开发商城管理系统
1.分页 url:controller的路径 pageSize:每页显示的行数 ---后台参数名(rows) 会向后台传递一个 page参数,表示当前页.---后台参数名(page) controll ...
- 3D游戏引擎中常见的三维场景管理方法
对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...