---恢复内容开始---

分页查询

分页查询是java web开发中经常使用到的技术。在数据库中数据量非常大的情况下,不适合将所有的数据全部显示到一个页面中,同时为了节约程序以及数据库的资源,就需要对数据进行分页查询操作。

通过JDBC实现分页的方法比较多,而且不同的数据库机制其分页的方式也不同,这里我们介绍典型的两个分页方法。

1.通过ResultSet的光标实现分页

该分页方法可以在各种数据库之间通用,但是带来的缺点是占用了大量的资源,不适合在数据库大的情况下使用。

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

很多数据库都会提供这种分页机制,例如SQLServer中就提供了top关键字,mysql数据库中提供了limit关键字,用这些关键字都可以设置数据返回的记录数。使用这种分页查询方式可以减少数据库的资源开销,提高程序效率,但是缺点是只适应于一种数据库。

注:因为第一种不适合在数据量大的情况下使用,所以在实际开发中也不使用该方式来查询数据,我们只对第二种方式做介绍

例:通过mysql的数据分页机制来实现商品信息的分页查询功能,并将信息显示在jsp页面中

(1)创建一个商品信息属性Product类,用来保存商品属性,此类为JavaBean

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_02

1 packagecom.bean;2
3 public classProduct {4 public static final int PAGE_SIZE = 2; //每一页显示几行数据5 //编号
6 private intid;7 //名称
8 privateString name;9 //价格
10 private doubleprice;11 //数量
12 private intnum;13 //单位
14 privateString unit;15 public intgetId() {16 returnid;17 }18 public void setId(intid) {19 this.id =id;20 }21 publicString getName() {22 returnname;23 }24 public voidsetName(String name) {25 this.name =name;26 }27 public doublegetPrice() {28 returnprice;29 }30 public void setPrice(doubleprice) {31 this.price =price;32 }33 public intgetNum() {34 returnnum;35 }36 public void setNum(intnum) {37 this.num =num;38 }39 publicString getUnit() {40 returnunit;41 }42 public voidsetUnit(String unit) {43 this.unit =unit;44 }45 }46

47 Product.java代码

Product.java代码

java中一般静态常量我们采用大写字母表示。这是一种java书写规范

(2)创建BookDao类,此类中主要实现了getConnection()方法连接到数据库的操作以及分页查询所有信息的方法find(int page)、查询记录总数的方法findCount()。代码如下:

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_03

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_04

1 packagecom.bean;2 importjava.sql.Connection;3 importjava.sql.DriverManager;4 importjava.sql.PreparedStatement;5 importjava.sql.ResultSet;6 importjava.sql.SQLException;7 importjava.sql.Statement;8 importjava.util.ArrayList;9 importjava.util.List;10 public classBookDao {11 publicConnection getConnection() {12 //数据库连接

13 Connection conn = null;14 try{15 //加载数据库驱动,注册到驱动管理器
16 Class.forName("com.mysql.jdbc.Driver");17 //数据库连接字符串
18 String url = "jdbc:mysql://localhost:3306/db_database10";19 //数据库用户名
20 String username = "root";21 //数据库密码
22 String password = "123456";23 //创建Connection连接
24 conn =DriverManager.getConnection(url,username,password);25
26 }catch(ClassNotFoundException e) {27 e.printStackTrace();28 }catch(SQLException e) {29 e.printStackTrace();30 }31 returnconn;32 }33
34 /**
35 * 分页查询所有信息36 *@parampage 页数37 *@returnList38 */
39 public List find(intpage){40
41 //创建List
42 List list = new ArrayList();43 //获取数据库连接
44 Connection conn =getConnection();45 //分页查询的SQL语句
46 String sql = "select * from tb_product order by id desc limit ?,?";47 try{48 //获取PreparedStatement
49 PreparedStatement ps =conn.prepareStatement(sql);50 //SQL语句中的第1个参数赋值
51 ps.setInt(1, (page - 1) *Product.PAGE_SIZE);52 //对SQL语句中的第2个参数赋值
53 ps.setInt(2, Product.PAGE_SIZE);54 //执行查询操作
55 ResultSet rs =ps.executeQuery();56 //光标向后移动,并判断是否有效
57 while(rs.next()) {58 //实例化Product
59 Product p = newProduct();60 //对id属性赋值
61 p.setId(rs.getInt("id"));62 //对name属性赋值
63 p.setName(rs.getString("name"));64 //对num属性赋值
65 p.setNum(rs.getInt("num"));66 //对price属性赋值
67 p.setPrice(rs.getDouble("price"));68 //对unit属性赋值
69 p.setUnit(rs.getString("unit"));70 //将Product添加到List结合中
71 list.add(p);72 }73 //关闭ResultSet
74 rs.close();75 //关闭PreparedStatement
76 ps.close();77 //关闭Connection
78 conn.close();79 }catch(SQLException e) {80 e.printStackTrace();81 }82 returnlist;83
84 }85 /**
86 * 查询记录总数87 *@returncount记录数88 */
89 public intfindCount() {90 //总记录数
91 int count = 0;92 //获取数据库连接
93 Connection conn =getConnection();94 //查询总记录数SQL语句
95 String sql = "select count(*) from tb_product";96 try{97 //创建Statement
98 Statement stmt =conn.createStatement();99 //查询并获取ResultSet
100 ResultSet rs =stmt.executeQuery(sql);101 //光标向后移动,并判断是否有效
102 if(rs.next()) {103 //取出id字段的值对总记录赋值
104 count = rs.getInt(1);105 }106 //关闭ResultSet
107 rs.close();108 //关闭Connection
109 conn.close();110 }catch(SQLException e) {111 e.printStackTrace();112 }113 //返回总记录
114 returncount;115 }116
117 }

BookDao.java代码

说明:MySQL中分页查询机制关键词limit的说明,具体语法为:select * from 表名 order by id "升序(asc)或降序(desc)" limit arg1,arg2;

在SQLServes数据库中可以使用top关键字来查询:select top pageSize from "表名" where id not in (select top arg id from "表名");该条语句表示含义:从表中取出前arg条数据,再从表中取出不包含前arg条数据的pageSize条数据。例如:一页显示3条数据,那么第一页就是从表中取出前0条数据,再从表中取出不包含前0条数据的另外三条数据;第二页的数据就是从表中取出前3条数据,再从表中取出不包含取出的前3条数据的另外3条数据。"pageSize表示一页显示的条数",“arg表示从表中取出前几条数据”

limit arg1,arg2

参数说明:

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

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

(3)创建一个Servlet ,类名为FindServlet类此类继承了HttpServlet,主要实现了doGet()方法,接收和处理jsp页面中提交来的表单数据,代码如下:

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_05

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_06

1 packagecom.servlet;2 importjava.io.IOException;3 importjava.util.List;4 importjavax.servlet.ServletException;5 importjavax.servlet.http.HttpServlet;6 importjavax.servlet.http.HttpServletRequest;7 importjavax.servlet.http.HttpServletResponse;8 importcom.bean.BookDao;9 importcom.bean.Product;10
11 public class FindServlet extendsHttpServlet {12 private static final long serialVersionUID = 1L;13
14 protected void doGet(HttpServletRequest request,HttpServletResponse response) throwsServletException,IOException{15 //当前页码
16 int currPage = 1;17 //判断传递页码是否有效
18 if(request.getParameter("page") != null) {19 //对当前页码赋值
20 currPage = Integer.parseInt(request.getParameter("page"));21 }22 //实例化ProductDao
23 BookDao dao = newBookDao();24 //查询所有商品信息
25 List list =dao.find(currPage);26 //将list放置到request中
27 request.setAttribute("list", list);28 //总页数
29 intpages;30 //查询总记录数
31 int count =dao.findCount();32 //计算总页数
33 if(count % Product.PAGE_SIZE == 0) {34 //对总页数赋值
35 pages = count /Product.PAGE_SIZE;36 }else{37 //对总页数赋值
38 pages = count / Product.PAGE_SIZE + 1;39 }40 //实例化StringBuffer
41 StringBuffer sb = newStringBuffer();42 //通过循环构建分页条
43 for(int i=1;i<=pages;i++) {44 //判断是否为当前页
45 if(i ==currPage) {46 //构建分页条
47 sb.append("[" + i + "]");48 }else{49 //构建分页条
50 sb.append("" + i + "");51 }52 sb.append(" ");53 }54 //将分页条的字符串放置到request中
55 request.setAttribute("bar", sb.toString());56 //转发到product_list.jsp页面
57 request.getRequestDispatcher("product_list.jsp").forward(request, response);58 }59 }

FindServlet.java代码

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

request.getParameter("page")中的“page”是打开jsp页面时所带的参数,例如:“http://localhost:8080/test.jsp?page=2”此时page的参数就是2。此外“page”也是Http规范中定义好的,无需要再定义,直接通过request.getParameter("page")获取即可。

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

(4)创建product_list.jsp页面,通过查询List结果集对象来将结果显示在页面

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_07

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_08

1

2 pageEncoding="UTF-8"%>

所有商品信息


所有商品信息


商品名称


21


价格



数量

单位


24

25

26 Listlist=(List)request.getAttribute("list");27 for(Product p:list){28 %>

29

30

31

32

33

34

35

36

37 }38 %>

39

40

41

42

43

44

45

46

47

product_list.jsp代码

(5)创建index.jsp页面,在该页面中创建了一个指向FindServlet类的超链接,用来查询商品信息

Java中jpa分页查询实现 java数据量大的分页查询_java_09

Java中jpa分页查询实现 java数据量大的分页查询_数据库_10

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

分页数据查询


8

9

10 查看所有商品信息

11

12

index.jsp代码

(6)web.xml中的Servlet配置信息如下:

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_11

Java中jpa分页查询实现 java数据量大的分页查询_分页_12

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 Test2

4

5 index.html

6 index.htm

7 index.jsp

8 default.html

9 default.htm

10 default.jsp

11

12

13 FindServlet

14 com.servlet.FindServlet

15

16

17 FindServlet

18 /FindServlet

19

20

web.xml代码

配置完成后运行项目结果:

Java中jpa分页查询实现 java数据量大的分页查询_java_13

Java中jpa分页查询实现 java数据量大的分页查询_数据库_14

---恢复内容结束---

分页查询

分页查询是java web开发中经常使用到的技术。在数据库中数据量非常大的情况下,不适合将所有的数据全部显示到一个页面中,同时为了节约程序以及数据库的资源,就需要对数据进行分页查询操作。

通过JDBC实现分页的方法比较多,而且不同的数据库机制其分页的方式也不同,这里我们介绍典型的两个分页方法。

1.通过ResultSet的光标实现分页

该分页方法可以在各种数据库之间通用,但是带来的缺点是占用了大量的资源,不适合在数据库大的情况下使用。

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

很多数据库都会提供这种分页机制,例如SQLServer中就提供了top关键字,mysql数据库中提供了limit关键字,用这些关键字都可以设置数据返回的记录数。使用这种分页查询方式可以减少数据库的资源开销,提高程序效率,但是缺点是只适应于一种数据库。

注:因为第一种不适合在数据量大的情况下使用,所以在实际开发中也不使用该方式来查询数据,我们只对第二种方式做介绍

例:通过mysql的数据分页机制来实现商品信息的分页查询功能,并将信息显示在jsp页面中

(1)创建一个商品信息属性Product类,用来保存商品属性,此类为JavaBean

Java中jpa分页查询实现 java数据量大的分页查询_数据库_15

Java中jpa分页查询实现 java数据量大的分页查询_java_16

1 packagecom.bean;2

3 public classProduct {4 public static final int PAGE_SIZE = 2; //每一页显示几行数据5 //编号

6 private intid;7 //名称

8 privateString name;9 //价格

10 private doubleprice;11 //数量

12 private intnum;13 //单位

14 privateString unit;15 public intgetId() {16 returnid;17 }18 public void setId(intid) {19 this.id =id;20 }21 publicString getName() {22 returnname;23 }24 public voidsetName(String name) {25 this.name =name;26 }27 public doublegetPrice() {28 returnprice;29 }30 public void setPrice(doubleprice) {31 this.price =price;32 }33 public intgetNum() {34 returnnum;35 }36 public void setNum(intnum) {37 this.num =num;38 }39 publicString getUnit() {40 returnunit;41 }42 public voidsetUnit(String unit) {43 this.unit =unit;44 }45 }46

47 Product.java代码

Product.java代码

java中一般静态常量我们采用大写字母表示。这是一种java书写规范

(2)创建BookDao类,此类中主要实现了getConnection()方法连接到数据库的操作以及分页查询所有信息的方法find(int page)、查询记录总数的方法findCount()。代码如下:

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_17

Java中jpa分页查询实现 java数据量大的分页查询_分页_18

1 packagecom.bean;2 importjava.sql.Connection;3 importjava.sql.DriverManager;4 importjava.sql.PreparedStatement;5 importjava.sql.ResultSet;6 importjava.sql.SQLException;7 importjava.sql.Statement;8 importjava.util.ArrayList;9 importjava.util.List;10 public classBookDao {11 publicConnection getConnection() {12 //数据库连接
13 Connection conn = null;14 try{15 //加载数据库驱动,注册到驱动管理器
16 Class.forName("com.mysql.jdbc.Driver");17 //数据库连接字符串
18 String url = "jdbc:mysql://localhost:3306/db_database10";19 //数据库用户名
20 String username = "root";21 //数据库密码
22 String password = "123456";23 //创建Connection连接
24 conn =DriverManager.getConnection(url,username,password);25
26 }catch(ClassNotFoundException e) {27 e.printStackTrace();28 }catch(SQLException e) {29 e.printStackTrace();30 }31 returnconn;32 }33
34 /**
35 * 分页查询所有信息36 *@parampage 页数37 *@returnList38 */
39 public List find(intpage){40
41 //创建List
42 List list = new ArrayList();43 //获取数据库连接
44 Connection conn =getConnection();45 //分页查询的SQL语句
46 String sql = "select * from tb_product order by id desc limit ?,?";47 try{48 //获取PreparedStatement
49 PreparedStatement ps =conn.prepareStatement(sql);50 //SQL语句中的第1个参数赋值
51 ps.setInt(1, (page - 1) *Product.PAGE_SIZE);52 //对SQL语句中的第2个参数赋值
53 ps.setInt(2, Product.PAGE_SIZE);54 //执行查询操作
55 ResultSet rs =ps.executeQuery();56 //光标向后移动,并判断是否有效
57 while(rs.next()) {58 //实例化Product
59 Product p = newProduct();60 //对id属性赋值
61 p.setId(rs.getInt("id"));62 //对name属性赋值
63 p.setName(rs.getString("name"));64 //对num属性赋值
65 p.setNum(rs.getInt("num"));66 //对price属性赋值
67 p.setPrice(rs.getDouble("price"));68 //对unit属性赋值
69 p.setUnit(rs.getString("unit"));70 //将Product添加到List结合中
71 list.add(p);72 }73 //关闭ResultSet
74 rs.close();75 //关闭PreparedStatement
76 ps.close();77 //关闭Connection
78 conn.close();79 }catch(SQLException e) {80 e.printStackTrace();81 }82 returnlist;83
84 }85 /**
86 * 查询记录总数87 *@returncount记录数88 */
89 public intfindCount() {90 //总记录数
91 int count = 0;92 //获取数据库连接
93 Connection conn =getConnection();94 //查询总记录数SQL语句
95 String sql = "select count(*) from tb_product";96 try{97 //创建Statement
98 Statement stmt =conn.createStatement();99 //查询并获取ResultSet
100 ResultSet rs =stmt.executeQuery(sql);101 //光标向后移动,并判断是否有效
102 if(rs.next()) {103 //取出id字段的值对总记录赋值
104 count = rs.getInt(1);105 }106 //关闭ResultSet
107 rs.close();108 //关闭Connection
109 conn.close();110 }catch(SQLException e) {111 e.printStackTrace();112 }113 //返回总记录
114 returncount;115 }116
117 }

BookDao.java代码

说明:MySQL中分页查询机制关键词limit的说明

limit arg1,arg2

参数说明:

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

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

(3)创建一个Servlet ,类名为FindServlet类此类继承了HttpServlet,主要实现了doGet()方法,接收和处理jsp页面中提交来的表单数据,代码如下:

Java中jpa分页查询实现 java数据量大的分页查询_分页_19

Java中jpa分页查询实现 java数据量大的分页查询_java_20

1 packagecom.servlet;2 importjava.io.IOException;3 importjava.util.List;4 importjavax.servlet.ServletException;5 importjavax.servlet.http.HttpServlet;6 importjavax.servlet.http.HttpServletRequest;7 importjavax.servlet.http.HttpServletResponse;8 importcom.bean.BookDao;9 importcom.bean.Product;10
11 public class FindServlet extendsHttpServlet {12 private static final long serialVersionUID = 1L;13
14 protected void doGet(HttpServletRequest request,HttpServletResponse response) throwsServletException,IOException{15 //当前页码
16 int currPage = 1;17 //判断传递页码是否有效
18 if(request.getParameter("page") != null) {19 //对当前页码赋值
20 currPage = Integer.parseInt(request.getParameter("page"));21 }22 //实例化ProductDao
23 BookDao dao = newBookDao();24 //查询所有商品信息
25 List list =dao.find(currPage);26 //将list放置到request中
27 request.setAttribute("list", list);28 //总页数
29 intpages;30 //查询总记录数
31 int count =dao.findCount();32 //计算总页数
33 if(count % Product.PAGE_SIZE == 0) {34 //对总页数赋值
35 pages = count /Product.PAGE_SIZE;36 }else{37 //对总页数赋值
38 pages = count / Product.PAGE_SIZE + 1;39 }40 //实例化StringBuffer
41 StringBuffer sb = newStringBuffer();42 //通过循环构建分页条
43 for(int i=1;i<=pages;i++) {44 //判断是否为当前页
45 if(i ==currPage) {46 //构建分页条
47 sb.append("[" + i + "]");48 }else{49 //构建分页条
50 sb.append("" + i + "");51 }52 sb.append(" ");53 }54 //将分页条的字符串放置到request中
55 request.setAttribute("bar", sb.toString());56 //转发到product_list.jsp页面
57 request.getRequestDispatcher("product_list.jsp").forward(request, response);58 }59 }

FindServlet.java代码

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

request.getParameter("page")中的“page”是打开jsp页面时所带的参数,例如:“http://localhost:8080/test.jsp?page=2”此时page的参数就是2。此外“page”也是Http规范中定义好的,无需要再定义,直接通过request.getParameter("page")获取即可。

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

(4)创建product_list.jsp页面,通过查询List结果集对象来将结果显示在页面

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_21

Java中jpa分页查询实现 java数据量大的分页查询_java_22

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

9

所有商品信息


10

11

12

13

14

15

所有商品信息

16

17

18

19


ID


20


商品名称


21


价格


22


数量


23


单位


24

25

26 Listlist=(List)request.getAttribute("list");27 for(Product p:list){28 %>

29

30

31

32

33

34

35

36

37 }38 %>

39

40

41

42

43

44

45

46

47

product_list.jsp代码

(5)创建index.jsp页面,在该页面中创建了一个指向FindServlet类的超链接,用来查询商品信息

Java中jpa分页查询实现 java数据量大的分页查询_数据库_23

Java中jpa分页查询实现 java数据量大的分页查询_数据库_24

2 pageEncoding="UTF-8"%>

分页数据查询


10 查看所有商品信息

index.jsp代码

(6)web.xml中的Servlet配置信息如下:

Java中jpa分页查询实现 java数据量大的分页查询_java jdbc 分页_25

Java中jpa分页查询实现 java数据量大的分页查询_数据库_26

1 <?xml version="1.0" encoding="UTF-8"?>
 
3 Test2
 
5 index.html
6 index.htm
7 index.jsp
8 default.html
9 default.htm
10 default.jsp
11 
12 
13 FindServlet
14 com.servlet.FindServlet
15 
16 
17 FindServlet
18 /FindServlet
19 
20

web.xml代码

配置完成后运行项目结果:

Java中jpa分页查询实现 java数据量大的分页查询_Java中jpa分页查询实现_27

Java中jpa分页查询实现 java数据量大的分页查询_数据库_28