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 ...
随机推荐
- Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...
- CXF整合Spring之JaxWsProxyFactoryBean调用
1.见解 1.1 客户端的接口代码还一定要和服务端的接口代码一样,连注解都要一样,不够灵活 1.2 当客户端访问服务器的请求地址时,如果服务端没有对应的地址,就会报错,但是又没有cxf的异常捕获处理 ...
- Random/Stochastic
---恢复内容开始--- ===================================================== A random variable's possible valu ...
- element自定义表单验证
element-ui框架下修改密码弹窗进行表单验证. 除了基础校验,密码不为空,长度不小于6字符,需求中还需校验密码由数字和字母组合. 处理代码如下: <el-dialog :visible.s ...
- 都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事
都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事 就用下面这段代码在jdk的三个版本运行看了下效果 import java.lang.reflect.Field; ...
- 【opencv】相机标定程序内存溢出
运行相机内参标定程序出现内存溢出的错误 opencv的alloc.cpp报cv::OutOfMemoryError 因为同时开了多个线程,每个线程标定一台相机,每个线程都会imread读入所有标定图片 ...
- LINUX内核分析20133201
实验:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20133201 姓名:李冬辉 注: 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://m ...
- django中同源策略和跨域解决方案
一 同源策略 1.1何谓同源? 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同 ...
- JSP学习(第二课)
把GET方式改为POST在地址栏上就不会显示. 发现乱码了,设置编码格式(这个必须和reg.jsp中page的charset一致): 但是注意了!我们传中文名,就会乱码: 通过get方式提交的请求无 ...
- Oracle中查看建立索引和使用索引的注意点
一.查看和建立索引 select * from user_indexes where table_name = 'student' create index i_student_num on stud ...