iBATIS分頁的一些理解
iBATIS分頁中有一個很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的對象,實現(xiàn)翻頁,剛才測試了一下PaginatedList,在1-2w行數(shù)據(jù)的時候還可以工作,但是在一個30w行的表里翻頁,一次select用了363.031second
忍不住看了一下源,發(fā)現(xiàn)iBATIS的分頁依賴于數(shù)據(jù)庫的jdbcDriver.
調(diào)用次序如下
- SqlMapClientImpl.queryForPaginatedList
- ->SqlMapSessionImpl.queryForPaginatedList
- ->SqlMapExecutorDelegate.queryForPaginatedList
- ->GeneralStatement.executeQueryForList
- ->GeneralStatment.executeQueryWithCallback
- ->GeneralStatment.executeQueryWithCallback
- ->SqlExecutor.executeQuery
- ->SqlExecutor.handleMultipleResults()
iBATIS分頁處理的函數(shù)如下
Java代碼
- 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類的對象,每次翻頁的時候最后都會調(diào)用
Java代碼
- private List getList(int idx, int localPageSize); throws SQLException {
- return sqlMapExecutor.queryForList(statementName, parameterObject, (idx); * pageSize, localPageSize);;
- }
這個方法,可見iBATIS的分頁機制要看jdbcDriver如何實現(xiàn)以及是否支持rs.absolute(skipResults)。
iBATIS分頁的情況就介紹到這里,希望對你有所幫助。
【編輯推薦】