本文转自http://www.cnblogs.com/gaopeng527/p/4448105.html 感谢作者

分页查询

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

  1. 通过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 blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.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>

编写完成该页面后,部署运行项目,此时打开showproduct.jsp页面,其效果如下图所示:

JDBC在Java Web中的应用——分页查询相关推荐

  1. Java web访问MySql数据库分页查询

    有时候我们查询数据库表时,但是很多时候表中的记录很多,需要显示出来的话怎么办?这时可以使用分页的方法,就是指定从数据库表的什么位置开始查询显示,以及指定显示的记录数目. Mysql数据库提供了limi ...

  2. Java Web中的中文编码问题分析

    一.为什么需要编码 在计算机中存储信息的最小单位是1个字节,即8bit,所以能标识的最大字符范围是0~255,而人类自然语言中例如汉语.日语要表示的符号太多,无法单纯用一个字节来完全表示,为了解决这个 ...

  3. 第三章 深入分析Java Web中的中文编码问题

    3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...

  4. 深入分析 Java Web 中的中文编码问题

    深入分析 Java Web 中的中文编码问题 背景: 编码问题一直困扰着程序开发人员,尤其是在 Java 中更加明显,因为 Java 是跨平台的语言,在不同平台的编码之间的切换较多.接下来将介绍 Ja ...

  5. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...

  6. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  7. 在WEB中实现打印分页

    在WEB中实现打印分页 page-break-after版本:CSS2 兼容性:IE4+ 继承性:无    语法: page-break-after : auto ¦ always ¦ avoid ¦ ...

  8. 用servlet路径访问一个html,java web中servlet、jsp、html 互相访问的路径问题

    在html">java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. html">java web中的路径使用按我的分法可以分两种情况,当 ...

  9. java web 中 读取windows图标并显示

    java web中读取windows对应文件名的 系统图标 ....显示 1.获取系统图标工具类 package utils;  import java.awt.Graphics;  import j ...

  10. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

最新文章

  1. DeepMind“钓鱼执法”:让AI引诱AI说错话,发现数以万计危险言论
  2. 【摩天好课】数字时代职业生涯规划
  3. java中布尔值做比较_Java中的三态布尔值
  4. NVIDIA专家全面解析Merlin,GPU加速的推荐系统解决方案速速查收
  5. html缎带按钮,6款丝带蝴蝶结系法图解_乌托家家居网
  6. curviloft插件怎么用_Curviloft插件|SketchUp草图大师曲线放样插件(Curviloft)下载 v1.7d 免费版 - 比克尔下载...
  7. 前端响应式布局与Bootstrap栅格系统快速了解与应用
  8. rtmp/rtsp直播播放器选择
  9. java生成xps文件_Java 将 Excel 转为PDF、图片、html、XPS、XML、CSV
  10. 邮箱格式怎么写?电子邮箱格式怎么写?邮件地址怎么写?
  11. mysql快照数据_制作mysql数据快照
  12. java题兔子第三个月生_JAVA编程之古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子...
  13. 微商怎么找客源,新手做微商如何找客源的
  14. 初识C语言----完结篇
  15. 天蓝色在ps中的色值_天蓝色的cosmosdb文档中的字段级加密
  16. FinClip小程序开放平台灰度发布上线,实现你对“千人千面”的所有创想
  17. 少儿编程会培养什么能力
  18. 模拟人类大脑每秒计算数量级及参数容量的估计
  19. 阿里云人工智能课程(一)机器学习介绍
  20. cd src make install make[1]: Entering directory `/home/xuweiliang/redis/r 错误解析

热门文章

  1. 楼市新政催生“金十月” 二手房改善需求变成交主力
  2. 在RedHat/CentOS下安装Docker(不升级内核)
  3. jQuery mobile 开发问题记录
  4. windows 域名+虚拟目录 (php)
  5. 在ASP.NET中运用JavaScript重定向页面
  6. 客户关系管理式的电子商务
  7. 树型DataGrid的思路
  8. UnderWater+SDN论文之六
  9. python引入pytesseract报错:ValueError: Attempted relative import in non-package
  10. 整理数组去重与数组排序等方法