- 浏览: 663255 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
不知道大家做项目做到最后有什么感觉没有,其实大家做来做去就是做一个列表加上分页和多条件的查询(http://xdwangiflytek.iteye.com/blog/1358261),只是不同的项目业务流程不一样而已,所以今天我想说说这里的分页。
1、 大家需要了解的是为什么我们需要分页?
因为当数据量太大时,会影响查询和传输的性能,并且我们从用户角度来考虑的话,如果让用户一次性看到成千上万条记录那用户也会疯掉的。
2、 对我们来说有哪些可实现的分页技术?
a、 存储过程分页,即在数据库中创建一个存储过程,传入SQL和页码获取当前页的记录,这个需要大家对存储过程有比较好的认识(我这块不行),当然这个从性能上来说是最好的,但是不能跨数据库平台。
b、 使用数据库专有SQL语句进行分页(Oracle的rownum、MSSQL的top、MySql的limit等),性能也很好,但是还是不能跨数据库(其实真实项目中没那么多项目要求都跨数据库)。
c、 JDBC分页,通过Statement的statement.setMaxRow(endIndex)和resultSet.absoulte(beginIndex)取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现。这种方式的通用性是最好的,性能也不错,完全与数据库平台无关了。
d、 根据数据库类型自动生成数据库专有特性的sql语句,其实说白了也就是Hibernate的实现方式,这个自己也写过一个,其实就是根据数据库类型生成不同的数据库SQL专有语句而已。
下面我们需要写一个分页工具类,在写之前我们需要弄明白分页的原理。为了能够取得指定页码所对应的记录,我们是不是需要两个关键的参数:总记录数和每页的记录数;
每页的记录数我们可以设置一个默认值,10、15、20、25都无所谓,根据实际需求。
总记录数就没办法了,需要额外从数据库中利用Count函数取了,通过这两个参数我们是不是可以计算出总页数。同时我们也可以判断用户传过来的页码是否有效(小于第一页OR超出最后一页),然后我们再根据页码和每页记录数是不是就可以计算出当前页的的开始条数和终止条数了。
下面我们就需要来看看分页的工具类了
package com.iflytek.page; /** * 分页工具类 * * @author xudongwang 2012-1-19 * * Email:xdwangiflytek@gmail.com */ public class Page { /** * 总记录数 */ private int totalRow; /** * 每页记录数 */ private int pageSize = 10; /** * 当前页码 */ private int currentCount; /** * 总页数 */ private int total; /** * 起始记录下标 */ private int beginIndex; /** * 截止记录下标 */ private int endIndex; /** * 构造方法,使用总记录数,当前页码 * * @param totalRow * 总记录数 * @param currentCount * 当前页面,从1开始 */ public Page(int totalRow, int currentCount) { this.totalRow = totalRow; this.currentCount = currentCount; calculate(); } /** * 构造方法 ,利用总记录数,当前页面 * * @param totalRow * 总记录数 * @param currentCount * 当前页面 * @param pageSize * 默认10条 */ public Page(int totalRow, int currentCount, int pageSize) { this.totalRow = totalRow; this.currentCount = currentCount; this.pageSize = pageSize; calculate(); } private void calculate() { total = totalRow / pageSize + ((totalRow % pageSize) > 0 ? 1 : 0); if (currentCount > total) { currentCount = total; } else if (currentCount < 1) { currentCount = 1; } beginIndex = (currentCount - 1) * pageSize; endIndex = beginIndex + pageSize; if (endIndex > totalRow) { endIndex = totalRow; } } public int getTotalRow() { return totalRow; } public int getPageSize() { return pageSize; } public int getCurrentCount() { return currentCount; } public int getTotal() { return total; } public int getBeginIndex() { return beginIndex; } public int getEndIndex() { return endIndex; } }
继续
在后台获取前台传进来的页码 //从页面取得页码
int currentPage = 1; try { currentPage = Integer.parseInt(request.getParameter("currentPage")); } catch (Exception ex) {} //取得总记录数,创建Page对象 int totalRow = studentDao.getAllStudents();//通过select count 取得总记录数 Page page = new Page(totalRow, currentPage); studentDao.list(page);
数据访问层,StduentDao.java
public List<Stduent> getStudentsByPage(Page page) { List<Stduent> students = new ArrayList<Stduent>(); try { String sql = "SELECT id,name,email FROM tbl_stduent"; Connection conn = null; try { conn = DbUtil.getConnection(); Statement statement = conn.createStatement(); statement.setMaxRows(page.getEndIndex());//关键代码,设置最大记录数为当前页记录的截止下标 ResultSet resultSet = statement.executeQuery(sql); if (page.getBeginIndex() > 0) { resultSet.absolute(page.getBeginIndex());//关键代码,直接移动游标为当前页起始记录处 } while (resultSet.next()) { Stduent student = new Student(); …… students.add(student); } resultSet.close(); statement.close(); } finally { if (conn != null) { conn.close(); } } } catch (SQLException e) { e.printStackTrace(); } return students; }
其实仔细想想JDBC分页的性能与页码有关即与statement.setMaxRows有效,越往后翻,性能越差,因为越往后一次性查询的记录数就多,但是我们从用户的角度来看不会有用户会牛逼的一页一页翻到第n页去,一般都是根据条件来缩小查询范围。所以折中的办法就是将记录数设大一点,另外就是限制用户翻页的范围,其实这些性能的前提都是在数据量非常大的情况下而言的,一般数据量少的话,基本上都可以忽略不计的。
发表评论
-
log4j xml配置详解
2014-06-18 10:37 1099<?xml version="1.0&qu ... -
test
2013-07-29 09:16 0private static CacheImpl insta ... -
多文件上传 by MultipartFile and Multiple
2012-12-03 09:13 14297最近的一个项目中,需要用到 ... -
布局框架-SiteMesh
2012-11-30 08:57 2545最近在一个项目中使用 ... -
Servlet
2012-12-07 08:36 1499一、认识 Servlet : ... -
连接池
2012-12-10 08:42 1396... -
忆Java String
2012-11-15 08:38 1223平时 .NET 写多了, Java ... -
Eclipse中右键快速定位文件资源的工具
2012-11-09 08:43 1952当你开发.NET项目后,使用VS习惯了再来使用Java和Ecl ... -
Java中MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
2012-09-29 11:39 3624平时.NET做多了,再做Java时,总会进行一些比较,比如说J ... -
byte[]与InputStream互转
2012-09-29 11:39 1529InputStream转byte[] private ... -
统一中英文长度问题
2012-07-20 00:17 1894最近因为在做一个项目要求很多都是英文,所以这就涉及到在页 ... -
Java中Process的waitFor()阻塞问题
2012-07-21 01:00 8845在做视频转换时,调用外部的 exe 去进行一些视频 ... -
Tomcat注册成系统服务
2012-07-17 00:00 1514为了部署项目后不出现黑色的 doc 命令框,所以很 ... -
urlrewrite实现伪静态化
2012-07-25 00:41 3174产生背景 静态网页与动态网页比较: ... -
Java中java.util.Date时间和java.sql.Date时间的相互转化
2012-01-30 22:49 2908刚刚写用 JS 禁用退格键时( http ... -
使用BeanUtils类简化request和resultset转换
2012-01-21 20:23 2888当提交表单时,如果没有使用Struts等框架的话,你的代 ... -
JDBC的多条件动态查询
2012-01-19 11:05 7102前面我已经提到了现在的项目无非就是列表里的分页加多条件查 ... -
Java农历(阴历)工具类
2012-01-20 11:30 2302在真实的项目开发中会可能会遇到项目需要对阴历即我们所说的农历节 ... -
Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)
2012-01-16 14:13 4202右击项目名|选择属性properties|在左边列表内选择“J ... -
联系人导出(msn、邮箱)
2012-01-16 11:48 8308在项目开发中,不知道大家有没有涉及到导出邮箱或msn的联系人( ...
相关推荐
jdbc分页查询,利用mysql的limit实现分页查询。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
java基于原生的MySql的JDBC分页组件,我没有做jsp页面,我感觉那样很low,基本上可以套用我的分页组件,对于初学者帮助很大
jdbc分页查询源码,数据库,都已经测好。
jdbc 分页实例,含PPT分页课程详解及源代码。
jsp jdbc分页原代码 是尚学堂提供的标准的分页代码,适合初学javaweb的学员使用.
JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页界面优化最终版
JDBC分页 物理分页 mysql实现
基于java jdbc 分页 绝对好用, 直接导入项目就能用,数据库就简单的俩个字段
项目主体结构是dao+db+filter+pojo+servlet, 使用技术Servlet转发,代码中有注释帮助学者理解,数据库为MySQL资源...实现的数据库内容分页,查询分页,对初学者难点是根据get请求的中的url地址进行查询后的分页效果。
jdbc数据库通用分页方法,用时只须传值即可
sql语句分页查询 自己总结下来的 希望能给大家一点帮助!
一个用于支持JDBC分页的工具包,提供了一些封装好的JDBC操作方法,方便开发人员进行开发,提供了此工具包的API文档
高性能jdbc分页处理,使用PreparedStatement方式
java jdbc 分页工具类,以及返回集合数据的封装, private int limit = 10;//每页的个数 /** * 当前页 */ private int page; // /** * 总行数 */ private int totalRows; // /** * 总页数 */ private ...
JDBC分页 absolute实现
分页 含struts分页 jdbc分页 及标签的使用等
JDBC分页与数据连接通用类 望指教!有问题请指出!
JDBC分页实现方式总结。
JDBC分页 用的是SQL语句,效率还行吧。