(转)Mybatis使用篇之十二:实现物理分页 http://chenjc-it.iteye.com/blog/1402965

Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出,不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。在不改动Mybatis源代码的情况下,怎么使Mybatis支持物理分页呢?下面我们来看看。

(1)新建一个Java类Dialect.java,该类的内容如下:

  1. package org.mybatis.extend.interceptor;   
  2.   
  3. public abstract class Dialect {   
  4.   
  5.     public static enum Type{   
  6.         MYSQL,   
  7.         ORACLE   
  8.     }   
  9.        
  10.     public abstract String getLimitString(String sql, int skipResults, int maxResults);   
  11.        
  12. }  
package org.mybatis.extend.interceptor;

public abstract class Dialect {

	public static enum Type{
		MYSQL,
		ORACLE
	}
	
	public abstract String getLimitString(String sql, int skipResults, int maxResults);
	
}

(2)新建一个Java类OracleDialect.java,该类继承Dialect 类,具体的内容如下:

Java代码 复制代码  收藏代码
  1. package org.mybatis.extend.interceptor;   
  2.   
  3. public class OracleDialect extends Dialect{   
  4.   
  5.     /* (non-Javadoc)  
  6.      * @see org.mybatis.extend.interceptor.IDialect#getLimitString(java.lang.String, int, int)  
  7.      */  
  8.     @Override  
  9.     public String getLimitString(String sql, int offset, int limit) {   
  10.   
  11.         sql = sql.trim();   
  12.         StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);   
  13.            
  14.         pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");   
  15.            
  16.         pagingSelect.append(sql);   
  17.            
  18.         pagingSelect.append(" ) row_ ) where rownum_ > ").append(offset).append(" and rownum_ <= ").append(offset + limit);   
  19.            
  20.         return pagingSelect.toString();   
  21.     }   
  22.   
  23. }  
package org.mybatis.extend.interceptor;

public class OracleDialect extends Dialect{

	/* (non-Javadoc)
	 * @see org.mybatis.extend.interceptor.IDialect#getLimitString(java.lang.String, int, int)
	 */
	@Override
	public String getLimitString(String sql, int offset, int limit) {

		sql = sql.trim();
		StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);
		
		pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
		
		pagingSelect.append(sql);
		
		pagingSelect.append(" ) row_ ) where rownum_ > ").append(offset).append(" and rownum_ <= ").append(offset + limit);
		
		return pagingSelect.toString();
	}

}

(3)新建一个Mybaits的拦截器PaginationInterceptor.java,实现Interceptor接口,该类的内容如下:

Java代码 复制代码  收藏代码
  1. package org.mybatis.extend.interceptor;   
  2.   
  3. import java.sql.Connection;   
  4. import java.util.Map;   
  5. import java.util.Properties;   
  6.   
  7. import org.apache.ibatis.executor.parameter.DefaultParameterHandler;   
  8. import org.apache.ibatis.executor.statement.StatementHandler;   
  9. import org.apache.ibatis.mapping.BoundSql;   
  10. import org.apache.ibatis.plugin.Interceptor;   
  11. import org.apache.ibatis.plugin.Intercepts;   
  12. import org.apache.ibatis.plugin.Invocation;   
  13. import org.apache.ibatis.plugin.Plugin;   
  14. import org.apache.ibatis.plugin.Signature;   
  15. import org.apache.ibatis.reflection.MetaObject;   
  16. import org.apache.ibatis.session.Configuration;   
  17. import org.apache.ibatis.session.RowBounds;   
  18. import org.slf4j.Logger;   
  19. import org.slf4j.LoggerFactory;   
  20.   
  21.   
  22. @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})   
  23. public class PaginationInterceptor implements Interceptor {   
  24.     //日志对象   
  25.     protected static Logger log = LoggerFactory.getLogger(PaginationInterceptor.class);   
  26.     /* (non-Javadoc)  
  27.      * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)  
  28.      */  
  29.     @Override  
  30.     public Object intercept(Invocation invocation) throws Throwable {   
  31.         StatementHandler statementHandler = (StatementHandler)invocation.getTarget();   
  32.         MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);   
  33.            
  34.         RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");   
  35.         if(rowBounds == null || rowBounds == RowBounds.DEFAULT){   
  36.             return invocation.proceed();   
  37.         }   
  38.            
  39.         DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler)metaStatementHandler.getValue("delegate.parameterHandler");   
  40.         Map parameterMap = (Map)defaultParameterHandler.getParameterObject();   
  41.         Object sidx = parameterMap.get("_sidx");   
  42.         Object sord = parameterMap.get("_sord");   
  43.            
  44.         String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");   
  45.            
  46.         if(sidx != null && sord != null){   
  47.             originalSql = originalSql + " order by " + sidx + " " + sord;   
  48.         }   
  49.            
  50.         Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration");   
  51.            
  52.                             Dialect.Type databaseType  = null;   
  53.         try{   
  54.             databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect").toUpperCase());   
  55.         } catch(Exception e){   
  56.             //ignore   
  57.         }   
  58.         if(databaseType == null){   
  59.             throw new RuntimeException("the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty("dialect"));   
  60.         }   
  61.         Dialect dialect = null;   
  62.         switch(databaseType){   
  63.             case ORACLE:   
  64.                 dialect = new OracleDialect();   
  65.                 break;   
  66.             case MYSQL://需要实现MySQL的分页逻辑   
  67.                 break;   
  68.                    
  69.         }   
  70.            
  71.            
  72.         metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );   
  73.         metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET );   
  74.         metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT );   
  75.         if(log.isDebugEnabled()){   
  76.             BoundSql boundSql = statementHandler.getBoundSql();   
  77.             log.debug("生成分页SQL : " + boundSql.getSql());   
  78.         }   
  79.         return invocation.proceed();   
  80.     }   
  81.   
  82.     /* (non-Javadoc)  
  83.      * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)  
  84.      */  
  85.     @Override  
  86.     public Object plugin(Object target) {   
  87.         return Plugin.wrap(target, this);   
  88.     }   
  89.   
  90.     /* (non-Javadoc)  
  91.      * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)  
  92.      */  
  93.     @Override  
  94.     public void setProperties(Properties arg0) {   
  95.         // TODO Auto-generated method stub   
  96.            
  97.     }   
  98.   
  99. }  
package org.mybatis.extend.interceptor;

import java.sql.Connection;
import java.util.Map;
import java.util.Properties;

import org.apache.ibatis.executor.parameter.DefaultParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
public class PaginationInterceptor implements Interceptor {
	//日志对象
	protected static Logger log = LoggerFactory.getLogger(PaginationInterceptor.class);
	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
		MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
		
		RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");
		if(rowBounds == null || rowBounds == RowBounds.DEFAULT){
			return invocation.proceed();
		}
		
		DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler)metaStatementHandler.getValue("delegate.parameterHandler");
		Map parameterMap = (Map)defaultParameterHandler.getParameterObject();
		Object sidx = parameterMap.get("_sidx");
		Object sord = parameterMap.get("_sord");
		
		String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");
		
		if(sidx != null && sord != null){
			originalSql = originalSql + " order by " + sidx + " " + sord;
		}
		
		Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration");
        
                            Dialect.Type databaseType  = null;
		try{
			databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect").toUpperCase());
		} catch(Exception e){
			//ignore
		}
		if(databaseType == null){
			throw new RuntimeException("the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty("dialect"));
		}
		Dialect dialect = null;
		switch(databaseType){
			case ORACLE:
				dialect = new OracleDialect();
				break;
			case MYSQL://需要实现MySQL的分页逻辑
				break;
				
		}
		
		
		metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );
		metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET );
		metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT );
		if(log.isDebugEnabled()){
			BoundSql boundSql = statementHandler.getBoundSql();
			log.debug("生成分页SQL : " + boundSql.getSql());
		}
		return invocation.proceed();
	}

	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)
	 */
	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)
	 */
	@Override
	public void setProperties(Properties arg0) {
		// TODO Auto-generated method stub
		
	}

}

 (4)将Mybatis的拦截器配置到Mybatis的全局配置文件(mybatis.cfg.xml)中,具体如下:

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2.   
  3. <!DOCTYPE configuration PUBLIC    
  4.     "-//mybatis.org//DTD Config 3.0//EN"  
  5.     "http://mybatis.org/dtd/mybatis-3-config.dtd">   
  6.   
  7. <configuration>   
  8.     <properties>   
  9.               <property name="dialect" value="oracle"/>   
  10.     </properties>   
  11.            
  12.     <plugins>   
  13.             <plugin interceptor="org.mybatis.extend.interceptor.PaginationInterceptor"/>   
  14.     </plugins>   
  15.           
  16. </configuration>  
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC 
    "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<properties>
    	      <property name="dialect" value="oracle"/>
	</properties>
	    
 	<plugins>
	        <plugin interceptor="org.mybatis.extend.interceptor.PaginationInterceptor"/>
	</plugins>
	   
</configuration>

(5)使用方法同Mybatis逻辑分页一样,拦截器会自动拦截执行SQL的地方,加上分页代码:

Java代码 复制代码  收藏代码
  1. getSqlSession().selectList(sqlId, paramMap,new RowBounds(pageId, pageSize));  

Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出,不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。在不改动Mybatis源代码的情况下,怎么使Mybatis支持物理分页呢?下面我们来看看。

(1)新建一个Java类Dialect.java,该类的内容如下:

  1. package org.mybatis.extend.interceptor;   
  2.   
  3. public abstract class Dialect {   
  4.   
  5.     public static enum Type{   
  6.         MYSQL,   
  7.         ORACLE   
  8.     }   
  9.        
  10.     public abstract String getLimitString(String sql, int skipResults, int maxResults);   
  11.        
  12. }  
package org.mybatis.extend.interceptor;

public abstract class Dialect {

	public static enum Type{
		MYSQL,
		ORACLE
	}
	
	public abstract String getLimitString(String sql, int skipResults, int maxResults);
	
}

(2)新建一个Java类OracleDialect.java,该类继承Dialect 类,具体的内容如下:

Java代码 复制代码  收藏代码
  1. package org.mybatis.extend.interceptor;   
  2.   
  3. public class OracleDialect extends Dialect{   
  4.   
  5.     /* (non-Javadoc)  
  6.      * @see org.mybatis.extend.interceptor.IDialect#getLimitString(java.lang.String, int, int)  
  7.      */  
  8.     @Override  
  9.     public String getLimitString(String sql, int offset, int limit) {   
  10.   
  11.         sql = sql.trim();   
  12.         StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);   
  13.            
  14.         pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");   
  15.            
  16.         pagingSelect.append(sql);   
  17.            
  18.         pagingSelect.append(" ) row_ ) where rownum_ > ").append(offset).append(" and rownum_ <= ").append(offset + limit);   
  19.            
  20.         return pagingSelect.toString();   
  21.     }   
  22.   
  23. }  
package org.mybatis.extend.interceptor;

public class OracleDialect extends Dialect{

	/* (non-Javadoc)
	 * @see org.mybatis.extend.interceptor.IDialect#getLimitString(java.lang.String, int, int)
	 */
	@Override
	public String getLimitString(String sql, int offset, int limit) {

		sql = sql.trim();
		StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);
		
		pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
		
		pagingSelect.append(sql);
		
		pagingSelect.append(" ) row_ ) where rownum_ > ").append(offset).append(" and rownum_ <= ").append(offset + limit);
		
		return pagingSelect.toString();
	}

}

(3)新建一个Mybaits的拦截器PaginationInterceptor.java,实现Interceptor接口,该类的内容如下:

Java代码 复制代码  收藏代码
  1. package org.mybatis.extend.interceptor;   
  2.   
  3. import java.sql.Connection;   
  4. import java.util.Map;   
  5. import java.util.Properties;   
  6.   
  7. import org.apache.ibatis.executor.parameter.DefaultParameterHandler;   
  8. import org.apache.ibatis.executor.statement.StatementHandler;   
  9. import org.apache.ibatis.mapping.BoundSql;   
  10. import org.apache.ibatis.plugin.Interceptor;   
  11. import org.apache.ibatis.plugin.Intercepts;   
  12. import org.apache.ibatis.plugin.Invocation;   
  13. import org.apache.ibatis.plugin.Plugin;   
  14. import org.apache.ibatis.plugin.Signature;   
  15. import org.apache.ibatis.reflection.MetaObject;   
  16. import org.apache.ibatis.session.Configuration;   
  17. import org.apache.ibatis.session.RowBounds;   
  18. import org.slf4j.Logger;   
  19. import org.slf4j.LoggerFactory;   
  20.   
  21.   
  22. @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})   
  23. public class PaginationInterceptor implements Interceptor {   
  24.     //日志对象   
  25.     protected static Logger log = LoggerFactory.getLogger(PaginationInterceptor.class);   
  26.     /* (non-Javadoc)  
  27.      * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)  
  28.      */  
  29.     @Override  
  30.     public Object intercept(Invocation invocation) throws Throwable {   
  31.         StatementHandler statementHandler = (StatementHandler)invocation.getTarget();   
  32.         MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);   
  33.            
  34.         RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");   
  35.         if(rowBounds == null || rowBounds == RowBounds.DEFAULT){   
  36.             return invocation.proceed();   
  37.         }   
  38.            
  39.         DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler)metaStatementHandler.getValue("delegate.parameterHandler");   
  40.         Map parameterMap = (Map)defaultParameterHandler.getParameterObject();   
  41.         Object sidx = parameterMap.get("_sidx");   
  42.         Object sord = parameterMap.get("_sord");   
  43.            
  44.         String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");   
  45.            
  46.         if(sidx != null && sord != null){   
  47.             originalSql = originalSql + " order by " + sidx + " " + sord;   
  48.         }   
  49.            
  50.         Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration");   
  51.            
  52.                             Dialect.Type databaseType  = null;   
  53.         try{   
  54.             databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect").toUpperCase());   
  55.         } catch(Exception e){   
  56.             //ignore   
  57.         }   
  58.         if(databaseType == null){   
  59.             throw new RuntimeException("the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty("dialect"));   
  60.         }   
  61.         Dialect dialect = null;   
  62.         switch(databaseType){   
  63.             case ORACLE:   
  64.                 dialect = new OracleDialect();   
  65.                 break;   
  66.             case MYSQL://需要实现MySQL的分页逻辑   
  67.                 break;   
  68.                    
  69.         }   
  70.            
  71.            
  72.         metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );   
  73.         metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET );   
  74.         metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT );   
  75.         if(log.isDebugEnabled()){   
  76.             BoundSql boundSql = statementHandler.getBoundSql();   
  77.             log.debug("生成分页SQL : " + boundSql.getSql());   
  78.         }   
  79.         return invocation.proceed();   
  80.     }   
  81.   
  82.     /* (non-Javadoc)  
  83.      * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)  
  84.      */  
  85.     @Override  
  86.     public Object plugin(Object target) {   
  87.         return Plugin.wrap(target, this);   
  88.     }   
  89.   
  90.     /* (non-Javadoc)  
  91.      * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)  
  92.      */  
  93.     @Override  
  94.     public void setProperties(Properties arg0) {   
  95.         // TODO Auto-generated method stub   
  96.            
  97.     }   
  98.   
  99. }  
package org.mybatis.extend.interceptor;

import java.sql.Connection;
import java.util.Map;
import java.util.Properties;

import org.apache.ibatis.executor.parameter.DefaultParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
public class PaginationInterceptor implements Interceptor {
	//日志对象
	protected static Logger log = LoggerFactory.getLogger(PaginationInterceptor.class);
	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin.Invocation)
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
		MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
		
		RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");
		if(rowBounds == null || rowBounds == RowBounds.DEFAULT){
			return invocation.proceed();
		}
		
		DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler)metaStatementHandler.getValue("delegate.parameterHandler");
		Map parameterMap = (Map)defaultParameterHandler.getParameterObject();
		Object sidx = parameterMap.get("_sidx");
		Object sord = parameterMap.get("_sord");
		
		String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");
		
		if(sidx != null && sord != null){
			originalSql = originalSql + " order by " + sidx + " " + sord;
		}
		
		Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration");
        
                            Dialect.Type databaseType  = null;
		try{
			databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect").toUpperCase());
		} catch(Exception e){
			//ignore
		}
		if(databaseType == null){
			throw new RuntimeException("the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty("dialect"));
		}
		Dialect dialect = null;
		switch(databaseType){
			case ORACLE:
				dialect = new OracleDialect();
				break;
			case MYSQL://需要实现MySQL的分页逻辑
				break;
				
		}
		
		
		metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );
		metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET );
		metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT );
		if(log.isDebugEnabled()){
			BoundSql boundSql = statementHandler.getBoundSql();
			log.debug("生成分页SQL : " + boundSql.getSql());
		}
		return invocation.proceed();
	}

	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)
	 */
	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	/* (non-Javadoc)
	 * @see org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)
	 */
	@Override
	public void setProperties(Properties arg0) {
		// TODO Auto-generated method stub
		
	}

}

 (4)将Mybatis的拦截器配置到Mybatis的全局配置文件(mybatis.cfg.xml)中,具体如下:

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2.   
  3. <!DOCTYPE configuration PUBLIC    
  4.     "-//mybatis.org//DTD Config 3.0//EN"  
  5.     "http://mybatis.org/dtd/mybatis-3-config.dtd">   
  6.   
  7. <configuration>   
  8.     <properties>   
  9.               <property name="dialect" value="oracle"/>   
  10.     </properties>   
  11.            
  12.     <plugins>   
  13.             <plugin interceptor="org.mybatis.extend.interceptor.PaginationInterceptor"/>   
  14.     </plugins>   
  15.           
  16. </configuration>  
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC 
    "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<properties>
    	      <property name="dialect" value="oracle"/>
	</properties>
	    
 	<plugins>
	        <plugin interceptor="org.mybatis.extend.interceptor.PaginationInterceptor"/>
	</plugins>
	   
</configuration>

(5)使用方法同Mybatis逻辑分页一样,拦截器会自动拦截执行SQL的地方,加上分页代码:

Java代码 复制代码  收藏代码
  1. getSqlSession().selectList(sqlId, paramMap,new RowBounds(pageId, pageSize));  

猜你喜欢

转载自88548886.iteye.com/blog/1697495
今日推荐