Idea Mybatis 插件:提高 CRUD 效率
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?是否都符合开发规范?

按照这种开发模式,需要重启好多次应用,对于每次启动都需要几分钟的应用来说开发体验简直就是灾难。基于上述的问题,开发了 mybatis-sql-viewer 插件,基于此插件可以实现以下能力而不需要启动应用:

基于此插件以上的问题在编码阶段即可解决:
SQL 的编写好麻烦,写错了 SQL 字段或者表名称,修改完需要重启 --> 语法校验
SQL 编写好后进行测试时,造数据麻烦,特别是存在表关联的情况,数据内容不真实,容易超出字段长度报错 --> 多种数据 mock 方式,自动关联
SQL 好不容易跑起来了,又会有以下的疑问:
符不符合 SQL 开发规范? --> SQL 规范检查
是否能命中索引,可能命中哪个索引? --> SQL 索引检查 &SQL 执行计划
日常环境数据量太少,如何模拟 SQL 在生产环境下运行的真实情况? --> 支持大批量数据 mock
性能怎么样,最大 TPS 可以达到多少?数量大时是否会存在慢 SQL? --> SQL 语句压测,结果一目了然
基于此插件可以提高 CRUD 的效率及 SQL 质量,开发流程可以转换为如下模式:

上述的规约均来自《阿里巴巴 Java 开发手册》中的 MySQL 数据库章节。
2. 安装
IDEA 中安装:
Preferences(Settings) > Plugins > Marketplace > Search"mybatis sql viewer" > Install
手动安装:
在releases页面中下载最新版本的 zip 文件
Preferences(Settings) > Plugins > ⚙️ > Install plugin from disk... -> 选择下载的文件安装
3. 使用
因为需要拉取数据库表的元数据信息、执行 SQL,所以使用前需要配置一下数据源。
因为需要拉取数据库表的元数据信息、执行 SQL,所以使用前需要配置一下数据源。
因为需要拉取数据库表的元数据信息、执行 SQL,所以使用前需要配置一下数据源。
支持多数据源配置,点击「datasource」按钮即可完成数据源的创建、选择、删除、测试。

1. 模式
此插件有两种模式:mybatis 模式和非 mybatis 模式。差别在于 mybatis 模式支持以下功能:
mapper 接口方法参数 mock
随机参数
默认参数
自定义参数
mapper 接口/方法跳转 XML 文件
XML 文件跳转 mapper 接口/方法
基于 mock 参数将 mapper 接口方法的 xml 转换成真实 SQL
按照文件/项目维度扫描 XML 文件,并生成对应的真实 SQL 语句,并进行规约/索引相关校验
1. 非 mybatis 模式
将 mybatis mode 的勾选框关闭即可使用非 mybatis 模式,然后在「statement」Tab 左栏手写 SQL 即可。

2. mybatis 模式
将 mybatis mode 的勾选框选中即可使用 mybatis 模式,mybatis 模式主要添加了 mapper 接口方法参数 mock、文件跳转及 mybatis 文件扫描的功能。
在 mapper 接口或 XML 文件中点击「sql」图标,即可生成 mapper 方法参数随机值,如果对生成的随机不满意或不满足条件,可以手动修改进行自定义。然后点击「statement」Tab 即可使用该参数将 mybatis 的 xml 实现转换成真实的 SQL 语句。

2. mybatis sql 扫描
支持文件和项目两个维度扫描。
文件维度扫描
点击<mapper namespace="xxx.xxx.xxx">或者 namespace 对应的 mapper 接口旁边的「sql」图标即可完成文件维度 mybatis sql 的扫描

项目维度
点击「mybatis sql scan」即可进行项目维度 mybatis sql 的扫描

扫描结果左侧是 mybatis 文件的 namespace(对于 mapper 接口名)及其下的方法名,点击具体的方法,右侧产生其对应的 SQL 语句,并会对该 SQL 语句进行规约检查、索引检查并输出此 SQL 语句的的执行计划
图标说明

项目维度扫描
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 语法校验

2. 规约校验

2. SQL 执行
点击「result」tab 后会自动执行「statement」Tab 中的 SQL 语句。执行结果由 3 部分组成:执行信息、执行计划及执行结果。
执行信息包含:执行的语句、执行该条语句的耗时、返回的记录数及表中记录总数
执行计划:EXPLAIN 对应的结果
执行结果:结果表格,默认只返回 100 条记录(只有 SELECT 语句有该信息)

3. SQL 压测
点击「stress」Tab 进行压测配置,配置页面如下:

配置说明
值类型由两种方式组成:
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

4. SQL 表
点击「table」Tab 时会对「statement」Tab 中的 SQL 语句进行解析,提取出表名称,然后每个表作为一个 Tab。如以下语句:
SQL 语句中包含了两个表:CITY 和 COUNTRY,所以会产生两个 Tab,如下图所示:

1. 字段
左栏显示表的字段信息:字段名称、类型、是否可为 NULL、默认值、索引、注释说明等信息
右栏显示对表进行建表规约检查的结果:如表名、字段名是否包含大写字母或特殊字符等检查

2. 索引
左栏显示表的索引信息
右栏显示对索引进行规约检查的结果

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」按钮,即可进行词库的创建

mock 数据预览
配置好 mock 配置后,可以点击「preview」按钮进行 mock 数据的预览,默认会生成 50 条数据

mock 数据
预览数据符合要求后,点击「mock」按钮完成数据的插入,默认插入 100 条数据,通过修改「Mock Rows」的值指定 mock 记录数,经测试,插入 10w 条数据花费时间在 10 秒内,所以可以进行大批量数据 mock。

mock 数据清理
mock 数据完成后,会存储主键 id 的范围(持久化存储到本地文件),在对 SQL 语句进行压测完成后,可以进行清理,避免污染日常真实的测试数据。点击「Clean」按钮即可完成清理工作

4. 配置
相关配置:Preferences(Settings) > Tools > Mybatis Sql Viewer

5. 参考
在实现过程中参考了许多非常优秀的项目,拷贝了很多代码,特此感谢。
评论