【spring+hibernate学习文档】--数据分页

   前言:考虑到数据分页的通用性,我在设计的时候,把它放在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的关联查询 以及有中文做为参数的查询

  解决方式:重写这两个方法  中文参数使用占位符解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值