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 ...
随机推荐
- poj1742 Coins【多重背包】【贪心】
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions:43969 Accepted: 14873 Descriptio ...
- ubuntu 卸载 google-chrome
sudo apt-get autoremove google-chrome-stable
- 第九课——MySQL优化之索引和执行计划
一.创建索引需要关注什么? 1.关注基数列唯一键的数量: 比如性别,该列只有男女之分,所以性别列基数是2: 2.关注选择性列唯一键与行数的比值,这个比值范围在0~1之前,值越小越好: 其实,选择性列唯 ...
- java面试基础题------》Java 中的final关键字有哪些用法
(1)修饰类:表示该类不能被继承: (2)修饰方法:表示方法不能被重写: (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).
- 使用ganymed工具调用ssh2
需要引入ganymed-ssh2-build210.jar包. 其实很简单.所以直接贴代码,代码说话. package com.eshore.framework.util; import java.i ...
- trust an HTTPS connection
https://zh.wikipedia.org/wiki/传输安全协议 SSL协议客户端要收发几个握手信号: 发送一个“ClientHello”消息,内容包括:支持的协议版本,比如TLS1.0版,一 ...
- devops model
1,自动部署() 2,在线监控 (可视化,智能化) 3,故障诊断 (故障识别,故障隔离) 4,快速定位 (识别环境与程序,数据等问题) 评测工具开发---- 统计条目增加大项目: BI中权限―拨测数据 ...
- 剑指Offer——最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析: 建一个K大小的大根堆,存储最小的k个数字. 先将K个数进堆 ...
- 消息编解码Nanopb - protocol buffers
Google Protocol Buffer 有各种版本的代码包,Python C/C++.JAVA.C.OBJ-C..NET等,嵌入式设备中使用的protobuf版本,我们选择的是nanoprobu ...
- Linux的日志管理
Linux日志的管理 日志:记录了你几乎所有的操作记录,用于系统的审核,故障的排除.日志文件永久存放在日志目录中,系统日志保存在/var/log中 rsyslog 按照日志类型分类,把所有日志记录到/ ...