java分页

java分页,第1张

分页想清楚了就没什么难的了。一般有两种(我就知道两种):

1数据分页

/

@param pageItems:一页显示条数 currentPage:当前第几页

@autor godelegant

/

public List findAll(int pageItems,int currentPage){

StringBuffer sqlStr = new StringBuffer("select from Product limit ,");

int startIndex = (currentPage-1)pageItems;);//(currentPage-1)pageItems能过当前页和页面记录数得到应该从哪条开始取

int endIndex = startIndex+pageItems;

dbgetPstmt()setInt(1,startIndex);

dbgetPstmt()setInt(2,endIndex);

ResultSet rs = dbgetPstmt()executQuery();//假设你已经得到了数据库连接

//以上为MYSQL的JDBC分页,下面是ORALCE的,差别只在于SQL,所以你换一下SQL就OK:

StringBuffer sqlStr = new StringBuffer("select ,rownum rn from (select from Product) where rn <= and rownum >=");

}

求总页数的方法很简单,查出所有记录数,除一页显示数。就可以得到

以上是JDBC的,如果使用hibernate等,数据库分页将会变得很简单,只需要设置两个参数,就是从哪取和取多少。

2代码分页

思路是将数据库中的所有记录都取出来,然后再分页。

/

@para items:数据库中的所有记录,你可以使用另一个方法得到,如何查询得到我就不用说了吧

@autor godelegant

/

public List findAll(List items,int pageItems,int currentPage){

int startIndex = (currentPage-1)pageItems;//从哪里开始取

int offset = itemssize()-startIndex;//还有多少没有取过

int pageCount = offset>pageItemspageItems:offset;//如果没有取过的大于需要显示的数,则实现显示数pageCount=pageItems,反之然;

List<Product> pageList = new ArrayList();

for(int i=startIndex,i<startIndex+pageCount,i++){

pageListadd(itemsget(i));

}

return pageList;

}

写了40分钟,希望对你有用

所谓最大区别,应该就是,普通分页,每次都会去执行查询语句,然后动态显示出来,静态分页,就是预先查询出来分好页或者直接将需要分页的内容输出成静态页面,当然也是加了分页标记的,这样的好处,就是不用再去执行查询语句,与数据库无关了。

我这里有现成的,给我邮箱:xhq6632@126com,我发给你。

查询指定的记录最好通过Id进行in查询来获得真实的数据其实不是最好而是必须,也就是你应该先查询出复合的ID列表,通过in查询来获得数据

我们来做一个测试ipdatas表:

CREATE TABLE `ipdatas` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`uid` INT(8) NOT NULL DEFAULT '0',

`ipaddress` VARCHAR(50) NOT NULL,

`source` VARCHAR(255) DEFAULT NULL,

`track` VARCHAR(255) DEFAULT NULL,

`entrance` VARCHAR(255) DEFAULT NULL,

`createdtime` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',

`createddate` DATE NOT NULL DEFAULT '0000-00-00',

PRIMARY KEY (`id`),

KEY `uid` (`uid`)

) ENGINE=MYISAM AUTO_INCREMENT=67086110 DEFAULT CHARSET=utf8;

这是我们做的广告联盟的推广ip数据记录表,由于我也不是mysql的DBA所以这里咱们仅仅是测试

因为原来里面有大概7015291条数据

这里我们通过jdbc的batch插入6000万条数据到此表当中“JDBC插入6000W条数据用时:9999297ms”;

大概用了两个多小时,这里面我用的是batch大小大概在1w多每次提交,还有一点是每次提交的数据都很小,而且这里用的myisam数据表,因为我需要知道mysql数据库的大小以及索引数据的大小结果是

ipdatasMYD 399 GB (4,288,979,008 字节)

ipdatasMYI 128 GB (1,377,600,512 字节)

这里面我要说的是如果真的是大数据如果时间需要索引还是最好改成数字字段,索引的大小和查询速度都比时间字段可观。

步入正题:

1全表搜索

返回结构是67015297条数据

SELECT COUNT(id) FROM ipdatas;

SELECT COUNT(uid) FROM ipdatas;

SELECT COUNT() FROM ipdatas;

首先这两个全表数据查询速度很快,mysql中包含数据字典应该保留了数据库中的最大条数

查询索引条件

SELECT COUNT() FROM ipdatas WHERE uid=1; 返回结果时间:2分31秒594

SELECT COUNT(id) FROM ipdatas WHERE uid=1; 返回结果时间:1分29秒609

SELECT COUNT(uid) FROM ipdatas WHERE uid=1; 返回结果时间:2分41秒813

第二次查询都比较快因为mysql中是有缓存区的所以增大缓存区的大小可以解决很多查询的优化,真可谓缓存无处不在啊在程序开发中也是层层都是缓存

查询数据

第一条开始查询

SELECT FROM ipdatas ORDER BY id DESC LIMIT 1,10 ; 31毫秒

SELECT FROM ipdatas LIMIT 1,10 ; 15ms

查一次数据库得到N行数据快一点,还是从静态DataTable中得到一次数据快一点 --- 必然是后者快,因为直接 *** 作内存

分页代码的意义何在 --- 哪里秀?我没看到,而且别人秀你管他作甚

仅仅是为了避免大数据库加载查询吗 --- 主要是为了加快查询速度和减少内存占用,想一想百度搜索如果把上亿数据放一页会怎样

何必去一页一页查询,有这个必要吗 --- 你说百度怎么办吧

真的有人会一页一页浏览吗 --- 即便不会,你也不必像3那样真加载百万条到内存吧

那SQL存储过程分页就有存在意义了 --- 能用当然好,但不是所有数据库都有存储过程,而且人家说分页也不一定就是数据库作数据存储

为什么不一次性加载好,一页一页地显示呢 --- 就像你说的,既然我们浏览百度基本只看前几页,那你把100万页加载到内存,浪费了网络带宽和服务器务器资源,等着老板炒鱿鱼吧

要想分页,首先得做好准备工作。你要先声明每页显示多少条数据,还得获取当前选择的是多少页的页码。有了这两个分页就好办了。

sql如下:select top 10 from tableName

where (id not in(select top 20 from tableName order by Id desc)) order by Id desc

每页显示的数量:自己定义。

总页数:数据总条数/每页显示的条数

当前页码的计算方法:(页码-1)每页显示的数量。比如我要浏览第3页的数据,3从客户端传送过来后,在后台对页码进行处理:(3-1)每页显示的数量(假如是10)算出来后的结果就是20你在把20以参数注入的方式动态添加到上面那个20那里就ok了。

sql中的10表示你每页显示的数据,这里跟10,就代表每页显示10条。(你可以定义一个常量作为每页显示的条数)

where中的20表示不包括前面的20条数据,也就是查询出从第21条到30之间的数据。

不知道我这样说你是否理解,其实只要理解了sql语句,分页就很好做了。

SQL Server 在2012版本中 提供了一种新的分页方式 fetch next

相比以前开窗函数来看有什么区别呢? 我用 sql server 系统表产生笛卡尔积 做了一个测试

先来看一下数据量

在翻页数量不大的时候的比较 第20页的时候的比较

1、开窗函数

2、fetch next

可以看出所花费的时间相当接近的,两者都是12s

我们把页数增大,再来看看区别 第200000页的时候比较

一个花了39s,一个花了16s

当随着页数的增加 可以看出 fetch next 分页的性能是优于开窗函数的。

所以当你是使用sql server2012及以上版本的时候,建议还是采用 fetch next 来进行分页吧。

以上就是关于java分页全部的内容,包括:java分页、php 普通分页和静态分页的区别、求教,mysql千万级数据多表查询做分页该如何优化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10169592.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存