Java: 分页Paging的实现思路和Demo
2016-10-26 23:51
330 查看
1.为什么要分页?
首先是数据量太大会影响查询和传输的性能,关键是对用户来说一下看到数万条记录也不是那么友好。
2.有哪些分页技术?
a)存储过程分页
在数据库中创建一个存储过程,传入SQL和页码获得当前页的记录。需要对具体数据库的语法相当熟悉才能够编写,当然也可以直接google。性能最好,但不跨数据库平台。
b)数据库专有sql特性分页
使用数据库专有的特性(MSSQL的top、Oracle的rownum、MySQL的limit等)实现当前页记录提取。性能也非常好,但也不跨数据库平台。
c)纯JDBC分页
通过Statement的setMaxRow(endIndex)和rs.absoulte(beginIndex)仅取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现,如果厂商的rs读取是以流的形式进行的,性能还是有所保障的。这种方式的通用性是最好的,完全与数据库平台无关了。
d)根据数据库类型自动生成数据库专有特性的sql语句
其实这就是Hibernate的实现方法,如果你觉得自己分析SQL语法然后将SQL转换为特定数据库语法比较麻烦,那就用Hibernate吧。
Jdbc分页Demo
Reference:
http://noahark007.blog.163.com/blog/static/5716526720122178844841/
首先是数据量太大会影响查询和传输的性能,关键是对用户来说一下看到数万条记录也不是那么友好。
2.有哪些分页技术?
a)存储过程分页
在数据库中创建一个存储过程,传入SQL和页码获得当前页的记录。需要对具体数据库的语法相当熟悉才能够编写,当然也可以直接google。性能最好,但不跨数据库平台。
b)数据库专有sql特性分页
使用数据库专有的特性(MSSQL的top、Oracle的rownum、MySQL的limit等)实现当前页记录提取。性能也非常好,但也不跨数据库平台。
c)纯JDBC分页
通过Statement的setMaxRow(endIndex)和rs.absoulte(beginIndex)仅取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现,如果厂商的rs读取是以流的形式进行的,性能还是有所保障的。这种方式的通用性是最好的,完全与数据库平台无关了。
d)根据数据库类型自动生成数据库专有特性的sql语句
其实这就是Hibernate的实现方法,如果你觉得自己分析SQL语法然后将SQL转换为特定数据库语法比较麻烦,那就用Hibernate吧。
Jdbc分页Demo
package com.myjava.demo.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class JdbcPagingDemo { private static final int PAGE_SIZE = 2; public static void main(String[] args){ String queryRowNumSQL = "select count(*) from t_email"; String querySQL = "select * from t_email"; int totalRow; try(Connection conn = getConnection()){ Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet result = stat.executeQuery(queryRowNumSQL); result.next(); totalRow = result.getInt("count(*)"); for(int beginIndex = 1; beginIndex <= totalRow;beginIndex += PAGE_SIZE){ int endIndex = (beginIndex + PAGE_SIZE - 1) > totalRow ? totalRow : (beginIndex + PAGE_SIZE - 1); System.out.println("beginIndex : " + beginIndex + ", endIndex : " + endIndex); stat.setMaxRows(endIndex); result = stat.executeQuery(querySQL); result.absolute(beginIndex - 1); while(result.next()){ ResultSetMetaData metaData = result.getMetaData(); for(int i = 1; i <= metaData.getColumnCount();i++){ if(i == 1) System.out.print(result.getString(i)); else System.out.print("\t"+result.getString(i)); } System.out.println(); } } stat.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static Connection getConnection() throws SQLException{ String driver = "com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost:3306/vis_email"; String username = "root"; String password = "123456"; try { Class.forName(driver); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return DriverManager.getConnection(url,username,password); } }
Reference:
http://noahark007.blog.163.com/blog/static/5716526720122178844841/
相关文章推荐
- .Net/C#/VB/T-SQL/Java/Script 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- .Net/C#/VB/T-SQL/Java 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- .Net/C#/VB/T-SQL/Java 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- 转 .Net/C#/VB/T-SQL/Java/Script 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- JAVA实现点对点通信思路
- 【Java Socket】【Flex Socket】【Java 多线程】实现基本聊天功能demo
- 数据库连接池的设计思路及java实现
- Flex与java通过BlazeDS实现通信(简单Demo)
- Java平台要实现类似豆丁百度文科的文档在线阅读,总体思路是讲doc docx等文件格式利用jcom转换成pdf再用swftools转为swf。再用flexpaper组件显示swf。
- Java客户端自动升级实现思路
- 实现Flex与Java的通信的Demo(BlazeDS方式)
- 用Java实现断点续传的基本思路和代码
- Flex与java通过BlazeDS实现通信(简单Demo)
- JAVA如何实现条件编译(从思路开始)
- java 大量数据提交时,使用队列定时提交思路的程序实现
- Java Design Demo--java实现队列的类ExecutorService
- java IO流实现文件上传的demo
- Java实现发送邮件demo
- Java 图片压缩实现思路及代码
- Flex与java通过BlazeDS实现通信(简单Demo)