MyBatis Generator分页插件RowBoundsPlugin坑

一、Mybatis Generator设置分页

Mybatis Generator没有设置分页,但自带了个RowBoundsPlugin分页插件,故而配置

<plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>

在mysql数据库进行查询的表分页10条,查很久花费了9s,表的数据也只是十几万行。百思不得其解,查看RowBoundsPlugin生成的代码,如下:

public interface IDomainDao {//省略其他代码@SelectProvider(type=DomainSqlProvider.class, method="selectByExample")@Results({@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),@Result(column="domain", property="domain", jdbcType=JdbcType.VARCHAR)})List<Domain> selectByExampleWithRowbounds(DomainExample example, RowBounds rowBounds);
}
public class DomainSqlProvider {//省略其他代码public String selectByExample(DomainExample example) {SQL sql = new SQL();if (example != null && example.isDistinct()) {sql.SELECT_DISTINCT("id");} else {sql.SELECT("id");}sql.SELECT("domain");sql.FROM("domain");applyWhere(sql, example, false);if (example != null && example.getOrderByClause() != null) {sql.ORDER_BY(example.getOrderByClause());}return sql.toString();}
}

selectByExample方法里面没有使用limit进行分页,使用mybatis自带的RowBounds功能进行内存分页。故而查询十条数据,其实是把整张表符合要求的数据都查询出来了,在程序的内存进行截取,故而花费了9s。

 

二、解决方案

对Mysql

(1)使用example.setOrderByClause()方法进行sql注入limit分页

(2)重些插件改造example进行分页

public class MySqlLimitPlugin extends PluginAdapter {@Overridepublic boolean validate(List<String> list) {return true;}/*** Example类添加offset和limit属性和set、get方法*/@Overridepublic boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper();Field limit = new Field();limit.setName("limit");limit.setVisibility(JavaVisibility.PRIVATE);limit.setType(integerWrapper);topLevelClass.addField(limit);Method setLimit = new Method();setLimit.setVisibility(JavaVisibility.PUBLIC);setLimit.setName("setLimit");setLimit.addParameter(new Parameter(integerWrapper, "limit"));setLimit.addBodyLine("this.limit = limit;");topLevelClass.addMethod(setLimit);Method getLimit = new Method();getLimit.setVisibility(JavaVisibility.PUBLIC);getLimit.setReturnType(integerWrapper);getLimit.setName("getLimit");getLimit.addBodyLine("return limit;");topLevelClass.addMethod(getLimit);Field offset = new Field();offset.setName("offset");offset.setVisibility(JavaVisibility.PRIVATE);offset.setType(integerWrapper);topLevelClass.addField(offset);Method setOffset = new Method();setOffset.setVisibility(JavaVisibility.PUBLIC);setOffset.setName("setOffset");setOffset.addParameter(new Parameter(integerWrapper, "offset"));setOffset.addBodyLine("this.offset = offset;");topLevelClass.addMethod(setOffset);Method getOffset = new Method();getOffset.setVisibility(JavaVisibility.PUBLIC);getOffset.setReturnType(integerWrapper);getOffset.setName("getOffset");getOffset.addBodyLine("return offset;");topLevelClass.addMethod(getOffset);return true;}/*** Mapper.xml的selectByExampleWithoutBLOBs添加limit*/@Overridepublic boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,IntrospectedTable introspectedTable) {addXmlLimit(element);return true;}/*** Mapper.xml的selectByExampleWithBLOBs添加limit*/    @Overridepublic boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element,IntrospectedTable introspectedTable) {addXmlLimit(element);return true;}private void addXmlLimit(XmlElement element) {XmlElement ifLimitNotNullElement = new XmlElement("if");ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null"));XmlElement ifOffsetNotNullElement = new XmlElement("if");ifOffsetNotNullElement.addAttribute(new Attribute("test", "offset != null"));ifOffsetNotNullElement.addElement(new TextElement("limit ${offset}, ${limit}"));ifLimitNotNullElement.addElement(ifOffsetNotNullElement);XmlElement ifOffsetNullElement = new XmlElement("if");ifOffsetNullElement.addAttribute(new Attribute("test", "offset == null"));ifOffsetNullElement.addElement(new TextElement("limit ${limit}"));ifLimitNotNullElement.addElement(ifOffsetNullElement);element.addElement(ifLimitNotNullElement);}/*** 注解selectByExampleWithBLOBs方法生成分页*/public boolean providerSelectByExampleWithBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {addAnnotationLimit(method, topLevelClass, introspectedTable);return super.providerSelectByExampleWithBLOBsMethodGenerated(method, topLevelClass, introspectedTable);}/*** 注解selectByExampleWithoutBLOBs方法生成分页*/public boolean providerSelectByExampleWithoutBLOBsMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {addAnnotationLimit(method, topLevelClass, introspectedTable);return super.providerSelectByExampleWithoutBLOBsMethodGenerated(method, topLevelClass, introspectedTable);}private void addAnnotationLimit(Method method, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {List<String> limits = Arrays.asList("if (example != null && example.getLimit() != null) {","if (example.getOffset() != null) {","sql.OFFSET(example.getOffset());","}","sql.LIMIT(example.getLimit());","}");method.addBodyLines(method.getBodyLines().size() - 1, limits);}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于自绝对父相的理解

1、如果对子元素施加绝对定位&#xff0c;然后设置一个bottom为20 则&#xff1a; html <div class"k1"><div class"k2">1111</div></div>.k1 {margin: 0 auto;height: 500px;width: 500px;background: green;}.k2 {height: 100…

【北京】微软技术直通车(第二期) 之 SQL Server 2017饕餮

微软技术直通车 本系列活动密切关注微软及周边相关技术。以微软云计算和相关产品为依托&#xff0c;涉及云计算、数据处理、开发工具、商用软件、物联网、人工智能等前沿科技。 系列活动邀请微软技术专家、一线开发者、成功创业者、企业家等进行技术和经验分享。让您直通微软新…

P1993-小K的农场【差分约束,SPFA】

正题 题目链接:https://www.luogu.org/problemnew/show/P1993 题目大意 有若干个条件 Waw>WbW_aw>W_bWa​w>Wb​Waw<WbW_aw<W_bWa​w<Wb​WaWbW_aW_bWa​Wb​ 解题思路 差分约束不解释 codecodecode #include<cstdio> #include<queue> #incl…

MyBatis中的RowBounds

转载自 MyBatis中的RowBounds 一、如何分页查询 Mybatis如何分页查询&#xff1f;Mysql中可以使用limit语句&#xff0c;但limit并不是标准SQL中的&#xff0c;如果是其它的数据库&#xff0c;则需要使用其它语句。MyBatis提供了RowBounds类&#xff0c;用于实现分页查询。R…

vscode插件以及配置

插件&#xff1a; Auto Rename Tag indent-rainbow 好看多彩的缩进空格 Dracula Officila 吸血鬼主题 Rainbow Brackets 彩虹括号&#xff0c;强烈推荐 快捷键&#xff1a; 代码折叠&#xff1a; 1、Ctrl键 Shift键 [键 折叠 2、Ctrl键 Shift键 ]键 展开 多行选中 &#x…

使用 MQTTnet 快速实现 MQTT 通信

1 什么是 MQTT &#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;是 IBM 开发的一个即时通讯协议&#xff0c;有可能成为物联网的重要组成部分。MQTT 是基于二进制消息的发布/订阅编程模式的消息协议&#xff0c;如今…

P1726-上白泽慧音【tarjan,图论】

正题 题目链接:https://www.luogu.org/problemnew/show/P1726 题目大意 求最大的强联通分量和包含的点 解题思路 tarjantarjantarjan模板不解释。 codecodecode #include<cstdio> #include<algorithm> #include<stack> using namespace std; const int N5…

Maven的pom.xml文件详解------Build Settings

转载自 Maven的pom.xml文件详解------Build Settings 根据POM 4.0.0 XSD&#xff0c;build元素概念性的划分为两个部分&#xff1a;BaseBuild&#xff08;包含poject build和profile build的公共部分&#xff0c;见下&#xff09;和poject build包含的一些高级特性。 <p…

git代码合并冲突与撤回提交

查看版本 切回到某一个版本 git log --graph --abbrev-commit --decorate --prettyoneline git reset --hard a07cefe git有一种情况会造成代码被冲掉&#xff1a; 这里有A端和B端&#xff1a; 相同文本基础之上 A端写了大量代码&#xff0c;提交推送 B端拉取&#xff0c;改了代…

Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET SignalR是ASP.NET开发人员的一个库&#xff0c;它简化了向Web应用程序添加即时通讯功能的过程。 它可以…

P3225-[HNOI2012]矿场搭建【tarjan,图论】

正题 题目链接:https://www.luogu.org/problemnew/show/P3225 题目大意 nnn个点的无向图&#xff0c;要求设置逃生点使得任意一个点去掉后每联通分量内都有一个逃生点。求至少多少个逃生点和方案数。 解题思路 首先tarjantarjantarjan求出割点&#xff0c;然后对于一个分量内…

Maven的pom.xml文件详解------Environment Settings

转载自 Maven的pom.xml文件详解------Environment Settings Issue Management 使用的缺陷跟踪系统&#xff08;Bugzilla&#xff0c;TestTrack&#xff0c;ClearQuest&#xff0c;等&#xff09;信息&#xff0c;主要用于产生项目文档。 <issueManagement><system…

大二暑假工作三个月后辞职,总体感悟

本人是个大二的学生&#xff0c;因为疫情影响&#xff0c;学校放了很长时间的假。当时对自己的前端技术很自信&#xff0c;大概在五月底的时候决定去上海闯一下&#xff0c;找个工作&#xff0c;不管能不能找到&#xff0c;就是尝试一下&#xff0c;失败了也没关系&#xff0c;…

P5004-专心OI - 跳房子【dp,矩阵乘法】

正题 题目链接:https://www.luogu.org/problemnew/show/P5004 题目大意 把NNN个无色格子排成一行&#xff0c;可以把某些格子染成黑色&#xff0c;但两个黑色格子之间必须至少有MMM个无色格子&#xff0c;求方案数 解题思路 首先很明显 fn∑i0n−m−1fif_n\sum_{i0}^{n-m-1}…

35年编程史沉淀下来的8条宝贵经

01 1. 时刻提醒自己&#xff1a;学习 学习某件事的第一步是承认你不知道。这听起来很正常&#xff0c;但经验丰富的程序员还记得要真正让自己承认这一点需要花多长时间。很多计算机科学专业的学生毕业的时候&#xff0c;都有一种很傲慢的态度&#xff0c;就是“我知道最好的”&…

Maven的pom.xml文件详解------The Basics

转载自 Maven的pom.xml文件详解------The Basics Maven坐标 GroupId、artifactId和version构成了Maven的坐标&#xff08;groupId和version可以从parent继承&#xff09;&#xff0c;指定了组件在Maven仓库中的位置。Maven中的每个组件都有一个坐标&#xff0c;通过这个坐标…

php artisan快捷命令

远程启动laravel&#xff1a; php artisan serve --host 0.0.0.0 创建新的Controller php artisan make:controller loginController 创建快捷资源Controller php artisan make:controller ArticlesController --resource 对应的创建快捷路由 Route::resource(‘articles’,…

P1407-[国家集训队]稳定婚姻【tarjan,强连通分量】

正题 题目链接:https://www.luogu.org/problemnew/show/P1407 题目大意 若干对夫妻&#xff0c;和若干对绿色关系&#xff0c;求每对夫妻离婚后&#xff0c;绿色关系是否可以重新让每个人两两配对。 解题思路 我们可以让 夫妻女的连男的 交往男的连女的 然后跑tarjantarjan…

基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

背景 目前AI 处于风口浪尖&#xff0c;作为 公司的CTO&#xff0c;也作为自己的技术专研&#xff0c;开始了AI之旅&#xff0c;在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法&#xff0c;目前自己的研究方向主要开源的 AI 库&#xff0c;如&#xff1a;Emgu CV、TensorF…

Lombok的@Data生成的hashCode和equals方法坑

一、场景复现 创建两个lombok的Data注解的类Pig实例&#xff0c;放进HashMap当key&#xff0c;map里面的数据居然被覆盖了。 package com.mk;import lombok.Data; Data public class Pig extends Animal{private String sex; }package com.mk;import java.util.HashMap; impo…