关于ibatis进行物理游标分页
http://www.iteye.com/topic/136712
详细demo:参照http://www.kusoft.net
我的数据库是采用mssql2000
采用分页必定数据量比较大:
按照ibatis的自带的是缓存分页.如果一大的肯定内存吃不消. 但是可以采用queryForList,却得不到总记录数码相.
要得到总记录数,因此我采用物理游标进行分页.
功能:需要得到结果的记录数,显示每页几行
(1)定义一个接口Pager:
- public interface Pager {
- //总共几行
- public int getRows();
- //存入一页的数据
- public List<Object> getList();
- public void setList(List<Object> list);
- public void setRows(int rows);
- }
(2)Pager实现类PagerImpl
- public class PagerImpl implements Pager {
- private List<Object> list = null;
- private int rows = 0;
- public List<Object> getList() {
- return list;
- }
- public void setList(List<Object> list) {
- this.list = list;
- }
- public int getRows() {
- return rows;
- }
- public void setRows(int rows) {
- this.rows = rows;
- }
- }
(3)扩展ibatis自带接口 SqlMapExecutor
- //skip 起启行,max每页几行
- Pager queryForPager(String id, Object parameterObject, int skip, int max) throws SQLException;
- Pager queryForPager(String id, Object parameterObject, int skip) throws SQLException;
- //根据条件查出所有结果
- Pager queryForPager(String id, Object parameterObject) throws SQLException;
(4)扩展ibatis接口 SqlMapExecutor的实现类有两个SqlMapClientImpl,SqlMapSessionImpl
- SqlMapClientImpl的扩展如下
- public Pager queryForPager(String id, Object paramObject, int skip, int max)
- throws SQLException {
- if (max <= 0)
- return getLocalSqlMapSession().queryForPager(id, paramObject, skip);
- else
- return getLocalSqlMapSession().queryForPager(id, paramObject, skip,
- max);
- }
- public Pager queryForPager(String id, Object parameterObject, int skip)
- throws SQLException {
- return getLocalSqlMapSession().queryForPager(id, parameterObject, skip,
- SqlExecutor.NO_MAXIMUM_RESULTS);
- }
- public Pager queryForPager(String id, Object parameterObject)
- throws SQLException {
- return getLocalSqlMapSession().queryForPager(id, parameterObject,
- SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
- }
(5)最终修改SqlExecutor获取总记录数
SqlExecutor:439行
- if (resultMap != null) {
- // Skip Results
- if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
- rs.beforeFirst();
- if (skipResults > 0) {
- rs.absolute(skipResults);
- }
- } else {
- for (int i = 0; i < skipResults; i++) {
- if (!rs.next()) {
- return;
- }
- }
- }
- // Get Results
- int resultsFetched = 0;
- while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults)
- && rs.next()) {
- Object[] columnValues = resultMap
- .resolveSubMap(request, rs).getResults(request, rs);
- callback.handleResultObject(request, columnValues, rs);
- resultsFetched++;
- }
- if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
- rs.last();
- request.setRows(rs.getRow());
- } else {
- int total = skipResults + resultsFetched;
- while(rs.next()){
- total++;
- }
- request.setRows(total);
- }
- }
这样就可以了
(6)如何调用
6.1创建一个方法
- public static Pager pager(GroupVO vo,int offset,int limit)throws SQLException{
- return sqlMapper.queryForPager("list",vo,offset);
- }
- public static void main(String[] args){
- try {
- SimpleExample se = new SimpleExample();
- GroupVO vo = new GroupVO();
- Pager pager = se.pager(vo,0,10);
- //vo.setGroup_no("100");
- //vo.setGroup_name("fengjian");
- //vo.setGroup_desc("thanks");
- System.out.println("totalsize = "+pager.getRows());
- List list = pager.getList();
- if(list!=null)
- for(int i=0; i<list.size(); i++){
- GroupVO v = (GroupVO)list.get(i);
- System.out.println("group no = " + v.getGroup_no());
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
有什么不同看法:msn:linuxfjy@hotmail.com, mail: kusoft@qq.com
关于ibatis进行物理游标分页的更多相关文章
- DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter
drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)
url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...
- drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter
drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...
- ibatis 实现 物理级别的 分页 兼容多种数据库(转载)
最近在看iBatis时,想做用动态Sql做个分布.因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能.所以要对生成后的代码做修改.我在Java高手真经的一书中看到有做了MySq ...
- oracle ibatis 存储过程 返回游标 嵌套表
自己解决问题了 问题总结: 1.index by表不能存储在数据库中的type中,故选择嵌套表. 2.ibatis不支持oracle的复合数据类型的返回.(个人理解) 3.替代方案:用返回oracle ...
- solr研磨之游标分页
普通分页 当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000 x 10 页的数据,并将这100000条数据缓存在内存中,然后在内存中进行排序.最后返回最后10 ...
- Ibatis调用存储过程实现增删改以及分页查询
1.Ibatis实现增删改操作很简单了,通常我是将某一模块的增删改功能写在一个存储过程里,通过一个标识符去区分执行增加还是修改抑或删除操作. statement: <!-- 存储过程:实现学生的 ...
- IBatis的分页研究
IBatis的分页研究 博客分类: Ibatis学习 摘自: http://cpu.iteye.com/blog/311395 yangtingkun Oracle分页查询语句 ibaits. ...
- ASP.NET和MSSQL高性能分页
首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ======= ...
随机推荐
- FZU2234 牧场物语 DP
题意:先去再回,不能吃重复的,获取最大值 分析:等价于两个人同时去,不能吃重复的 定义dp[i][j][k]表示从起点走k步,第一个人的横坐标是i,第二个人的横坐标是j的最最大值 这个题和bc上一个回 ...
- UVA 11426 GCD - Extreme (II) 欧拉函数
分析:枚举每个数的贡献,欧拉函数筛法 #include <cstdio> #include <iostream> #include <ctime> #include ...
- oracle中查看某个用户名下所有的表以及sequence
select table_name from all_tables where owner =upper('jdfp') ; 此处查的是tieba这个用户表空间下的所有表 ...
- 自动化测试实施的几个idea
UI检查.测试的一个idea 在电子商务网站中, 为达到较好的用户体验, 可能页面上会有大量的UI设计,一堆css.ajax效果等,敏捷开发中, UI变动更是带来了测试的苦恼.对于回归组catch U ...
- curl 使用简介
Libcurl使用介绍: 四个关键函数: 1. curl_easy_init() 初始化curl环境,新建curl对象,返回对象句柄,使用举例: CURL *handler = cur ...
- 解决:javah 无法访问引用Android对象的问题
无法访问android.view.View 是没有引入android.jar包 javah的参数中 有一个-bootclasspath参数 让他指向android.jar包 例如 javah -jni ...
- pptp vpn
webalizer是一个高效的.免费的web服务器日志分析程序.其分析结果以HTML文件格式保存,从而可以很方便的通过web服务器进行浏览; http://daliang1215.iteye.com/ ...
- 问题-[ACCESS2007]怎么显示MsysObjects
office 2007设置:单击左上角图标 -> Access选项 -> 当前数据库 -> 导航 -> 导航选项 -> 勾选显示隐藏对象,显示系统对象.数据库工具选项卡 ...
- 怎样做出通用的pos小票打印程序
POS小票打印机分为热敏和针式俩种. 打印纸的宽度分为58毫米.76毫米和80毫米三种. 打印接口分为:串口.并口.USB和网口(以太网). 热敏打印机速度较快,打印的时候噪音少,针打可以使用多联纸自 ...
- iOS 状态栏、导航栏、工具栏、选项卡大小
1.状态栏状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑 ...