Java中要分页可以用以下技术实现:
a,拼写sql语句来实现。
b,控制res(结果集)。
c,放进list集合中根据设置遍历次数来达到分页的目的。
d,使用Hibernate来分页。
但是前面的b和c方法很占资源,故不推荐使用。下面来说说其他两种:

一:JDBC使用SQL语句分页

使用SQL语句来实现分页,必须top子句来查询。根据sql语句返回该页的结果。
top子句为:

-------------------------------------------------------------

select top AA * from test
where testid
not in
(
select top BB testid from test orderby testid
)
order by testid




-------------------------------------------------------------
其中AA位置为每页你要显示的条数,而BB部分为当前页码-1乘以每页要显示的条数,也就是AA位置上的数字。(nowPage-1*pageSize)。当点击下一页的时候通过url传递当前第几页信息,动态的拼写sql语句就能得到不同的结果集,从而达到分页的目的。

二:使用Hibernate进行分页

使用Hibernate分页基本原理同上。只是hibernate帮程序员进行了封装,只需要传递和设置参数即可。
细分分为6步:
1,拼写HQL语句
2,得到Session对象
3,得到Query对象
4,设置Query对象的setFirstResult(int count)值
5,设置Query对象的setMaxResults(int count)值
6,执行Query的list方法返回分页的结果集;
在第5步和第6步中需要int型数值参数。不说了,看代码:
 

public List select(int nowPage, int pageSize)

{
  Session session = null;
  try

 {   
   String hql ="from Test";
   session =getHibernateTemplate().getSessionFactory().openSession();
   Query query =session.createQuery(hql);
   query.setFirstResult((nowPage- 1) * pageSize);
   query.setMaxResults(pageSize);
   return query.list();
   }

  finally

  {
   /-/以下代码为避免hibernate占用内存资源过多而做的处理
   session.close();
   session.clear();
   session =null;
   getHibernateTemplate().clear();
   getHibernateTemplate().flush();
   System.out.println("模版清空过了!");
  }
 }




另外,在分页的时候还需要总页数。看代码吧:


1---sql语句为select count(*) from test

2---hibernate

public int getPageCount()
 {
  ---- 一共多少页 默认0页
  String hql = "select count(t)from Test t";
  ---- 得到了一共多少条记录
  Object o =getHibernateTemplate().getSessionFactory().openSession()
     .createQuery(hql).uniqueResult();
  ---- 得到了一共多少行
  int rowCount =Integer.parseInt(o.toString());
  ---- 每页三条数据
  pageCount = rowCount / 3;
  if (rowCount % 3 != 0) {
   pageCount++;
  }
  return pageCount;
 }

上面仅仅是讲理论,下面是做的一个示例。



最近再做一个简易BBS,其中要用到分页技术,以前做过一个小型网上书店系统,记得当时是用弄了一个接口:PagingInterface,其中有得到总记录数、得到总页数、和一些根据当前页到结束页的查询方法。  然后再一个UserDAO类、BookDAO类中继承Paging方法,实现相应的“一些根据当前页到结束页的查询方法”等,然后再一个PagingServlet类中调用这些方法。。。。具体的类代码这里也不贴了,这种方法复用性不高,结构性差,不推荐使用。这次做这个BBS,经过几次的调试,终于弄成功了。下面是分页的主类:



[html] view plain copy


1. /**  
2.  * 分页对象,进行一系列分页操作  
3.  *   
4.  * @author weiyiorng



[html] view plain copy

    1.  * @version 1.0 12/03/20  
    2.  * */  
    3. public class SplitPage {  
    4.     // 声明一些常量  
    5. FIRSTPAGE = "first";// 请求的是首页  
    6. PREVIOUSPAGE = "previous";// 请求上一页  
    7. NEXTPAGE = "next";// 请求下一页  
    8. LASTPAGE = "last";// 请求最后一页  
    9.   
    10.     // 声明一些变量  
    11. pageRow = 3;// 每页显示记录数  
    12. totalRow = 0;// 总的记录数,有数据库操作类DAO提供  
    13. currentPage = 1;// 当前的页面  
    14. firstPage = 1;// 首页位置  
    15. totalPage = 1;// 总的页面数,默认为一页  
    16.   
    17.     public int getPageRow() {  
    18.         return pageRow;  
    19.     }  
    20.   
    21.     /**  
    22.      * 重新设置每页显示的记录数  
    23.      *   
    24.      * @param pageRow  
    25.      *            新的每页显示记录数  
    26.      */  
    27.     public void setPageRow(int pageRow) {  
    28. pageRow
    29.             try {  
    30.                 throw new Exception();// 如果pageRow被设置为零,应当抛出异常.  
    31.             } catch (Exception e) {  
    32.                 // TODO Auto-generated catch block  
    33.                 e.printStackTrace();  
    34.             }  
    35.         }  
    36.   
    37. this.pageRow = pageRow;// 修改每页的记录数  
    38. this.totalPage = this.totalRow / this.pageRow  
    39. this.pageRow
    40.     }  
    41.   
    42.     public int getTotalRow() {  
    43.         return totalRow;  
    44.     }  
    45.   
    46.     public void setTotalRow(int totalRow) {// 设置分页对象的总记录属性后,就应该根据每页面显示记录数,计算得到总的页面数  
    47. this.totalRow = totalRow;  
    48. this.totalPage = this.totalRow/this.pageRow+((this.totalRow%this.pageRow==0)?0:1);  
    49.         System.out.println("当前页"+this.currentPage);  
    50.   
    51.     }  
    52.   
    53.     public int getCurrentPage() {  
    54.         return currentPage;  
    55.     }  
    56.   
    57.     public void setCurrentPage(int currentPage) {  
    58. this.currentPage = currentPage;  
    59.     }  
    60.   
    61.     public int getFirstPage() {  
    62.         return firstPage;  
    63.     }  
    64.   
    65.     public void setFirstPage(int firstPage) {  
    66. this.firstPage = firstPage;  
    67.     }  
    68.   
    69.     public int getTotalPage() {  
    70.         return totalPage;  
    71.     }  
    72.     //不应该提供方法设置总页面数,它是计算得到的   
    73.   
    74.     /**  
    75.      * 根据请求的标示符参数重新计算要现实的页面  
    76.      *   
    77.      * @param flag  
    78.      *            请求转向的页面标示符  
    79.      * @return int 返回新页  
    80.      */  
    81.     public int toNewPage(String flag) {  
    82. newPage = this.currentPage;  
    83.         if (flag != null && !"".equals(flag)) {  
    84.             if (SplitPage.FIRSTPAGE.equals(flag)) {  
    85. newPage = 1;  
    86.             } else if (SplitPage.LASTPAGE.equals(flag)) {  
    87. newPage = this.totalPage;  
    88.             } else if (SplitPage.NEXTPAGE.equals(flag)) {  
    89. newPage = this.currentPage  
    90. this.currentPage
    91.             } else if (SplitPage.PREVIOUSPAGE.equals(flag)) {  
    92. newPage = this.currentPage  
    93. this.currentPage
    94.             } else {  
    95.                 // 传入的是个数字字符串参数  
    96. newPage = Integer.parseInt(flag.trim());  
    97.             }  
    98.         } else {// 请求的参数为空,则当前页码不变  
    99. newPage = this.currentPage;  
    100.         }  
    101.         this.setCurrentPage(newPage);// 记得重新设置当期页面  
    102.         return newPage;  
    103.     }  
    104. }



    为什么说这个类重要呢?因为你在想要分页的时候,所有的分页参数都可以在这里面设置,动态静态的都可以实现,复用性很高!

    下面声明一个分页接口,设置具体的分页对象(比如你要分页的是用户列表还是帖子列表)等:



    [java] view plain copy

      1. public interface
      2. /**
      3.      * 查询所有的记录,调用分页生成器类中的分页方法查询数据
      4.      * 
      5.      * @param splitPage
      6.      *            分页对象
      7.      * @return List<Object>
      8.      * */
      9. public List<UserInfoVo> findUserAll(SplitPage splitPage);//查询用户列表
      10.     /**  
      11.      * 查询所有的记录,调用分页生成器类中的分页方法查询数据  
      12.      *   
      13. @param



      [java] view plain copy

      1.            *            分页对象  
      2. @return
      3.      * */  
      4. public List<ForumInfoVo> findForumAll(SplitPage splitPage);//查询帖子
      5. /**
      6.      * 提供总的记录数
      7.      * */
      8.   
      9. public int
      10. /**
      11.      * 查询所有的记录,调用分页生成器类中的分页方法查询数据
      12.      * 
      13.      * @param splitPage
      14.      *            分页对象
      15.      * @return List<Object>
      16.      * */
      17. public
      18. }



      然后在各个DAO类(用户DAO、帖子DAO、RefoumDAO等)中实现此接口相应方法,注意在各个DAO类中应该有一个totalRow总记录数的获取和设置方法,得到指定记录数方法,简单起见,我这里是直接得到所有记录getAllRecord()(可以再分页显示时调用以设置分页类别,如查询某一个昵称的所有用户等)。

      接下咱废话少说,直接上显示分页效果的代码:

      forumList.jsp



      [java] view plain copy

      1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
      2. <%@taglib prefix="c" uri="http://java.sun.com/jsf/core"%>  
      3. <%@page import="com.weiyi.bbs.dao.ForumInfoDAO"%>  
      4. <%@page import="com.weiyi.bbs.util.*"%>  
      5. <%@page import="com.weiyi.bbs.domain.*"%>  
      6. <%  
      7.     String path = request.getContextPath();  
      8. "://"
      9. ":"
      10. "/";  
      11. %>  
      12. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
      13. <html>  
      14.     <head>  
      15. "<%=basePath%>">  
      16.   
      17.         <title>帖子列表</title>  
      18.   
      19. "pragma" content="no-cache">  
      20. "cache-control" content="no-cache">  
      21. "expires" content="0">  
      22. "keywords" content="keyword1,keyword2,keyword3">  
      23. "description" content="This is my page">  
      24. "text/javascript" src="js/common.js" charset="utf-8"></script>  
      25. "text/javascript" charset="utf-8">  
      26.         function goPage(){  
      27. "selectPage").value;  
      28. "userId").value;  
      29. "forumList.jsp?flag="+v+"&userId="+u;  
      30.         }  
      31.         </script>  
      32.     </head>  
      33.     <!--spage分页对象,保存分页的详细信息 ,存在Session中,每次查询或者是分页数据时只要设置此对象的当前页 -->  
      34.     <!-- dao帖子操作类,主要用来获取总记录数-->  
      35. "spage" class="com.weiyi.bbs.util.SplitPage"
      36. "session"></jsp:useBean>  
      37. "dao" class="com.weiyi.bbs.dao.ForumInfoDAO"
      38. "session"></jsp:useBean>  
      39.     <%  
      40. "flag");  
      41. int
      42.         dao.setTotalRows(dao.getAllRecord());  
      43. int
      44.         spage.setTotalRow(totalRows);  
      45.     %>  
      46.     <body>  
      47. "wrap">  
      48.             <h3>  
      49.                 查看帖子列表  
      50.             </h3>  
      51. "hidden" name="userId" id="userId" value="<%=request.getParameter("userId")%>"/>  
      52. "destroyservlet">退出</a>     
      53.             <a  
      54. "forumcontroller?type=toNewForum&userId=<%=request.getParameter("userId")%>&power=user">发新帖</a>  
      55. "border">  
      56.                 <thead>  
      57.                     <tr>  
      58.                         <th>  
      59.                             ID  
      60.                         </th>  
      61.                         <th>  
      62.                             标题  
      63.                         </th>  
      64.                         <th>  
      65.                             发帖人  
      66.                         </th>  
      67.                         <th>  
      68.                             发帖时间  
      69.                         </th>  
      70.                         <th>  
      71.                             操作  
      72.                         </th>  
      73.                     </tr>  
      74.                 </thead>  
      75.                 <tbody>  
      76.                     <%  
      77.                         List<ForumInfoVo> list = dao.findForumAll(spage);  
      78. for
      79.                     %>  
      80.                     <tr>  
      81.                         <td><%=forum.getId()%></td>  
      82.                         <td><%=forum.getTitle()%></td>  
      83.                         <td><%=forum.getAuthorName()%></td>  
      84.                         <td><%=forum.getCreateTime()%></td>  
      85.                         <td>  
      86.                             <a  
      87. "forumcontroller?type=look&power=user&userId=<%=request.getParameter("userId")%>&id=<%=forum.getId()%>">查看</a>    
      88.                         </td>  
      89.                     </tr>  
      90.                     <%  
      91.                         }  
      92.                     %>  
      93.                 </tbody>  
      94.             </table>  
      95. "foot">  
      96. "forumList.jsp?flag=<%=SplitPage.FIRSTPAGE%>&userId=<%=request.getParameter("userId")%>">首页</a>   
      97. "forumList.jsp?flag=<%=SplitPage.PREVIOUSPAGE%>&userId=<%=request.getParameter("userId")%>">上一页</a>   
      98. "forumList.jsp?flag=<%=SplitPage.NEXTPAGE%>&userId=<%=request.getParameter("userId")%>">下一页</a>   
      99. "forumList.jsp?flag=<%=SplitPage.LASTPAGE%>&userId=<%=request.getParameter("userId")%>">末页</a>   
      100. "selectPage" name="selectPage" οnchange="goPage();">  
      101.                     <%  
      102. for (int i = 1; i <= spage.getTotalPage(); ++i) {  
      103.                     %>  
      104. "<%=i%>"
      105. "selected='selected'"
      106. ""%> ><%=i%></option>  
      107.                         <%  
      108.                             }  
      109.                         %>  
      110.                       
      111.                 </select>  
      112.                 <label><%=spage.getCurrentPage()%>/<%=spage.getTotalPage()%>页  
      113.                 </label>  
      114.             </div>  
      115.         </div>  
      116.     </body>  
      117. </html>


       

       运行效果:

      java 分页查询 新插入 java分页sql语句_java

      有什么地方有不足之处,往各位同行多多指教哈!