以下内容是根据网上内容以及传智播客教学整理而来,侵删。
百度知道网友@starstroll 的回答:
分页的实现可分为两大类:一、数据在Java代码中进行分页,然后取得当前页数据;二、在数据库中直接取得当前页数据。
通常面试官都希望听到后者,因为那才是高效的方法。你如果想让面试官觉得你的能力高的话你就先否定他的问题,你可以回答说:“Java中根本不需要做分页的实现代码只管拿数据库中的当前页数据即可,数据分页功能应该交由SQL处理,在分页实现中Java最多只实现总页数的计算,除此以外几乎不用管。”如果你这么答的话面试官通常会问你总页数的算法,至于这个你可以网上找个高效点的方法,我现在知道最高效的就是:(数据总行数+每页数据行数-1)/每页数据行数。
算法可能有更高效的,你可以到网上找找。记住只在面试中才能这么答,笔试的话老老实实写出实现方法。否定面试官的问题会让他觉得你更professional,但不要太嚣张不然适得其反的。
本文中的分页基于Mysql实现,使用limit关键字。Oracle中没有limit,使用的是三层嵌套。关键是理解分页的实现,原理都是一样的
不使用任何框架,采用JSP+servlet实现
先介绍一下Mysql中Limit关键字
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是 0(而不是 1):
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
换句话说,LIMIT n 等价于 LIMIT 0,n。
总结:查询语句应该为(最关键的优两个参数,每页记录数和当前页)
SELECT * FROM 表 LIMIT (当前页-1)*每页显示记录数,每页显示的记录数
原理分析图如下:(核心是分页的JavaBean设计)
实现流程
0. 环境准备
a)引入jar文件及引入配置文件
i. 数据库驱动包
ii. C3P0连接池jar文件 及 配置文件
iii. DbUtis组件: QueryRunner qr = new QueryRuner(dataSouce);
qr.update(sql);
b) 公用类: JdbcUtils.java
1. 先设计:PageBean.java
2. Dao接口设计/实现: 2个方法
3. Service/servlet
4. JSP
代码实现:
1.C3P0配置文件 c3p0-config.xml(放在src目录下)
jdbc:mysql://localhost:3306/jdbc_demo
com.mysql.jdbc.Driver
root
root
3
6
1000
jdbc:mysql://localhost:3306/jdbc_demo
com.mysql.jdbc.Driver
root
root
3