👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事中“练”
《互联网高频面试题》:面朝简历学习,春暖花开
《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题
《精进 Java 学习指南》:系统学习,互联网主流技术栈
《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud
视频教程:https://doc.iocoder.cn
来源:juejin.cn/post/
7246365103783673911
mybatis-sql-viewer插件主要提供能力:将mybatis xml转成真实SQL语句、参数mock、SQL规范检查、SQL索引检查、SQL运行、SQL压测及Mybatis SQL语句扫描。
1 简介
虽然写了很久的CRUD,但是依旧觉得写好CRUD是一件非常难且麻烦的事情,以下的情况在开发过程中应该都遇到过:
SQL的编写需要细心,写错了SQL字段或者表名称,修改完要重启(几分钟过去了)
SQL编写好后进行测试时,造数据也好麻烦,特别是还存在表关联的情况,数据内容不真实,还容易超出字段长度,让人抓狂
SQL好不容易能跑了,又会有以下的疑问
符不符合SQL开发规范?
是否能命中索引?又可能命中哪个索引?
日常环境数据太少,如何模拟SQL在生产环境下运行的真实情况?
性能怎么样,最大TPS可以达到多少?数量大时是否会存在慢SQL?
TP99/TP90、最大RT/平均RT、平均TPS是多少呢?
对于使用Mybatis的开发者还会存在这些问题:
Mapper接口方法和XML标签不对应,修改完要重启(又几分钟过去了)
XML中多写了一个逗号或者分号,又没有错误提示,接口测试调用时才发现,修改完又又要重启(好多个几分钟过去了)
这个Mapper接口对应的是哪个XML文件?找找十几秒过去了
这个XMl文件对应的是哪个Mapper接口?找找十几秒又过去了
这个项目中有多少个XML文件?有多少SQL语句?里面是否存在慢SQL?是否都符合开发规范?
![65b867ad9189e1d21999db4292a08d95.jpeg](https://img-blog.csdnimg.cn/img_convert/65b867ad9189e1d21999db4292a08d95.jpeg)
按照这种开发模式,需要重启好多次应用,对于每次启动都需要几分钟的应用来说开发体验简直就是灾难。
基于上述的问题,开发了mybatis-sql-viewer插件,基于此插件可以实现以下能力而不需要启动应用:
![4ec70be5ba20028e40d167096dcfa26c.jpeg](https://img-blog.csdnimg.cn/img_convert/4ec70be5ba20028e40d167096dcfa26c.jpeg)
基于此插件以上的问题在编码阶段即可解决:
SQL的编写好麻烦,写错了SQL字段或者表名称,修改完需要重启 --> 语法校验
SQL编写好后进行测试时,造数据麻烦,特别是存在表关联的情况,数据内容不真实,容易超出字段长度报错 --> 多种数据mock方式,自动关联
SQL好不容易跑起来了,又会有以下的疑问:
符不符合SQL开发规范?--> SQL规范检查
是否能命中索引,可能命中哪个索引?--> SQL索引检查&SQL执行计划
日常环境数据量太少,如何模拟SQL在生产环境下运行的真实情况?--> 支持大批量数据mock
性能怎么样,最大TPS可以达到多少?数量大时是否会存在慢SQL?--> SQL语句压测,结果一目了然
基于此插件可以提高CRUD的效率及SQL质量,开发流程可以转换为如下模式:
![872c19fbe3749140c8e6f8d435b5bbc5.jpeg](https://img-blog.csdnimg.cn/img_convert/872c19fbe3749140c8e6f8d435b5bbc5.jpeg)
上述的规约均来自《阿里巴巴Java开发手册》中的MySQL数据库章节。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
2 安装
IDEA中安装:
Preferences(Settings) > Plugins > Marketplace > Search"mybatis sql viewer" > Install
手动安装:
在releases页面中下载最新版本的zip文件
Preferences(Settings) > Plugins > ⚙️ > Install plugin from disk... -> 选择下载的文件安装
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
3 使用
因为需要拉取数据库表的元数据信息、执行SQL,所以使用前需要配置一下数据源。
支持多数据源配置,点击「datasource」按钮即可完成数据源的创建、选择、删除、测试。
![59a289809b48487fe3889e3fd99d1cc1.png](https://img-blog.csdnimg.cn/img_convert/59a289809b48487fe3889e3fd99d1cc1.png)
1. 模式
此插件有两种模式:mybatis模式和非mybatis模式。差别在于mybatis模式支持以下功能:
mapper接口方法参数mock
随机参数
默认参数
自定义参数
mapper接口/方法跳转XML文件
XML文件跳转mapper接口/方法
基于mock参数将mapper接口方法的xml转换成真实SQL
按照文件/项目维度扫描XML文件,并生成对应的真实SQL语句,并进行规约/索引相关校验
1. 非mybatis模式
将mybatis mode的勾选框关闭即可使用非mybatis模式,然后在「statement」Tab左栏手写SQL即可。
![79bfceeb558919ac9f6584fb03917080.png](https://img-blog.csdnimg.cn/img_convert/79bfceeb558919ac9f6584fb03917080.png)
2. mybatis模式
将mybatis mode的勾选框选中即可使用mybatis模式,mybatis模式主要添加了mapper接口方法参数mock、文件跳转及mybatis文件扫描的功能。
在mapper接口或XML文件中点击「sql」图标,即可生成mapper方法参数随机值,如果对生成的随机不满意或不满足条件,可以手动修改进行自定义。
然后点击「statement」Tab即可使用该参数将mybatis的xml实现转换成真实的SQL语句。
![36da7fbe462e7511561218d3714d00e5.png](https://img-blog.csdnimg.cn/img_convert/36da7fbe462e7511561218d3714d00e5.png)
2. mybatis sql扫描
支持文件和项目两个维度扫描。
文件维度扫描
点击或者namespace对应的mapper接口旁边的「sql」图标即可完成文件维度mybatis sql的扫描
![a0933427686b6b5d0d1900cf84cc8eda.png](https://img-blog.csdnimg.cn/img_convert/a0933427686b6b5d0d1900cf84cc8eda.png)
项目维度
点击「mybatis sql scan」即可进行项目维度mybatis sql的扫描
![83b2dea9cc3901c980a258566e04666f.png](https://img-blog.csdnimg.cn/img_convert/83b2dea9cc3901c980a258566e04666f.png)
扫描结果左侧是mybatis文件的namespace(对于mapper接口名)及其下的方法名,点击具体的方法,右侧产生其对应的SQL语句,并会对该SQL语句进行规约检查、索引检查并输出此SQL语句的的执行计划
图标说明
![2445a0d2207b41d198c8556e9128b79f.png](https://img-blog.csdnimg.cn/img_convert/2445a0d2207b41d198c8556e9128b79f.png)
项目维度扫描
all:所有语句
compliance with spec:符合SQL规约要求的SQL语句
does not meet spec:不符合SQL规约的要求的SQL语句
full table scan:存在全表扫描的SQL语句
error:存在错误的SQL语句,可能是SQL编写错误,参数错误,数据库连接错误等
3. SQL语句
1. 语法校验&规约检查
对于「非mybatis模式」需要左栏编写SQL语句,「mybatis」模式则需要在mapper接口或XML文件中点击「sql」图标生成SQL,右栏自动进行语法校验和规规约校验
1. SQL语法校验
![fdb0f6ff73f20a8737ea9c15cd1fc229.png](https://img-blog.csdnimg.cn/img_convert/fdb0f6ff73f20a8737ea9c15cd1fc229.png)
2. 规约校验
![712849e1c36c4459db0d47097a55cce6.png](https://img-blog.csdnimg.cn/img_convert/712849e1c36c4459db0d47097a55cce6.png)
2. SQL执行
点击「result」tab后会自动执行「statement」Tab中的SQL语句。执行结果由3部分组成:执行信息、执行计划及执行结果。
执行信息包含: 执行的语句、执行该条语句的耗时、返回的记录数及表中记录总数
执行计划: EXPLAIN对应的结果
执行结果: 结果表格,默认只返回100条记录(只有SELECT语句有该信息)
![75accaec1661b66957285d2785bfd294.png](https://img-blog.csdnimg.cn/img_convert/75accaec1661b66957285d2785bfd294.png)
3. SQL压测
点击「stress」Tab进行压测配置,配置页面如下:
![2d3ca34add4723bb309b96a349f17b7f.png](https://img-blog.csdnimg.cn/img_convert/2d3ca34add4723bb309b96a349f17b7f.png)
配置说明
值类型由两种方式组成:
use sql directly :表示直接使用「statement」Tab中的SQL语句进行压测
configure parameters :表示对「statement」Tab中的SQL语句的条件进行参数配置。
流量模型也是由两种方式组成(与并发数有关):
increase in a constant rate :并发数按照固定速率增长,增长速率由「递增时长」指定
fixed concurrent number :直接按照指定并发数进行压测
递增时长 :指定并发数的增长速率,单位为秒
并发数 :同时执行SQL语句的线程数
压测时长 :指定压测时间,单位为分钟,因为压测的指标数据直接存在内存中,应该避免压测时间过长造成Idea OOM
配置完成后,点击「stress」按钮即可进行压测,并自动跳转到压测报告「report」Tab
压测报告
压测报告中主要包含指标:
请求成功率
TP99
TP90
最大RT
平均RT
最大TPS
平均TPS
并发数
异常数
总请求数
图表包含:
请求成功率
平均RT
TPS
![00f24c064d7f38282243bad13f16e99c.png](https://img-blog.csdnimg.cn/img_convert/00f24c064d7f38282243bad13f16e99c.png)
4. SQL表
点击「table」Tab时会对「statement」Tab中的SQL语句进行解析,提取出表名称,然后每个表作为一个Tab。如以下语句:
SELECT
state
FROM
CITY
WHERE
country_name IN (
SELECT
name
FROM
COUNTRY
WHERE
id IN (1, 2, 3)
)
SQL语句中包含了两个表:CITY和COUNTRY,所以会产生两个Tab,如下图所示:
![fc0542f2ee99ef4000fc07cddfa5726a.png](https://img-blog.csdnimg.cn/img_convert/fc0542f2ee99ef4000fc07cddfa5726a.png)
1. 字段
左栏显示表的字段信息:字段名称、类型、是否可为NULL、默认值、索引、注释说明等信息
右栏显示对表进行建表规约检查的结果:如表名、字段名是否包含大写字母或特殊字符等检查
![a2bc991953c5619eaf8b07b17a0ad199.png](https://img-blog.csdnimg.cn/img_convert/a2bc991953c5619eaf8b07b17a0ad199.png)
2. 索引
左栏显示表的索引信息
右栏显示对索引进行规约检查的结果
![d1290278d6d68be39ef74c086d80b83d.png](https://img-blog.csdnimg.cn/img_convert/d1290278d6d68be39ef74c086d80b83d.png)
3. 数据mock
mock表数据,支持批量数据mock,左栏进行mock数据类型配置,右栏显示mock结果
mock规则
左栏表单中「Mock Type」和「Mock Value」进行mock配置。初始化时,已经按照字段类型设置了默认的配置,可以按照需求进行修改。支持多种mock数据规则:
random:随机值
string
name:姓名
datetime:形如:2023-01-01 00:00:00
integer
decimal
date:形如2023-01-01
timestamp
time:形如18:00:00
year:形如2023
city
url
email
ip
university
phone
lexicon:自定义词库
database:数据库,需要填写table.field
increment:递增
fixed:固定值
regex:正则
none:不进行mock,生成insert语句时不包含此字段
词库创建
点击「lexicon」按钮,即可进行词库的创建
![7458426eee523376aed327411aec5488.png](https://img-blog.csdnimg.cn/img_convert/7458426eee523376aed327411aec5488.png)
mock数据预览
配置好mock配置后,可以点击「preview」按钮进行mock数据的预览,默认会生成50条数据
![aad81c0c7203a5683f46cd60a9f7be42.png](https://img-blog.csdnimg.cn/img_convert/aad81c0c7203a5683f46cd60a9f7be42.png)
mock数据
预览数据符合要求后,点击「mock」按钮完成数据的插入,默认插入100条数据,通过修改「Mock Rows」的值指定mock记录数,经测试,插入10w条数据花费时间在10秒内,所以可以进行大批量数据mock。
![13727711b8df29e57d28d1602fc6cb63.png](https://img-blog.csdnimg.cn/img_convert/13727711b8df29e57d28d1602fc6cb63.png)
mock数据清理
mock数据完成后,会存储主键id的范围(持久化存储到本地文件),在对SQL语句进行压测完成后,可以进行清理,避免污染日常真实的测试数据。点击「Clean」按钮即可完成清理工作
![d83cb2d7b3102c0482ade3238f4aa7e2.png](https://img-blog.csdnimg.cn/img_convert/d83cb2d7b3102c0482ade3238f4aa7e2.png)
4 配置
相关配置:Preferences(Settings) > Tools > Mybatis Sql Viewer
![53b7186d7ef44ca60805624fd969d9c6.png](https://img-blog.csdnimg.cn/img_convert/53b7186d7ef44ca60805624fd969d9c6.png)
5 参考
在实现过程中参考了许多非常优秀的项目,拷贝了很多代码,特此感谢。
JDBC压测_性能测试 PTS-阿里云帮助中心
SQL Father - 模拟数据生成器(后端)
GitHub - q258523454/Java-Mybatis-SQL-Scanner: Java Mybatis SQL Scanner
程序员顺仔:动手撸一个SQL规范检查工具
pojo2json
mybatis-3
mybatis-sql-viewer开源地址:
https://github.com/linyimin0812/mybatis-sql-viewer
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)