写点什么

Idea Mybatis 插件:提高 CRUD 效率

作者:林贻民
  • 2023-06-21
    浙江
  • 本文字数:3546 字

    阅读完需:约 12 分钟

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 部分组成:执行信息、执行计划及执行结果。


  1. 执行信息包含:执行的语句、执行该条语句的耗时、返回的记录数及表中记录总数

  2. 执行计划:EXPLAIN 对应的结果

  3. 执行结果:结果表格,默认只返回 100 条记录(只有 SELECT 语句有该信息)


3. SQL 压测

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



  • 配置说明


  1. 值类型由两种方式组成:

  2. use sql directly:表示直接使用「statement」Tab 中的 SQL 语句进行压测

  3. configure parameters:表示对「statement」Tab 中的 SQL 语句的条件进行参数配置。

  4. 流量模型也是由两种方式组成(与并发数有关):

  5. increase in a constant rate:并发数按照固定速率增长,增长速率由「递增时长」指定

  6. fixed concurrent number:直接按照指定并发数进行压测

  7. 递增时长:指定并发数的增长速率,单位为秒

  8. 并发数:同时执行 SQL 语句的线程数

  9. 压测时长:指定压测时间,单位为分钟,因为压测的指标数据直接存在内存中,应该避免压测时间过长造成 Idea OOM


配置完成后,点击「stress」按钮即可进行压测,并自动跳转到压测报告「report」Tab


  • 压测报告


压测报告中主要包含指标:


  • 请求成功率

  • TP99

  • TP90

  • 最大 RT

  • 平均 RT

  • 最大 TPS

  • 平均 TPS

  • 并发数

  • 异常数

  • 总请求数


图表包含:


  • 请求成功率

  • 平均 RT

  • TPS


4. SQL 表

点击「table」Tab 时会对「statement」Tab 中的 SQL 语句进行解析,提取出表名称,然后每个表作为一个 Tab。如以下语句:


SELECT    stateFROM    CITYWHERE    country_name IN (        SELECT            name        FROM            COUNTRY        WHERE            id IN (1, 2, 3)    )
复制代码


SQL 语句中包含了两个表:CITY 和 COUNTRY,所以会产生两个 Tab,如下图所示:


1. 字段

  1. 左栏显示表的字段信息:字段名称、类型、是否可为 NULL、默认值、索引、注释说明等信息

  2. 右栏显示对表进行建表规约检查的结果:如表名、字段名是否包含大写字母或特殊字符等检查


2. 索引

  1. 左栏显示表的索引信息

  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. 参考

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


  1. JDBC压测_性能测试 PTS-阿里云帮助中心

  2. SQL Father - 模拟数据生成器(后端)

  3. GitHub - q258523454/Java-Mybatis-SQL-Scanner: Java Mybatis SQL Scanner

  4. 程序员顺仔:动手撸一个SQL规范检查工具

  5. pojo2json

  6. mybatis-3

用户头像

林贻民

关注

还未添加个人签名 2018-08-07 加入

还未添加个人简介

评论

发布
暂无评论
Idea Mybatis插件:提高CRUD效率_MySQL_林贻民_InfoQ写作社区