分页查询

分页查询 

                                                                                                                                                转自博客

通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法。

通过ResultSet的光标实现分页

  通过ResultSet的光标实现分页,优点是在各种数据库上通用,缺点是占用大量资源,不适合数据量大的情况。

  2. 通过数据库机制进行分页

  很多数据库自身都提供了分页机制,如SQL Server中提供的top关键字,MySQL数据库中提供的limit关键字,它们都可以设置数据返回的记录数。

  通过各种数据库的分页机制实现分页查询,其优点是减少数据库资源的开销,提高程序的性能;缺点是只针对某一种数据库通用。

说明:由于通过ResultSet的光标实现数据分页存在性能方面的缺陷,所以,在实际开发中,很多情况下都是采用数据库提供的分页机制来实现分页查询功能。

例1.1 通过MySQL数据库提供的分页机制,实现商品信息的分页查询功能,将分页数据显示在JSP页面中。

(1)创建名称为Product的类,用于封装商品信息,该类是商品信息的JavaBean。关键代码如下:

> package com.cn.gao;

>

> public class Product {

>    public static final int PAGE_SIZE=2; //每页记录数

>    private int id;            //编号

>    private String name;      //名称

>    private double price;    //价格

>    private int num;        //数量

>    private String unit;  //单位

>    public int getId() {

>        return id;

>    }

>    public void setId(int id) {

>        this.id = id;

>    }

>    public String getName() {

>        return name;

>    }

>    public void setName(String name) {

>        this.name = name;

>    }

>    public double getPrice() {

>        return price;

>    }

>    public void setPrice(double price) {

>        this.price = price;

>    }

>    public int getNum() {

>        return num;

>    }

>    public void setNum(int num) {

>        this.num = num;

>    }

>    public String getUnit() {

>        return unit;

>    }

>    public void setUnit(String unit) {

>        this.unit = unit;

>    }

>

> }

技巧:在Java语言中,如果定义了静态的final类型变量,通常情况下将这个变量大写。该种编写方式是一种规范,能够很容易地与其它类型的变量进行区分。

(2) 创建名称为ProductDao的类,主要用于封装商品对象的数据库相关操作。在ProduceDao类中,首先编写getConnection()方法,用于创建数据库连接Connnection对象,其关键代码如下:

> /**

>      * 获取数据库连接

>      * @return Connection 对象

>      */

>    public Connection getConnection(){

>        Connection conn=null;

>        try {

>            Class.forName("com.mysql.jdbc.Driver");

>            String url = "jdbc:mysql://localhost:3306/test";

>            String user = "root";

>            String password = "1234";

>            conn=DriverManager.getConnection(url, user, password);

>        } catch (ClassNotFoundException e) {

>            // TODO Auto-generated catch block

>            e.printStackTrace();

>        } catch (SQLException e) {

>            // TODO Auto-generated catch block

>            e.printStackTrace();

>        }

>        return conn;

>    }

然后创建商品信息的分页查询方法find(),该方法包含一个page参数,用于传递要查询的页码。关键代码如下:

> /**

>      * 分页查询所有商品信息

>      * @param page 页数

>      * @return List<Product>

>      */

>    public List<Product> find(int page){

>        List<Product> list = new ArrayList<Product>();

>        Connection conn = getConnection();

>        String sql = "select* from tb_product order by id desc limit ?,?";

>        try {

>            PreparedStatement ps = conn.prepareStatement(sql);

>            ps.setInt(1, (page-1)*Product.PAGE_SIZE);

>            ps.setInt(2, Product.PAGE_SIZE);

>            ResultSet rs = ps.executeQuery();

>            while(rs.next()){

>                Product p=new Product();

>                p.setId(rs.getInt("id"));

>                p.setName(rs.getString("name"));

>                p.setNum(rs.getInt("num"));

>                p.setPrice(rs.getDouble("price"));

>                p.setUnit(rs.getString("unit"));

>                list.add(p);

>            }

>            ps.close();

>            conn.close();

>        } catch (SQLException e) {

>            // TODO Auto-generated catch block

>            e.printStackTrace();

>        }

>        return list;

>    }

find()方法用于实现分页查询功能,该方法根据入口参数page传递的页码,查询指定页码中的记录,主要通过limit关键字实现。

说明:MySQL数据库提供的limit关键字能够控制查询数据结果集起始位置及返回记录的数量,它的使用方式如下:

limit arg1,arg2

参数说明:

arg1:用于指定查询记录的起始位置。

arg2:用于指定查询数据所返回的记录数。

在分页查询过程中,还需要获取商品信息的总记录数,用于计算商品信息的总页数,该操作编写在findCount()方法中。关键代码如下:

> /**

>      * 查询总记录数

>      * @return 总记录数

>      */

>    public int findCount(){

>        int count=0;

>        Connection conn = getConnection();

>        String sql = "select count(*) from tb_product";

>        try {

>            Statement sta = conn.createStatement();

>            ResultSet rs = sta.executeQuery(sql);

>            if(rs.next()){

>                count = rs.getInt(1);  //对总记录数赋值

>            }

>            rs.close();

>            conn.close();

>        } catch (SQLException e) {

>            // TODO Auto-generated catch block

>            e.printStackTrace();

>        }

>        return count;        //返回总记录数

>    }

(3)创建名称为FindServlet1的类,该类是分页查询商品信息的Servlet对象。在FindServlet1类中重写doGet()方法,对分页请求进行处理,其关键代码如下:

> package com.cn.gao;

>

> import java.awt.print.Pageable; import java.io.IOException; import

> java.io.PrintWriter; import java.util.List;

>

> import javax.servlet.ServletException; import

> javax.servlet.http.HttpServlet; import

> javax.servlet.http.HttpServletRequest; import

> javax.servlet.http.HttpServletResponse;

>

> public class FindServlet1 extends HttpServlet {

>

>    public void doGet(HttpServletRequest request, HttpServletResponse response)

>            throws ServletException, IOException {

>        int currPage=1;

>        if(request.getParameter("page")!=null){

>            currPage=Integer.parseInt(request.getParameter("page"));

>        }

>        ProductDao dao = new ProductDao();

>        List<Product> list = dao.find(currPage);

>        request.setAttribute("list", list);

>        int pages;  //总页数

>        int count=dao.findCount(); //查询总记录数

>        if(count%Product.PAGE_SIZE==0){

>            pages=count/Product.PAGE_SIZE;

>        }else{

>            pages=count/Product.PAGE_SIZE+1;

>        }

>        StringBuffer sb = new StringBuffer();

>        //通过循环构建分页条

>        for(int i=1;i<=pages;i++){

>            if(i==currPage){  //判断是否为当前页

>                sb.append("『"+i+"』");  //构建分页条

>            }else{

>                sb.append("<a href='FindServlet1?page="+i+"'>"+i+"</a>"); //构建分页条

>            }

>            sb.append(" ");

>        }

>        request.setAttribute("bar", sb.toString());;

>        request.getRequestDispatcher("product_list.jsp").forward(request,

> response);

>    }

>

> }

技巧:分页条在JSP页面中是动态内容,每次查看新页面都要重新构造,所以,实例中将分页的构造放置到Servlet中,以简化JSP页面的代码。

在获取查询结果集List与分页条后,FindServlet1分别将这两个对象放置到request中,将请求转发到product_list.jsp页面做出显示。

(4)创建product_list.jsp页面,该页面通过获取查询结果集List与分页条来分页显示商品信息数据。关键代码如下:

> <%@ page language="java" contentType="text/html; charset=GB18030"

>    pageEncoding="GB18030"%> <%@ page import="java.util.*" %> <%@ page import="com.cn.gao.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01

> Transitional//EN"

>

> "http://www.w3.org/TR/html4/loose.dtd"> <html>

>

> <head>

>

> <meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert title here</title>

</head>

<body>

    <table align="center" width="450" border="1">

        <tr>

            <td align="center" colspan="5">

                <h2>所有商品信息</h2>

            </td>

        </tr>

        <tr align="center">

            <td><b>ID</b></td>

            <td><b>商品名称</b></td>

            <td><b>价格</b></td>

            <td><b>数量</b></td>

            <td><b>单位</b></td>

        </tr>

        <%

            List<Product> list=(List<Product>)request.getAttribute("list");

            for(Product p:list){

        %>

        <tr align="center">

            <td><%=p.getId() %></td>

            <td><%=p.getName() %></td>

            <td><%=p.getPrice() %></td>

            <td><%=p.getNum() %></td>

            <td><%=p.getUnit() %></td>

        </tr>

        <%

            }

          %>

          <tr>

              <td align="center" colspan="5">

                  <%=request.getAttribute("bar") %>

              </td>

          </tr>

    </table>

</body>

</html>

(5)编写程序中的主页面showproduct.jsp,在该页面中编写分页查询商品信息的超链接,指向FindServlet1。关键代码如下:

> <%@ page language="java" contentType="text/html; charset=GB18030"

>    pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;

> charset=GB18030"> <title>Insert title here</title> </head> <body>

>    <a href="FindServlet1">查看所有商品信息</a> </body> </html>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 在开发过程中,我们经常会从数据库中查询数据,然后在客户端显示出来。当数据少时,可以在一个页面显示。当我们查询几百条...
    S等价交换S阅读 2,178评论 0 0
  • (一) 封装一个bean方法 package com.seecen.ssm.pojo; import java.u...
    俊兮阅读 414评论 0 0
  • 一. Java基础部分.................................................
    wy_sure阅读 3,784评论 0 11
  • ###分页查询 * 限制返回具体某些数据的sql语句如下: > select * from stu limit P...
    果冻都烂了阅读 584评论 0 1
  • 首先要实现分页查询必须给定俩个参数page(当前页数)和pages(每页显示的数据量,即显示几条数据): 代码: ...
    廉少阅读 1,180评论 0 0