姓名测试打分分页22

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!MyBatis分页插件--附代码测试
也许分页插件是你最为感兴趣的东西,那好我们开完成一个分页插件。
好长的代码,hold住哦。 博主今天累了,改天再和你们解释一下这个插件的设计思想。
package com.learn.mybatis.
import java.sql.C
import java.sql.PreparedS
import java.sql.ResultS
import java.util.M
import java.util.P
import org.apache.ibatis.executor.parameter.ParameterH
import org.apache.ibatis.executor.statement.StatementH
import org.apache.ibatis.mapping.BoundS
import org.apache.ibatis.mapping.MappedS
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.P
import org.apache.ibatis.plugin.S
import org.apache.ibatis.reflection.MetaO
import org.apache.ibatis.reflection.SystemMetaO
import org.apache.ibatis.scripting.defaults.DefaultParameterH
import org.apache.ibatis.session.C
* @author ykzhen2015
@Intercepts({
@Signature(type = StatementHandler.class,
method = &prepare&,
args = {Connection.class})})
public class PagingPlugin implements Interceptor {
private Integer defaultP
private Integer defaultPageS
private Boolean defaultUseF
private Boolean defaultCheckF
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler stmtHandler = getUnProxyObject(invocation);
MetaObject metaStatementHandler = SystemMetaObject.forObject(stmtHandler);
String sql = (String) metaStatementHandler.getValue(&delegate.boundSql.sql&);
//不是select语句.
if (!this.checkSelect(sql)) {
return invocation.proceed();
BoundSql boundSql = (BoundSql) metaStatementHandler.getValue(&delegate.boundSql&);
Object parameterObject = boundSql.getParameterObject();
PageParams pageParams =
if (parameterObject instanceof Map) {
Map parameterMap = (Map) parameterO
pageParams = (PageParams) parameterMap.get(&$pageParams&);
} else if (parameterObject instanceof PageParams) {
pageParams = (PageParams) parameterO
if (pageParams == null) {
throw new Exception(&没有获得分页参数!!,请正确使用分页参数!!&);
//获取参数.
Integer pageNum = pageParams.getPage() == null? this.defaultPage : pageParams.getPage();
Integer pageSize = pageParams.getPageSize() == null? this.defaultPageSize : pageParams.getPageSize();
Boolean useFlag = pageParams.getUseFlag() == null? this.defaultUseFlag : pageParams.getUseFlag();
Boolean checkFlag = pageParams.getCheckFlag() == null? this.defaultCheckFlag : pageParams.getCheckFlag();
if (!useFlag) {
//不使用分页插件.
return invocation.proceed();
int total = this.getTotal(invocation, metaStatementHandler, boundSql);
pageParams.setTotal(total);
//计算总页数.
int totalPage = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
pageParams.setTotalPage(totalPage);
//检查当前页码的有效性.
this.checkPage(checkFlag, pageNum, totalPage);
this.changeSQL(metaStatementHandler, boundSql, pageNum, pageSize);
//执行查询,得到最后的结果.
Object data = invocation.proceed();
PageDataPO pageData = this.dealPageData(data, pageTotal, total, pageSize, pageNum);
* 判断是否sql语句.
* @param sql
private boolean checkSelect(String sql) {
String trimSql = sql.trim();
int idx = trimSql.toLowerCase().indexOf(&select&);
return idx == 0;
* 检查当前页码的有效性.
* @param checkFlag
* @param pageNum
* @param pageTotal
* @throws Throwable
private void checkPage(Boolean checkFlag, Integer pageNum, Integer pageTotal) throws Throwable
if (checkFlag) {
//检查页码page是否合法.
if (pageNum & pageTotal) {
throw new Exception(&查询失败,查询页码【& + pageNum + &】大于总页数【& + pageTotal + &】!!&);
* 修改当前查询的SQL
* @param metaStatementHandler
* @param boundSql
* @param page
* @param pageSize
private void changeSQL(MetaObject metaStatementHandler, BoundSql boundSql, int page, int pageSize) {
//获取当前需要执行的SQL
String sql = (String) metaStatementHandler.getValue(&delegate.boundSql.sql&);
* TODO 这里使用的是MySQL其他需要修改.
* 根据你的数据库,修改分页的SQL
String newSql = &select * from (& + sql + &) $_paging_table limit & + (page - 1) * pageSize + &, & + pageS
//修改当前需要执行的SQL
metaStatementHandler.setValue(&delegate.boundSql.sql&, newSql);
* 获取综述.
* @param ivt Invocation
* @param metaStatementHandler statementHandler
* @param boundSql sql
* @return sql查询总数.
* @throws Throwable 异常.
private int getTotal(Invocation ivt, MetaObject metaStatementHandler, BoundSql boundSql) throws Throwable {
//获取当前的mappedStatement
MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue(&delegate.mappedStatement&);
//配置对象
Configuration cfg = mappedStatement.getConfiguration();
//当前需要执行的SQL
String sql = (String) metaStatementHandler.getValue(&delegate.boundSql.sql&);
* TODO 如果是其他的数据库需要按你数据库的SQL规范改写.
* 改写为统计总数的SQL
String countSql = &select count(*) as total from (& + sql + &) $_paging&;
//获取拦截方法参数,我们知道是Connection对象.
Connection connection = (Connection) ivt.getArgs()[0];
PreparedStatement ps =
int total = 0;
//预编译统计总数SQL
ps = connection.prepareStatement(countSql);
//构建统计总数SQL
BoundSql countBoundSql = new BoundSql(cfg, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
//构建MyBatis的ParameterHandler用来设置总数Sql的参数。
ParameterHandler handler = new DefaultParameterHandler(mappedStatement, boundSql.getParameterObject(), countBoundSql);
//设置总数SQL参数
handler.setParameters(ps);
//执行查询.
ResultSet rs = ps.executeQuery();
while (rs.next()) {
total = rs.getInt(&total&);
} finally {
//这里不能关闭Connection否则后续的SQL就没法继续了。
if (ps != null && ps.isClosed()) {
ps.close();
System.err.println(&总条数:& + total);
* 从代理对象中分离出真实对象.
* @param ivt --Invocation
* @return 非代理StatementHandler对象
private StatementHandler getUnProxyObject(Invocation ivt) {
StatementHandler statementHandler = (StatementHandler) ivt.getTarget();
MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
// 分离代理对象链(由于目标类可能被多个拦截器拦截,从而形成多次代理,通过循环可以分离出最原始的的目标类)
Object object =
while (metaStatementHandler.hasGetter(&h&)) {
object = metaStatementHandler.getValue(&h&);
if (object == null) {
return statementH
return (StatementHandler)
public Object plugin(Object statementHandler) {
return Plugin.wrap(statementHandler, this);
public void setProperties(Properties props) {
String strDefaultPage = props.getProperty(&default.page&, &1&);
String strDefaultPageSize = props.getProperty(&default.pageSize&, &50&);
String strDefaultUseFlag = props.getProperty(&default.useFlag&, &false&);
String strDefaultCheckFlag = props.getProperty(&default.checkFlag&, &false&);
this.defaultPage = Integer.parseInt(strDefaultPage);
this.defaultPageSize = Integer.parseInt(strDefaultPageSize);
this.defaultUseFlag = Boolean.parseBoolean(strDefaultUseFlag);
this.defaultCheckFlag = Boolean.parseBoolean(strDefaultCheckFlag);
注意:在代码注解的地方有些地方有TODO,这里我采用的是MySQL修改语句,如果你是其他数据库需要在哪里修改为对应数据库的SQL语句。
有了这个插件,还不行哦,还要配置一下:
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
这样在MyBatis上下文就可以引用这个插件了。
这里的配置:
default.page -- 缺省页码的时候,采用第1页default.pageSize -- 缺省每页多少条配置的时候,才有每页20条default.useFlag -- 查询是否启用分页插件,如果为false则不启用。default.checkFlag -- 查询是否检查page当前页有效。如最大页码是2,程序传递为3,如此项为true,则抛出异常提示错误。如果为false则不抛出异常
以上的默认参数都可以通过这个类进行改变:
package com.learn.mybatis.
* @author ykzhen2015
public class PageParams {
private Integer pageS
private Boolean useF
private Boolean checkF
private Integer totalP
public Integer getPage() {
public void setPage(Integer page) {
this.page =
public Integer getPageSize() {
return pageS
public void setPageSize(Integer pageSize) {
this.pageSize = pageS
public Boolean getUseFlag() {
return useF
public void setUseFlag(Boolean useFlag) {
this.useFlag = useF
public Boolean getCheckFlag() {
return checkF
public void setCheckFlag(Boolean checkFlag) {
this.checkFlag = checkF
public Integer getTotal() {
public void setTotal(Integer total) {
this.total =
public Integer getTotalPage() {
return totalP
public void setTotalPage(Integer totalPage) {
this.totalPage = totalP
当以下属性被设置会有这样的效果:
page --插件默认设置default.page作废,采取这个值
pageSize --插件默认设置default.pageSize作废,采取这个值
useFlag --插件默认设置default.useFlag作废,采取这个值
checkFlag --插件默认设置default.checkFlag作废,采取这个值
total &&代表总条数,插件回自动帮我们回填
totalPage &&代表总页数,插件回自动帮我们回填
有了这个类,我们来举例如何使用它,我们先定义Mapper接口。
package com.learn.mybatis.chapter1.
import java.util.L
import java.util.M
import org.apache.ibatis.annotations.P
import com.learn.mybatis.chapter1.po.TR
import com.learn.mybatis.plugin.PageP
import com.learn.mybatis.plugin.TestP
public interface RoleMapper {
&& &public TRole getRole(Long id);
&& &public List selectAllRole(TestParams pageParams);
&& &public List selectRoleByMap(Map params);
//&$pageParams&这个键不能修改
public List selectRoleByMap(@Param(&roleName&) String roleName, @Param(&$pageParams&) PageParams pageParams);
好,这里有三个select开头的方法,参数分别为POJO, map和MyBatis的注解型。这三种类型这个插件都可以适用。
让我们看看POJO---TestParams,它继承了PageParams
package com.learn.mybatis.
public class TestParams extends PageParams {
String roleN
public String getRoleName() {
return roleN
public void setRoleName(String roleName) {
this.roleName = roleN
这时候我们看看roleMapper.xml
select id, role_name as roleName, note from t_role where id=#{id}
select id, role_name as roleName, note from t_role
role_name like concat('%', #{roleName}, '%')
select id, role_name as roleName, note from t_role
role_name like concat('%', #{roleName}, '%')
select id, role_name as roleName, note from t_role
role_name like concat('%', #{roleName}, '%')
可以看好,三个select都有方法了。
我们用main方法测试一下:
public static void main(String[] args) {
testParams();
testPOJO();
testMap();
public static void testPOJO() {
SqlSession sqlSession =
sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
TestParams params = new TestParams();
params.setUseFlag(true);
params.setCheckFlag(false);
params.setPage(2);
params.setPageSize(5);
params.setRoleName(&test&);
List pageData = roleMapper.selectAllRole(params);
System.err.println(&#######################测试POJO##################&);
System.err.println(&总页数:& + params.getTotalPage());
System.err.println(&总条数:& + params.getTotal());
} finally {
sqlSession.close();
public static void testMap() {
SqlSession sqlSession =
sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Map paramMap = new HashMap();
PageParams pageParams = new PageParams();
pageParams.setUseFlag(true);
pageParams.setCheckFlag(false);
pageParams.setPage(2);
pageParams.setPageSize(5);
paramMap.put(&roleName&, &test&);
&paramMap.put(&$pageParams&, pageParams);//&$pageParams&这个键不能修改
List pageData2 = roleMapper.selectRoleByMap(paramMap);
System.err.println(&#######################测试Map##################&);
System.err.println(&总页数:& + pageParams.getTotalPage());
System.err.println(&总条数:& + pageParams.getTotal());
} finally {
sqlSession.close();
public static void testParams() {
SqlSession sqlSession =
sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
PageParams pageParams2 = new PageParams();
pageParams2.setUseFlag(true);
pageParams2.setCheckFlag(true);
pageParams2.setPage(2);
pageParams2.setPageSize(5);
List pageData3 = roleMapper.selectRoleByMap(&test&, pageParams2);
System.err.println(&#######################测试@Param##################&);
System.err.println(&总页数:& + pageParams2.getTotalPage());
System.err.println(&总条数:& + pageParams2.getTotal());
} finally {
sqlSession.close();
好,他们都执行相同的查询,并且打印了总页数和总条数,会不会成功呢?我们看看打印的日志:
21:03:46,208 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
21:03:46,818 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:03:46,834 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:03:47,583 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
21:03:48,646 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection .
21:03:48,646 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,662 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging
21:03:48,802 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
总条数:11
21:03:48,896 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5
21:03:48,912 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:03:48,927 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
#######################测试@Param##################
总条数:11
21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,927 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection
21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
21:03:48,943 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection
from pool.
21:03:48,943 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,943 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging
21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
总条数:11
21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5
21:03:48,958 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:03:48,974 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
#######################测试POJO##################
总条数:11
21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection
21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
21:03:48,974 org.apache.ibatis.datasource.pooled.PooledDataSource: Checked out connection
from pool.
21:03:48,974 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging
21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
总条数:11
21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select * from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging_table limit 5, 5
21:03:48,990 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:03:49,005 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
#######################测试Map##################
总条数:11
21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:49,005 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@79be0360]
21:03:49,005 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection
成功构建 (总时间: 5 秒)
好,我们看到,我们的分页参数的总条数和总页数被回填了。而且我们可以通过useFlag属性来控制是否启用分页,这样对于select count(*) from t_role这样的语句我们通过设置参数,就可以不启用这个分页功能了。
此外还有检查页码的功能,只要设置了属性,checkFlag插件会为我们检查这个页码的正确性,让我们看看:
public static void testException() {
SqlSession sqlSession =
sqlSession = MyBatisUtil.getSqlSessionFactroy().openSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
TestParams params = new TestParams();
params.setUseFlag(true);
params.setCheckFlag(true);//检查页码正确性
params.setPage(5);//故意超过最大页数
params.setPageSize(5);
params.setRoleName(&test&);
List pageData = roleMapper.selectAllRole(params);
System.err.println(&#######################测试POJO##################&);
System.err.println(&总页数:& + params.getTotalPage());
System.err.println(&总条数:& + params.getTotal());
} finally {
sqlSession.close();
params.setCheckFlag(true);//检查页码正确性
注意这里设置了需要检验
params.setPage(5);//故意超过最大页数
这样让他超过了最大的页数。
我们测试它,得到日志:
21:09:22,123 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:09:22,341 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
21:09:22,732 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
21:09:23,482 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection .
21:09:23,482 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]
21:09:23,513 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==&
Preparing: select count(*) as total from (select id, role_name as roleName, note from t_role WHERE role_name like concat('%', ?, '%')) $_paging
21:09:23,669 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==& Parameters: test(String)
21:09:23,794 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: &==
总条数:11
21:09:23,810 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]
21:09:23,810 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3d99d22e]
21:09:23,826 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection
Exception in thread &main& org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.
Cause: java.lang.reflect.UndeclaredThrowableException
### The error may exist in com\learn\mybatis\chapter1\sqlmap\role.xml
### The error may involve com.learn.mybatis.chapter1.mapper.RoleMapper.selectAllRole-Inline
### The error occurred while setting parameters
### Cause: java.lang.reflect.UndeclaredThrowableException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy3.selectAllRole(Unknown Source)
at com.learn.mybatis.chapter1.main.MyBatisExample.testException(MyBatisExample.java:33)
at com.learn.mybatis.chapter1.main.MyBatisExample.main(MyBatisExample.java:18)
Caused by: java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy4.prepare(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:76)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:61)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
... 7 more
Caused by: java.lang.Exception: 查询失败,查询页码【5】大于总页数【3】!!
at com.learn.mybatis.plugin.PagingPlugin.checkPage(PagingPlugin.java:105)
at com.learn.mybatis.plugin.PagingPlugin.intercept(PagingPlugin.java:73)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
... 15 more
C:\Users\ykzhen\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53:
returned: 1
构建失败 (总时间: 2 秒)
我们看到了,异常,并且指明超过了最大总页数
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 网速测试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信