【转】数据库分页Java实现

MySQL分页

主要是MySQL数据库内置LIMIT函数

注意添加mysql的JAR包mysql-connector-java-5.1.13-bin.jar

select * from table LIMIT 5,10;  // 检索记录行 6-15

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

select * from content order by id desc limit 10000, 10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。

此时,我们可以通过2种方式:

一,子查询的分页方式来提高分页效率

select * from 'content' where id <= (select id from 'content' order by id desc LIMIT ".($page-1)*$pagesize.", 1) order by id desc LIMIT $pagesize;

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。

经过飘易的实测,使用子查询的分页方式的效率比纯LIMIT提高了14-20倍!

二,JOIN分页方式

select * from 'content' as t1 join (select id from 'content' order by id desc LIMIT ".($page-1)*$pagesize.", 1) as t2 where t1.id <= t2.id order by t1.id desc LIMIT $pagesize; 

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。

MySQL分页Java实现

<%@ page language="java" import="java.util.*,java.sql.*"
pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MySQL分页</title>
</head>
<body>
<table>
<tr>
<td>用户名</td>
<td>所在城市</td>
<td>职业</td>
</tr>
<%
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//得到连接
Connection ct = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tour", "root", "root");
Statement sm = ct.createStatement(); //接收pageNow参数
String s_pageNow = request.getParameter("pageNow");
int pageNow = 1;
if (s_pageNow != null) {
pageNow = Integer.parseInt(s_pageNow);
} //查询总页数
int pageCount = 0;//当前为第几页
int pageSize = 3;//每页显示几条记录
int rowCount = 0;//总共有多少条记录 ResultSet rs = sm.executeQuery("select count(*) from users");
if (rs.next()) {
rowCount = rs.getInt(1);
if (rowCount % pageSize == 0) {
pageCount = rowCount / pageSize;
} else {
pageCount = rowCount / pageSize + 1;
}
}
rs = sm.executeQuery("select * from users limit "+ ((pageNow - 1) * pageSize + 1) +","+pageNow* pageSize+"");
while (rs.next()) {
out.println("<tr>");
out.println("<td>" + rs.getString(2) + "</td>");
out.println("<td>" + rs.getString(5) + "</td>");
out.println("<td>" + rs.getString(6) + "</td>");
out.println("</tr>");
}
out.println("<tr>");
//打印总页数
for (int i = 1; i < pageCount; i++) {
out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i
+ "页" + "</a>");
}
out.println("</tr>"); rs.close();
sm.close();
ct.close();
%> </table>
</body>
</html>

Oracle分页

主要是3层的嵌套查询

注意添加Oracle的JAR 包classes12.jar

经典的SQL语句(用ROWNUM实现)

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal) a1 where rownum<=10) where rn >=6;

Oracle分页java实现 

<%@ page language="java" import="java.util.*,java.sql.*"
pageEncoding="gbk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Oracle分页</title>
</head> <body>
<table>
<tr>
<td>用户名</td>
<td>职业</td>
<td>薪水</td>
</tr>
<%
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到连接
Connection ct = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "SCOTT", "scott");
Statement sm = ct.createStatement(); //接收pageNow参数
String s_pageNow = request.getParameter("pageNow");
int pageNow = 1;
if (s_pageNow != null) {
pageNow = Integer.parseInt(s_pageNow);
} //查询总页数
int pageCount = 0;//当前为第几页
int pageSize = 3;//每页显示几条记录
int rowCount = 0;//总共有多少条记录 ResultSet rs = sm.executeQuery("select count(*) from emp");
if (rs.next()) {
rowCount = rs.getInt(1);
if (rowCount % pageSize == 0) {
pageCount = rowCount / pageSize;
} else {
pageCount = rowCount / pageSize + 1;
}
}
rs = sm.executeQuery("select * from (select a1.*,rownum rn from (select * from emp ) a1 where rownum<="
+ pageNow
* pageSize
+ ") where rn >="
+ ((pageNow - 1) * pageSize + 1) + "");
while (rs.next()) {
out.println("<tr>");
out.println("<td>" + rs.getString(2) + "</td>");
out.println("<td>" + rs.getString(3) + "</td>");
out.println("<td>" + rs.getString(6) + "</td>");
out.println("</tr>");
}
out.println("<tr>");
//打印总页数
for (int i = 1; i < pageCount; i++) {
out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i
+ "页" + "</a>");
}
out.println("</tr>"); rs.close();
sm.close();
ct.close();
%> </table>
</body>
</html>

【转】数据库分页Java实现的更多相关文章

  1. java 分页对象以及数据库分页查询

    import java.util.List; public class Pager<T> { private Integer pageSize; private Integer total ...

  2. Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值

    1 Statement和PreparedStatement的特点   a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录   b)对于创建和 ...

  3. JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...

  4. 分页技术框架(Pager-taglib)学习二(SSH数据库分页)

    一.Pager-taglib数据库分页前提    Pager-taglib分页标签也可以实现数据库分页,与页面分页不同的是需要给后台传两个参数,一个是pageNo(当前页数)或pageOffset(偏 ...

  5. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

  6. 浅谈SQL Server数据库分页

    数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...

  7. 各种数据库分页sql

    1.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>= ...

  8. Oracle数据库和DB2数据库分页SQL的区别举例

    --------------------------ORACLE数据库分页SQL举例------------------------------------------------ SELECT * ...

  9. MySQL、SqlServer、Oracle三大主流数据库分页查询

    在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法.可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用 ...

随机推荐

  1. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  2. Unity问答——NGUI怎么使用按键模拟鼠标点击?

    这篇博客源自我在泰课在线的回答.链接:http://www.taikr.com/group/1/thread/248 问:NGUI怎么模拟用代码模拟控制点击 答: 1. 这个问题问得好.因为在使用按键 ...

  3. 设计模式——如何避免在OO设计中违反依赖倒置原则

    1 变量不可以包含具体类的引用.一旦new,就对具体类产生依赖,用工厂模式来避开. 2 类不要派生至具体类.用派生抽象类避开. 3 不要覆盖基类已经实现的方法.基类中已实现的方法应该由所有子类共享.

  4. [BZOJ 3209] 花神的数论题 【数位统计】

    题目链接: BZOJ - 3209 题目大意 设 f(x) 为 x 的二进制表示中 1 的个数.给定 n ,求 ∏ f(i)     (1 <= i <= n) . 题目分析 总体思路是枚 ...

  5. 利用CSP探测网站登陆状态

    0x00 背景 今天看到zone里有同学发帖说了探测支付宝登录状态的帖子:http://zone.wooyun.org/content/17665 由此我想到了我们parsec的@/fd 半年前提到的 ...

  6. hdu 5150 Sit sit sit

    http://acm.hdu.edu.cn/showproblem.php?pid=5151 直接判断是不是素数,然后再注意1就行. #include <cstdio> #include ...

  7. 两款商业拓扑发现软件siteview和ElementSentry的比较

    今天在公司试用了一下两款商业拓扑发现软件游龙科技的siteview和速方软件ElementSentry. 条目/产品 速方软件ElementSentryv5.0 游龙科技Siteview NNM v3 ...

  8. zabbix 四张大表分区

    trends_uint.ibd history history_unit trends CREATE TABLE `trends` ( `itemid` bigint(20) unsigned NOT ...

  9. UDP 收/发 广播包

    网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初 ...

  10. SQL 第二章 作业

    /*第二章 作业*/ create table S ( sno char(2) NOT NULL UNIQUE, sname char(3), city char(2) ); alter table ...