⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session分页及ibatis分页.txt

📁 Java大部分的基础知识,EJB3,EJB2,WEBSERVICE,SOAP,JMS,MQ,还有些面试题
💻 TXT
字号:
四、如何通过session分页?
	1、通过一个action取出所有的信息放到session中,转发到另一个action即PageAction,
	   取一页的信息。
	2、在PageAction中做如下工作
		a、确定一页显示多少行
			int pageSize=2;
		b、确定总共有多少页
			int pageCount=users.size()/pageSize+(user.size()%pageSize==0?0:1);
		c、得到客户请求的当前页
			int page=1;
			String temp=request.getParameter("page");
			if(temp!=null)
			{
				page=Integer.parseInt(temp);
			}			
		d、得到当前页的第一行
			int pageRow=(page-1)*pageSize;
		e、取一页的信息显示?
			List pageRows=new ArrayList();
			for(int i=pageRow;i<=pageRow+pageSize;i++)
			{
				if(i>=users.size())
				{
					break;
				}
				pageRows.add(users.get(i));
			}
			request.setAttribute("pageRows",pageRows);


ibatis分页源码分析 
--------------------------------------------------------------------------------
作者:-  
在ibatis中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象, 
实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second 
忍不住看了一下源,发现ibatis的分页依赖于数据库的jdbcDriver.

调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList 
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList 
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback 
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults() 
分页处理的函数如下 


代码
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {    
    try {    
      request.setResultSet(rs);    
      ResultMap resultMap = request.getResultMap();    
      if (resultMap != null) {    
        // Skip Results    
        if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {    
          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++;    
        }    
      }    
    } finally {    
      request.setResultSet(null);    
    }    
  }   

返回的PaginatedList实际上是PaginatedDataList类的对象,每次翻页的时候最后都会调用 

代码
private List getList(int idx, int localPageSize) throws SQLException {    
   return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize);    
 }   

这个方法,可见ibatis的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。 
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,马上会死翘翘。  
  
上传时间:2007-08-19 10:28:58 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -