Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出,不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。在不改动Mybatis源代码的情况下,怎么使Mybatis支持物理分页呢?下面我们来看看。
(1)新建一个Java类Dialect.java,该类的内容如下:
- 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 类,具体的内容如下:
- package org.mybatis.extend.interceptor;
-
- public class OracleDialect extends Dialect{
-
-
-
-
- @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接口,该类的内容如下:
- 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);
-
-
-
- @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){
-
- }
- 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:
- 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();
- }
-
-
-
-
- @Override
- public Object plugin(Object target) {
- return Plugin.wrap(target, this);
- }
-
-
-
-
- @Override
- public void setProperties(Properties arg0) {
-
-
- }
-
- }
(4)将Mybatis的拦截器配置到Mybatis的全局配置文件(mybatis.cfg.xml)中,具体如下:
- <?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的地方,加上分页代码:
- getSqlSession().selectList(sqlId, paramMap,new RowBounds(pageId, pageSize));
分享到:
相关推荐
Android+Java后端(Springboot+Mybatis)小商店项目源码+数据库+项目说明.zip 主要实现一个商城的下单、购物车、支付等基本功能,熟悉后端的开发过程,因为自己做...PageHelper MyBatis物理分页插件 Redis 分布式缓存
具备增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时...| PageHelper | MyBatis物理分页插件 | | Druid | 数据库连接池 | | Lombok | 简化对象封装工具 | | Hutool | Java工具类库 | | JWT | JWT登录支持
数据的物理分页使用的是开源项目Mybatis-Page-Helper ,也是非常的轻量和易于引入。hibernate-validator的数据实体验证也使得参数的验证变得简单了起来。随着不停的实现与增加功能,引入的东西也变得丰富了起来。 #...
基于springboot+mintUI旅游...物理分页插件:PageHelper 模板引擎:Thymeleaf 项目构建管理:Maven #### 前端技术: 项目构建脚手架:vue-cli 前段框架:vue 桌面端ui:elementui 移动端ui:vant 可视化界面:echarts
PageHelper | MyBatis物理分页插件 | [http://git.oschina.net/free/Mybatis_PageHelper](http://git.oschina.net/free/Mybatis_PageHelper) Swagger-UI | 文档生产工具 | ...
内置分页实现:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 支持devtools/jrebel热部署 热加载 支持在不使用devtools/jrebel的情况下, 热加载 mybatis的mapper文件 内置全局、局部拦截...
持久层: mybatis、mybatis-spring,mybatis物理分页支持oracle和mysql,Log4jdbc在开发时查看实际执行SQL **数据库连接池:**目前是dbcp,可更换其他 **业务层:**spring 数据源配置、数据源动态切换、事务管理、...
- **内置分页实现**:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 - **支持devtools/jrebel热部署** - **热加载** 支持在不使用devtools/jrebel的情况下, 热加载 mybatis的mapper文件 - ...
java版商城源码下载 springbootparent 前言 mall项目致力于打造一个完整的自动化系统,采用现阶段流行技术实现。 项目介绍 项目演示 后台管理系统 前端项目mall-admin-web地址: ...MyBatis物理分页插件 Swagg
PageHelper 5.1.8 MyBatis物理分页插件 Maven 3.6.1 项目管理工具 Swagger2 2.7.0 交互式API文档 Elasticsearch 6.2.2 搜索引擎 kibana 6.2.2 数据分析和可视化平台 LogStash 6.2.2 数据采集引擎 RabbitMq 3.7.14 ...
| PageHelper | MyBatis物理分页插件 | [http://git.oschina.net/free/Mybatis_PageHelper](http://git.oschina.net/free/Mybatis_PageHelper) | | Swagger-UI | 文档生产工具 | ...
| PageHelper | MyBatis物理分页插件 | | Druid | 数据库连接池 | | Redis | 分布式缓存数据库 | | Log4J | 日志组件 | | Fastjson |JSON处理器| | Maven | 项目构建管理 | | dubbo|分布式服务框架| # 系统功能 ...
PageHelper | MyBatis物理分页插件 | [http://git.oschina.net/free/Mybatis_PageHelper](http://git.oschina.net/free/Mybatis_PageHelper) Druid | 数据库连接池 | [https://github.com/alibaba/druid]...