MyBatis插件实现分页
来源:互联网 发布:淘宝流量入口 编辑:程序博客网 时间:2024/04/26 13:17
1:在spring-MyBatis.xml文件中添加以下配置:
2:PageIntercepter自定义拦截器通过拦截StatementHandler重写sql语句实现对数据库的物理分页。
2:PageIntercepter自定义拦截器通过拦截StatementHandler重写sql语句实现对数据库的物理分页。
public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); MetaObject metaStatementHandler; Object configuration; for(metaStatementHandler = MetaObject.forObject(statementHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY); metaStatementHandler.hasGetter("h"); metaStatementHandler = MetaObject.forObject(configuration, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY)) { configuration = metaStatementHandler.getValue("h"); } while(metaStatementHandler.hasGetter("target")) { configuration = metaStatementHandler.getValue("target"); metaStatementHandler = MetaObject.forObject(configuration, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY); } Configuration configuration1 = (Configuration)metaStatementHandler.getValue("delegate.configuration"); Properties properties = configuration1.getVariables(); if(properties == null) { dialect = defaultDialect; pageSqlId = defaultPageSqlId; } else { dialect = configuration1.getVariables().getProperty("dialect"); if(dialect == null || "".equals(dialect)) { logger.warn("Property dialect is not setted,use default \'mysql\' "); dialect = defaultDialect; } pageSqlId = configuration1.getVariables().getProperty("pageSqlId"); if(pageSqlId == null || "".equals(pageSqlId)) { logger.warn("Property pageSqlId is not setted,use default \'.*Page$\' "); pageSqlId = defaultPageSqlId; } } MappedStatement mappedStatement = (MappedStatement)metaStatementHandler.getValue("delegate.mappedStatement"); if(mappedStatement.getId().matches(pageSqlId)) { BoundSql boundSql = (BoundSql)metaStatementHandler.getValue("delegate.boundSql"); Object parameterObject = boundSql.getParameterObject(); if(parameterObject == null) { throw new NullPointerException("parameterObject is null!"); } PageParameter pageParameter = null; if(parameterObject instanceof Map) { Map sql = (Map)parameterObject; pageParameter = (PageParameter)sql.get("pageParameter"); } else { Field sql1 = ReflectUtil.getParentFieldByFieldName(parameterObject, "pageParameter"); if(sql1 != null) { pageParameter = (PageParameter)ReflectUtil.getParentFieldValue(parameterObject, "pageParameter"); } } if(pageParameter == null) { pageParameter = new PageParameter(); } String sql2 = boundSql.getSql(); String pageSql = this.buildPageSql(sql2, pageParameter); metaStatementHandler.setValue("delegate.boundSql.sql", pageSql); metaStatementHandler.setValue("delegate.rowBounds.offset", Integer.valueOf(0)); metaStatementHandler.setValue("delegate.rowBounds.limit", Integer.valueOf(2147483647)); Connection connection = (Connection)invocation.getArgs()[0]; this.setPageParameter(sql2, connection, mappedStatement, boundSql, pageParameter); } return invocation.proceed();}3:要拦截的目标类型是StatementHandler,拦截的是方法名为prepare参数为Connection的方法。
@Intercepts({@Signature( type = StatementHandler.class, method = "prepare", args = {Connection.class})})
0 0
- MyBatis插件实现分页
- Mybatis 分页插件实现
- mybatis分页插件实现分页
- mybatis实现分页插件PageHelper
- Mybatis分页插件的实现
- MyBatis Generator实现分页插件
- Mybatis分页插件PageHelper实现自动分页
- mybatis分页/分页插件
- SpringMVC+MyBatis分页插件简单实现
- mybatis分页插件的简单实现
- MyBatis+Mysql实现分页插件PageInfo
- MyBatis Generator实现MySQL分页插件
- MyBatis Generator实现MySQL分页插件
- mybatis分页实现(非插件方式)
- MyBatis+Mysql实现分页插件PageInfo
- 简要描述mybatis插件实现分页
- mybatis实现分页查询(pagehelper插件)
- Mybatis的pageHelper插件实现分页
- 使用docker 1.12 搭建多主机docker swarm集群
- log4j+common-logging到slf4j+logback的日志移植方法
- 读STM32F4xx中文参考手册笔记(序)
- 带分页的sqlserver查询
- 做个实验彻底搞明白Java中的值传递和引用传递
- MyBatis插件实现分页
- 滴滴笔试题
- CocoaPods详解之----使用篇
- iOS在后台情况下展现出模糊效果(双击home键,看到的应用程序模糊)
- log4j.xml详解(一)
- Linux学习笔记之swap
- MFGPRO 中如何调用QAD 标准程序实现上下键移动
- 百练+单词的矩阵颠倒+简单模拟一下就好
- 多线程同步的五种方法