|
以前一都是在用mysql数据库,在mysql里可以用select * from table LIMIT 5,10 实现从数据中间位置取固定长短的数据,当是到了公司里,公司是用是sqlserver 搞了半天发现sqlserver里不支持limit函数,无奈到网上找了找资料 发现了这么一个sql语句 SELECT TOP 页大小 *
FROM Table1
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
试了一下很是不错,而且还可以解决大量的数据分页,但是用这个的话你必须在建立表的时候有个“id”字段,并且它为你表的主键。在这里我把它编写成了组件,下面给大家看我的具体实现。 /* * Pagination.java * * Created on 2007年11月1日, 下午1:13 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */
package cn.CCmingzhou.jsp;
import java.sql.SQLException; import javax.servlet.*; import javax.servlet.http.*; import java.sql.ResultSet; import cn.CCmingzhou.db.MsManager;
/** *冷漠大神 qq 361619004 * @author Angel */ public class Pagination extends HttpServlet{ /** Creates a new instance of Pagination */ public Pagination() { } private int pageSize=0; private String table=""; private void setTable(String s) { this.table=s; } private String getTable() { return table; } /** *首页 *参数说明 request 传入jsp内置的request对象 current 当前页 例:比如你现在在index.jsp页 那你就 XX.top(request,"index.jsp"),当然你也可以懒的写法XX.top(request,"")这么写也可以实现相同的功能 */ public String top(HttpServletRequest request,String current) { request.setAttribute("info","0"); return "<a href="+current+"?page="+(String)request.getAttribute("info")+">首页</a> "; } /** *上一页 * 参数说明 request 传入jsp内置的request对象 current 当前页 例:比如你现在在index.jsp页 那你就 XX.shang(request,"index.jsp"),当然你也可以懒的写法XX.shang(request,"")这么写也可以实现相同的功能 *yema 这个参数就是你当前的页码 你可以在你的my.jsp 这么调用 String pages=request.getParameter("page") 再把pages传到yema 里就一切 OK 了 */ public String shang(HttpServletRequest request,String current,String yema) { int i=Integer.parseInt(yema); if(i>0) i--; String s=""+i; request.setAttribute("info",s); return "<a href="+current+"?page="+(String)request.getAttribute("info")+">上一页</a> "; } /** *下一页 * 参数说明 request 传入jsp内置的request对象 current 当前页 例:比如你现在在index.jsp页 那你就 XX.xia(request,"index.jsp"),当然你也可以懒的写法XX.xia(request,"")这么写也可以实现相同的功能 *yema 这个参数就是你当前的页码 你可以在你的my.jsp 这么调用 String pages=request.getParameter("page") 再把pages传到yema 里就一切 OK 了 */ public String xia(HttpServletRequest request,String current,String yema ) { String wei=null; MsManager ms=new MsManager(); ResultSet rs=ms.query("select count(*) as a from "+this.getTable()); try { if(rs.next()) { wei=rs.getString("a"); } } catch (SQLException ex) { ex.printStackTrace(); } int ii=0; if(wei!=null) { ii=Integer.parseInt(wei); ii=ii/this.getPageSize(); } int i=Integer.parseInt(yema); if(i<ii) i++; String s=""+i; request.setAttribute("info",s); ms.close(); return "<a href="+current+"?page="+(String)request.getAttribute("info")+">下一页</a> "; } /** *尾页 *参数说明 request 传入jsp内置的request对象 current 当前页 例:比如你现在在index.jsp页 那你就 XX.bottom(request,"index.jsp"),当然你也可以懒的写法XX.bottom(request,"")这么写也可以实现相同的功能 */ public String bottom(HttpServletRequest request,String current) { String wei=null; MsManager ms=new MsManager(); ResultSet rs=ms.query("select count(*) as a from "+this.getTable()); try { if(rs.next()) { wei=rs.getString("a"); } } catch (SQLException ex) { ex.printStackTrace(); } int ii=0; if(wei!=null) { ii=Integer.parseInt(wei); ii=ii/this.getPageSize(); } wei=""+ii; request.setAttribute("info",wei); ms.close(); return "<a href="+current+"?page="+(String)request.getAttribute("info")+">尾页</a> "; }
private void setPageSize(int pageSize) { this.pageSize = pageSize; } private int getPageSize() { return this.pageSize; } /** *返回sql语句 *参数说明 pageSize 这个参数是指你每页想显示几条数据 比如说 把10 传进去就会返回10条记录的结果集 tableName 这个没有说明好说的啦 就是把你想要操作的表 的名字传进来就行了 *yema 这个参数就是你当前的页码 你可以在你的my.jsp 这么调用 String pages=request.getParameter("page") 再把pages传到yema 里就一切 OK 了 */ public String getSqlASC(int pageSize,String tableName,String yema) { this.setTable(tableName); this.setPageSize(pageSize); int i=0; int temp=0; if(yema!=null&&!yema.equals("")) { i=Integer.parseInt(yema); temp=pageSize*i; } return "select top "+pageSize+" * from "+tableName+" where (id not in (select top "+temp+" id from "+tableName+" order by id)) order by id "; } /** *返回sql语句 按照你的主键id值倒序 输出 *参数说明 pageSize 这个参数是指你每页想显示几条数据 比如说 把10 传进去就会返回10条记录的结果集 tableName 这个没有说明好说的啦 就是把你想要操作的表 的名字传进来就行了 *yema 这个参数就是你当前的页码 你可以在你的my.jsp 这么调用 String pages=request.getParameter("page") 再把pages传到yema 里就一切 OK 了 */ public String getSqlDESC(int pageSize,String tableName,String yema) { this.setPageSize(pageSize); this.setTable(tableName); int i=0; int temp=0; if(yema!=null&&!yema.equals("")) { i=Integer.parseInt(yema); temp=pageSize*i; } return "select top "+pageSize+" * from "+tableName+" where (id not in (select top "+temp+" id from "+tableName+" order by id desc)) order by id desc"; } }
这里我简单的对这个类做一下解说 import java.sql.SQLException; import javax.servlet.*; import javax.servlet.http.*; import java.sql.ResultSet; import cn.CCmingzhou.db.MsManager;
这里必须要引入servlet的jar包 否则你在编译的时候会出错 至于cn.CCmingzhou.db.MsManager; 这个类的引用是对数据库的操作的,这个类里我对数据库简单的做了一下封装,包扩对数据库的 增删该查。 其他的方法我都有写注释,而且很很详细了,你可以把它打成jar包,下面说下怎么去用它,你直接把这个类引用到你的jsp页里,给大家个例子 <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ page import="java.sql.ResultSet" %> <jsp: useBean id="db" scope="page" class="cn.CCmingzhou.db.MsManager"> </jsp:useBean> <jsp:useBean id="jsp" scope="page" class="cn.CCmingzhou.jsp.Pagination"> </jsp:useBean>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<% String s=request.getParameter("page"); if(s==null) s="0"; //首先必须得用request.getParameter("page");获取到当前的页码 //可能有人会问了 page是怎么出来的啊?其实要是细心看那个类的朋友就 //就不会有这么的疑问了,没错我们的分页组件的动态生成的 ResultSet rs=db.query(jsp.getSqlASC(10,"love",s)); //db. Query()这个方法是我封装好的,如果你没有的话 那么你就写一个方法 //传进去一个查询的sql语句返回一个ResultSet 很简单 这里不提了 // jsp.getSqlASC(10,"love",s) 这个才是终点和大家说的 这里面的10 代表是你 //想一页显示几条数据 “love”这则是你的biao的名字 比如说你在数据库的 test表 //test s则是当前的页码 因为我们的分页是自动生成的嘛 :) while(rs.next()) { out.println(rs.getString("id")); out.println(rs.getString("name")); out.println(rs.getString("password")+"<br>"); } out.println(jsp.top(request,"")+jsp.shang(request,"",s)+jsp.xia(request,"",s)+jsp.bottom(request,"")); //这里给给大家解说一下 jsp.top(request,"") 这个方法,这个方法会返回一个String类型 //的字符串 <a href=?page=0>首页</>在浏览器里就会 首页 这么一个超连接 传参的说明 //我在类里都有明确的注释 后头看看吧 db.close(); %> 想看结果的话,自己运行一下试试吧,我相信当你看到结构的话你一定会爱上它的
|