前言:考虑到数据分页的通用性,我在设计的时候,把它放在base class中,任何需要分页的class只需要继承此base class即可。
----BaseDAO-----
package cn.rhui.framework.baseclass.dao;
import java.util.List;
import org.springframework.dao.DataAccessException;
/**
* @author bluesunny
*
* 分页基类 主要包括两个方法 getDataTotalNum 取得总的记录数 selectPageDataByHQL 查询分页数据
*/
public interface BaseDAO {
int getDataTotalNum(String hql) throws DataAccessException;
List selectPageDataByHQL(String hql,int page_size,int pageNo) throws DataAccessException;
}
--BaseDAOImpl------
public class BaseDAOImpl extends HibernateDaoSupport implements BaseDAO {
protected Logger log = Logger.getLogger(this.getClass());
/**
* 取得总的记录数
*/
public int getDataTotalNum(String hql) throws DataAccessException{
int amount = 0;
log.info("取得总记录数 " + hql);
Session session = getSession(); //取得session
Query query=null;
int start = hql.toLowerCase().indexOf("from");
query=session.createQuery("select count(*) from "+hql.substring(start+4)); //查询符合条件数据
List list = query.list();
if(!list.isEmpty()){
amount = Integer.parseInt(list.get(0).toString()) ;
}
closeSessionIfNecessary(session); //关闭session
return amount;
}
/**
* 分页显示数据
*/
public List selectPageDataByHQL(String hql,int page_size,int pageNo) throws DataAccessException{
log.info("查询数据 " + hql);
List list = new ArrayList();
int total_page=0; //总页数
int total_num = getDataTotalNum(hql); //总记录数
if(total_num % page_size==0){ // 取得总页数
total_page = total_num/page_size;
}else{
total_page = total_num/page_size +1;
}
if(pageNo > total_page) pageNo= total_page;
int start=(pageNo-1)*page_size; //开始数据的位置
int rowNum=page_size; //每页显示数据
Session session = getSession(); //取得session
Query query=null;
query=session.createQuery(hql); //查询符合条件的数据
query.setFirstResult(start);
query.setMaxResults(rowNum);
list = query.list();
closeSessionIfNecessary(session); //关闭session
return list;
}
}
优势:可以做到重用 适合不太复杂的hql查询
缺陷:不适合join的关联查询 以及有中文做为参数的查询
解决方式:重写这两个方法 中文参数使用占位符解决