使用Display标签对大量数据使用外部排序实例(一)
2009-01-31 13:28
741 查看
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.ys168.com
时间:2009-01-31
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
Display标签是个十分优秀的以表格形式显示数据的轻便标签,支持分页、排序及数据导出功能。经过在项目中实践检查,确实不错。
针对大数据量的情况,如数据库里的大量记录,全部从数据库里取出,然后在内存中进行排序,效率不高,内存占用大。为此,标签十分体贴的提供了外部排序分页的功能(External Paging and Sorting)。关于外部排序、分页的概念及具体细节,请参见我的一篇翻译文章《Display标签外部排序与分页(External Paging and Sorting)》,是官方文档的翻译。
官方文档中,没有介绍如何实现外部排序分页的细节,说它很容易实现。我结合我的应用环境(jdk 1.5、Oracle92i、tomcat5.5)试验了一下,果然很容易,实现标签要求的接口----PaginatedList,写一句分页的SQL(使用ROWNUM,大家都知道吧),将数据取出来交给标签来显示就可以了。
为了让朋友更容易,我把代码贴出来。由于这个类与数据库操作类有些藕合,所以这个代码并不能运行,相关函数我进行了适当的注释,仅能用来演示实现思路。
代码显得很多,有些代码是方便jsp页面上参数传递而进行的不是很必要的函数重载。
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.ys168.com
时间:2009-01-31
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.ys168.com
时间:2009-01-31
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
Display标签是个十分优秀的以表格形式显示数据的轻便标签,支持分页、排序及数据导出功能。经过在项目中实践检查,确实不错。
针对大数据量的情况,如数据库里的大量记录,全部从数据库里取出,然后在内存中进行排序,效率不高,内存占用大。为此,标签十分体贴的提供了外部排序分页的功能(External Paging and Sorting)。关于外部排序、分页的概念及具体细节,请参见我的一篇翻译文章《Display标签外部排序与分页(External Paging and Sorting)》,是官方文档的翻译。
官方文档中,没有介绍如何实现外部排序分页的细节,说它很容易实现。我结合我的应用环境(jdk 1.5、Oracle92i、tomcat5.5)试验了一下,果然很容易,实现标签要求的接口----PaginatedList,写一句分页的SQL(使用ROWNUM,大家都知道吧),将数据取出来交给标签来显示就可以了。
为了让朋友更容易,我把代码贴出来。由于这个类与数据库操作类有些藕合,所以这个代码并不能运行,相关函数我进行了适当的注释,仅能用来演示实现思路。
代码显得很多,有些代码是方便jsp页面上参数传递而进行的不是很必要的函数重载。
package com.wallimn.gyz.util; import java.sql.Connection; import java.util.List; import java.util.Map; import org.displaytag.pagination.PaginatedList; import org.displaytag.properties.SortOrderEnum; import com.wallimn.gyz.dao.BaseDao; import com.wallimn.gyz.dao.DbManager; public class OraPaginatedList implements PaginatedList { /** * wrapped list */ private List<Map<String, Object>> pagedList = null; /** * Number of objects per page. */ private int objectsPerPage; /** * Current page (starting from 1) */ private int currentPage; private String selectSql; private int fullSize; private String sortCriterion = null; private SortOrderEnum sortDirection = SortOrderEnum.DESCENDING; public OraPaginatedList(String sql) { selectSql = sql; this.objectsPerPage = 20; this.currentPage = 1; } public OraPaginatedList(String sql, int currentPage) { this.objectsPerPage = 20; this.currentPage = currentPage; selectSql = sql; } /** * 设置当前面,内含null值判断代码,可以简化页面上的操作。 * <br/> * 作者:wallimn 时间:2009-1-22 下午12:07:31<br/> * 邮件:wallimn@sohu.com<br/> * 博客:http://blog.csdn.net/wallimn<br/> * 参数:<br/> * @param curPage */ public void setCurrentPage(String curPage){ if(curPage==null || "null".equals(curPage))this.currentPage=1; else this.currentPage = Integer.parseInt(curPage); } public void setObjectsPerPage(int objectsPerPage){ this.objectsPerPage = objectsPerPage; } public void setObjectsPerPage(String objectsPerPage){ if(objectsPerPage==null || "null".equals(objectsPerPage))this.objectsPerPage=20; else this.objectsPerPage = Integer.parseInt(objectsPerPage); } @SuppressWarnings("unchecked") public List getList() { BaseDao dao = new BaseDao(); // int startOffset = objectsPerPage * (currentPage - 1); String fullSql=null; if(this.sortCriterion!=null)fullSql=selectSql+ " order by "+this.sortCriterion+ " " + getSortDirectionStr(); else fullSql =selectSql; //生成分页的SQL,使用ROWNUM String pageSql = dao.getPageSql(fullSql, (currentPage - 1) * objectsPerPage, (currentPage) * objectsPerPage); //System.out.println(pageSql); //使用正则表达式,变换成select count(*)的形式。 String countSql = dao.getCountSql(selectSql); DbManager manager = DbManager.getInstance(); Connection conn = manager.getConnection(); pagedList = dao.dbSearch(conn, pageSql); fullSize = dao.getCount(conn, countSql); manager.closeConnection(conn); return pagedList; } public int getPageNumber() { return currentPage; } public int getObjectsPerPage() { return objectsPerPage; } public int getFullListSize() { return fullSize; } public void setSortCriterion(String fieldN) { this.sortCriterion = (fieldN == null || "null".equals(fieldN)) ? "1" : fieldN; } public String getSortCriterion() { return this.sortCriterion; } public void setSortDirection(String dir) { if (dir == null || "null".equals(dir) || "desc".equalsIgnoreCase(dir)) sortDirection = SortOrderEnum.DESCENDING; else sortDirection = SortOrderEnum.ASCENDING; } public String getSortDirectionStr(){ if(sortDirection == SortOrderEnum.ASCENDING)return "ASC"; else return "DESC"; } public SortOrderEnum getSortDirection() { return sortDirection; } public String getSearchId() { return Integer.toHexString(objectsPerPage * 10000 + currentPage); } }
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.ys168.com
时间:2009-01-31
/***********本人原创,欢迎转载,转载请保留本人信息*************/
/***********文章发表请与本人联系,作者保留所有权利*************/
相关文章推荐
- 使用Display标签对大量数据使用外部排序实例(二)
- 数据表格显示标签 - DisplayTag - 使用简单实例
- Display标签外部排序与分页(External Paging and Sorting)
- 【实例】javascript中使用event.target获取触发该事件标签的相关数据而不是通过document
- 帝国CMS教程使用技巧自定义列表标签SQL数据调用实例
- 在Struts中使用displaytag标签的排序/分页数据
- DataTables+BootStrap组合Ajax数据使用方法(排序,过滤,分页等)
- jQuery EasyUI使用教程之在数据网格中自定义排序
- 选择排序法 当数据量较小的时候,使用基本排序方案并不会显著影响程序性能。 选择排序是十分常用的基本排序方案之一。
- 最流行强大的页面标签框架 display:table 使用
- 加载大量的xml数据 使用压缩方法解决(当然较小时也可以压缩)
- .NET使用Office Open XML导出大量数据到 Excel
- HttpURLConnection连接网页和获取数据的使用实例
- javascript使用xml 数据岛 简单实例
- PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
- HTML5 audio标签使用js进行播放控制实例
- Javascript使用post方法提交数据实例
- 安卓学习第28天:使用Intent在活动之间传递数据以及Activity的生命周期实例
- JAVA中使用JDBC插入大量mysql中的数据
- 使用JSON格式提交数据到服务端的实例代码