⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7246365103783673911 「linyimin」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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,所以使用前需要配置一下数据源。

支持多数据源配置,点击「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扫描

支持文件和项目两个维度扫描。

  • 文件维度扫描

点击或者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。如以下语句:

SELECT
state
FROM
CITY
WHERE
country_name IN (
SELECT
name
FROM
COUNTRY
WHERE
id IN (1, 2, 3)
)

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

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

  • 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

文章目录
  1. 1. 1 简介
  2. 2. 2 安装
  3. 3. 3 使用
    1. 3.1. 1. 模式
      1. 3.1.0.1. 1. 非mybatis模式
      2. 3.1.0.2. 2. mybatis模式
  4. 3.2. 2. mybatis sql扫描
  5. 3.3. 3. SQL语句
    1. 3.3.0.1. 1. 语法校验&规约检查
    2. 3.3.0.2. 2. SQL执行
    3. 3.3.0.3. 3. SQL压测
    4. 3.3.0.4. 4. SQL表
  • 4. 4 配置
  • 5. 5 参考