对于分页的理解

本文介绍了一种通过SQL语句实现在数据库层面进行分页的技术方案。该方案避免了将所有数据加载到内存中所带来的压力,同时详细展示了如何构建SQL查询以获取特定页的数据,并提供了从DAO层到View层的具体实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来说说这个分页功能的实现:

 

       以前知道的就是先从数据库中查询出所有的数据. 然后通过几个层的各个设计, 使之分层, 问了问别人,说这种方法不是

 

太好, 因为这个东西就好像是内存的一个分页似得,全部数据都放在内存当中, 无形中对电脑是一个很大的压力.

 

加入我们实现数据库中的一个分页呢? 挺好的 , 也就是说 通过在jsp 页面中, 选择了要显示的页面的索引, 然后传给dao层,

 

让数据库来判断要显示的那部分数据, 并且只把要显示的那部分数据查询出来, 传给jsp 页面 , 这样的话就减轻了电脑的内存

 

压力, 但是相对来讲有增强了 数据库的压力, 因为这会是一个对数据库进行多次查询的方法.

 

至于究竟哪种方式好, 还是以后慢慢总结吧!  

 

前几天想要为程序做一个分页代码,去网上搜了下,真的有很多资源。

 

但是每个都很复杂,看一眼都头大了,更不要说要我去一行一行的理解了,拿出李白曾经给出的demo,看了几眼,也怵头。

 

一狠心,一咬牙。自己做。

 

用了N天的时间(实在没有勇气去计算用了几天)来研究分页代码,今天算是弄出来了.

 

先说说这个sql语句:

 

"select top 每页要显示数据行数 * from table_name where id not in(select top 每页要显示数据行数(要显示的页面索引-1) id from table_name)"

 

子查询中, 假设我要查看第二页中的数据, 而且每页的数据行数是5的话 ,那么 就是 5 (2 - 1) .子查询中的语

 

句就成了 select top 5  id from table_name ,这个就等于查询出 top 5 的数据, 紧接着, 在外面还有一

 

条语句          

 

select top 5 * from table_name where id not in ( result ) 

 

这里就很明朗了, 外边也是要查询 top 5 的数据, 然后他有一个约束条件 , 那就是 where id  not in

 

就是不在查询的结果的范围内的 前5条数据,

 

你想啊 子查询的结果是表中的前五条数据 , 那不在这个范围的  , 而且还是在 前 5 条数据的 ,

 

 肯定就是 6 ---10 条数据了, 那就是 我们开始选择的 要显示的第二页的数据了.

 

 

 

下面来说一下分页中的其他部分的构思:

 

          我还是从开发的角度来说吧 , 从dao层开始

 

public ArrayList query(int choosePageIndex) {
  lastZxBean lastZx = null ;
  ArrayList list = new ArrayList();  
  int total =  5 * (choosePageIndex - 1 ) ;
  String sql = "select top 5 * from lastZx " +
    "where Lid not in" +
    "(select top "+total+" Lid from lastZx)";
 
  con = connBean.getConnection();
  try {
   stmt = con.createStatement();
   rs = stmt.executeQuery(sql);
   while(rs.next()){
    lastZx = new lastZxBean();
    lastZx.setLid(rs.getInt("Lid"));   
    lastZx.setRemark(rs.getString("remark"));
    list.add(lastZx);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   freeMem();
  }
  return list;
 }

 

在dao层只需要传入我们要显示的页面的索引, 经过简单的计算 ,然后将结果传入 sql  语句中,  这里的步骤就不多做介绍了.

 

进入servlet层 , 其实这里也没有多做什么 , 就是 这样的

 

lastZxBean lastZx = new lastZxBean();
  String temp = request.getParameter("page");
  Integer temp2 = Integer.valueOf(temp);
  int choosePageIndex = temp2.intValue();
  List list = lastZx.query(choosePageIndex);

 

将jsp页面选中的要显示的页面数传递过来  然后经过一些转换, 调用dao层的方法的 传入参数就OK 了.

 

最后也是最重要的 VIew层 , 也就是 jsp页面那层

 

看看重要的代码:

 

function choosePageIndex(){
 document.pagination.submit();
}

 

<form name="pagination"  action="PagInationServlet" method="post">
   <select  name="page"  onchange="choosePageIndex()">
    <c:forEach items="${requestScope.listPage}" var="page">
     <option value="${page }" >${page }</option>
    </c:forEach>
   </select>   
  </form>

 

这部分就是这些, 主要的是那个js  ,  丫丫的 ,我以前写的是 document.forms[2].submit();  而且这里的

 

pagination 表单也就是 jsp页面中的第三个页面, 我提交就是不成功 . 而且改成了 现在这样子

 

他们就是对我说, forms[2 ] 不一定就是 jsp页面的第三个 form ,  至于为什么? 到现在也没有得到一个

 

解释. 唉  !

 

回来再说 ,明白了再回来写下来.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值