|
| 1 | +[](https://plugins.jetbrains.com/plugin/18713-mybatis-sql-viewer) |
| 2 | +[](https://plugins.jetbrains.com/plugin/18713-mybatis-sql-viewer) |
| 3 | +[](https://sonarcloud.io/project/overview?id=linyimin-bupt_mybatis-sql-viewer) |
| 4 | + |
1 | 5 | [中文](README.md) | |
2 | 6 | [ENGLISH](README_EN.md) |
3 | 7 |
|
4 | | -## 简介 |
| 8 | +# 简介 |
| 9 | + |
| 10 | +虽然写了很久的CRUD,但是依旧觉得写好CRUD是一件非常难且麻烦的事情,以下的情况在开发过程中应该都遇到过: |
| 11 | + |
| 12 | +- SQL测试好麻烦,写错了SQL字段或者表名称,修改完要重启(几分钟过去了) |
| 13 | +- 造数据好麻烦,特别是还存在表关联的情况,数据内容不真实,还容易超出字段长度,让人抓狂 |
| 14 | +- SQL好不容易能跑了,又会有以下的疑问 |
| 15 | + - 符不符合SQL开发规范? |
| 16 | + - 是否能命中索引? |
| 17 | + - 性能怎么样,是否会存在慢SQL? |
| 18 | + - 日常环境数据太少,如何模拟SQL在线上运行的真实情况? |
| 19 | + |
| 20 | +对于使用Mybatis的开发者还会存在这些问题: |
| 21 | + |
| 22 | +- Mapper接口方法和XML标签不对应,修改完要重启(又几分钟过去了) |
| 23 | +- XML中多写了一个`,`,又没有错误提示,接口测试调用时才发现,修改完又又要重启(好多个几分钟过去了) |
| 24 | +- 这个Mapper接口对应的是哪个XML文件?找找十几秒过去了 |
| 25 | +- 这个XMl文件对应的是哪个Mapper接口?找找十几秒又过去了 |
| 26 | +- 这个项目中有多少个XML文件?里面是否存在慢SQL?是否都符合开发规范? |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +按照这种开发模式,需要重启好多次应用,对于每次启动都需要几分钟应用来说开发体验简直就是灾难。基于上述的问题,开发了mybatis-sql-viewer插件,基于此插件可以实现以下能力而不需要启动应用: |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +基于此插件可以提高CRUD的效率及SQL质量,开发流程可以转换为如下模式: |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +上述的规约均来自《阿里巴巴Java开发手册》中的MySQL数据库章节。 |
| 39 | + |
| 40 | +# 安装 |
| 41 | + |
| 42 | +`IntelliJ IDEA` > `Preferences` > `Plugins` > `Marketplace` > `Search for "mybatis sql viewer"` > `Install Plugin` > `Restart IntelliJ IDEA` |
| 43 | + |
| 44 | +# 使用 |
| 45 | + |
| 46 | +此插件有两种模式:mybatis模式和非mybatis模式。差别在于mybatis模式支持以下功能: |
| 47 | + |
| 48 | +- mapper接口方法参数mock |
| 49 | + - 随机参数 |
| 50 | + - 默认参数 |
| 51 | + - 自定义参数 |
| 52 | +- mapper接口/方法跳转XML文件 |
| 53 | +- XML文件跳转mapper接口/方法 |
| 54 | +- 基于mock参数将mapper接口方法的xml转换成真实SQL |
| 55 | +- 按照文件/项目维度扫描XML文件,并生成对应的真实SQL语句,并进行规约/索引相关校验 |
| 56 | + |
| 57 | +因为需要拉取数据库表的元数据信息、执行SQL,所以使用前需要配置一下数据源。支持多数据源配置,点击「datasource」按钮即可完成数据源的创建、选择、删除、测试。 |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +## 非mybatis模式 |
| 62 | + |
| 63 | +将`mybatis mode`的勾选框关闭即可使用`非mybatis模式`,然后在「statement」Tab左栏手写SQL即可。 |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +## mybatis模式 |
| 68 | + |
| 69 | +将`mybatis mode`的勾选框选中即可使用`mybatis模式`,`mybatis模式`主要添加了mapper接口方法参数mock、文件跳转及mybatis文件扫描的功能。 |
| 70 | + |
| 71 | +在mapper接口或XML文件中点击「sql」图标,即可生成mapper方法参数随机值,如果对生成的随机不满意或不满足条件,可以手动修改进行自定义。然后点击「statement」Tab即可使用该参数将mybatis的xml实现转换成真实的SQL语句。 |
| 72 | + |
| 73 | + |
| 74 | + |
| 75 | +### mybatis sql扫描 |
| 76 | + |
| 77 | +支持文件和项目两个维度扫描。 |
| 78 | + |
| 79 | +1. 文件维度扫描 |
| 80 | + |
| 81 | +点击`<mapper namespace="xxx.xxx.xxx">`或者`namespace`对应的mapper接口旁边的「sql」图标即可完成文件维度mybatis sql的扫描 |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +2. 项目维度 |
| 86 | + |
| 87 | +点击「mybatis sql scan」即可进行项目维度mybatis sql的扫描 |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | +扫描结果左侧是mybatis文件的namespace(对于mapper接口名)及其下的方法名,点击具体的方法,右侧产生其对应的SQL语句,并会对该SQL语句进行规约检查、索引检查并输出此SQL语句的的执行计划 |
| 92 | + |
| 93 | +**图标说明** |
| 94 | + |
| 95 | +:表示SQL规约检查和索引检查均符合要求的SQL语句 |
| 96 | + |
| 97 | +:表示SQL规约检查不符合要求的SQL语句 |
| 98 | + |
| 99 | +:表示索引检查不符合要求的SQL语句,可能存在全表扫描(含索引的全表扫描) |
| 100 | + |
| 101 | +:表示生成的SQL语句存在问题:可能是SQL编写错误,参数错误,数据库连接错误等 |
| 102 | + |
| 103 | +**可通过单选框选择对应的条件进行过滤** |
| 104 | + |
| 105 | +- all:所有语句 |
| 106 | +- compliance with spec:符合SQL规约要求的SQL语句 |
| 107 | +- does not meet spec:不符合SQL规约的要求的SQL语句 |
| 108 | +- full table scan:存在全表扫描的SQL语句 |
| 109 | +- error:存在错误的SQL语句,可能是SQL编写错误,参数错误,数据库连接错误等 |
| 110 | + |
| 111 | + |
| 112 | +## 「sql」Tab |
| 113 | + |
| 114 | +### 1. 「statement」Tab |
| 115 | + |
| 116 | +对于「非mybatis模式」需要左栏编写SQL语句,「mybatis」模式则需要在mapper接口或XML文件中点击「sql」图标生成SQL,右栏自动进行语法校验和规规约校验 |
| 117 | + |
| 118 | +1. SQL语法校验 |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | +2. 规约校验 |
| 123 | + |
| 124 | + |
| 125 | + |
| 126 | +### 2. 「result」Tab |
| 127 | + |
| 128 | +点击「result」tab后会自动执行「statement」Tab中的SQL语句。执行结果由3部分组成:执行信息、执行计划及执行结果。 |
| 129 | + |
| 130 | +1. 执行信息包含:执行的语句、执行该条语句的耗时、返回的记录数及表中记录总数 |
| 131 | +2. 执行计划:EXPLAIN对应的结果 |
| 132 | +3. 执行结果:结果表格,默认只返回100条记录(只有SELECT语句有该信息) |
| 133 | + |
| 134 | + |
| 135 | + |
| 136 | +### 3. 「stress」Tab |
| 137 | + |
| 138 | +点击「stress」Tab进行压测配置,配置页面如下: |
| 139 | + |
| 140 | + |
| 141 | + |
| 142 | +**配置说明** |
| 143 | + |
| 144 | +1. 值类型由两种方式组成: |
| 145 | + 1. `use sql directly`:表示直接使用「statement」Tab中的SQL语句进行压测 |
| 146 | + 2. `configure parameters`:表示对「statement」Tab中的SQL语句的条件进行参数配置。 |
| 147 | +2. 流量模型也是由两种方式组成(与并发数有关): |
| 148 | + 1. `increase in a constant rate`:并发数按照固定速率增长,增长速率由「递增时长」指定 |
| 149 | + 2. `fixed concurrent number`:直接按照指定并发数进行压测 |
| 150 | +3. 递增时长:指定并发数的增长速率,单位为秒 |
| 151 | +4. 并发数:同时执行SQL语句的线程数 |
| 152 | +5. 压测时长:指定压测时间,单位为分钟,**因为压测的指标数据直接存在内存中,应该避免压测时间过长造成Idea OOM** |
| 153 | + |
| 154 | +配置完成后,点击「stress」按钮即可进行压测,并自动跳转到压测报告「report」Tab |
| 155 | + |
| 156 | +**压测报告** |
| 157 | + |
| 158 | +压测报告中主要包含指标: |
| 159 | + |
| 160 | +- 请求成功率 |
| 161 | +- TP99 |
| 162 | +- TP90 |
| 163 | +- 最大RT |
| 164 | +- 平均RT |
| 165 | +- 最大TPS |
| 166 | +- 平均TPS |
| 167 | +- 并发数 |
| 168 | +- 异常数 |
| 169 | +- 总请求数 |
| 170 | + |
| 171 | +图表包含: |
| 172 | +- 请求成功率 |
| 173 | +- 平均RT |
| 174 | +- TPS |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | +## 「table」Tab |
| 179 | + |
| 180 | +点击「table」Tab时会对「statement」Tab中的SQL语句进行解析,提取出表名称,然后每个表作为一个Tab。如以下语句: |
| 181 | + |
| 182 | +```mysql |
| 183 | +SELECT |
| 184 | + state |
| 185 | +FROM |
| 186 | + CITY |
| 187 | +WHERE |
| 188 | + country_name IN ( |
| 189 | + SELECT |
| 190 | + name |
| 191 | + FROM |
| 192 | + COUNTRY |
| 193 | + WHERE |
| 194 | + id IN (1, 2, 3) |
| 195 | + ) |
| 196 | +``` |
| 197 | + |
| 198 | +SQL语句中包含了两个表:`CITY`和`COUNTRY`,所以会产生两个Tab,如下图所示: |
| 199 | + |
| 200 | + |
| 201 | + |
| 202 | +### 1. 「schema」Tab |
| 203 | + |
| 204 | +1. 左栏显示表的字段信息:字段名称、类型、是否可为NULL、默认值、索引、注释说明等信息 |
| 205 | +2. 右栏显示对表进行建表规约检查的结果:如表名、字段名是否包含大写字母或特殊字符等检查 |
| 206 | + |
| 207 | + |
| 208 | + |
| 209 | +### 2. 「index」Tab |
| 210 | + |
| 211 | +1. 左栏显示表的索引信息 |
| 212 | +2. 右栏显示对索引进行规约检查的结果 |
| 213 | + |
| 214 | + |
| 215 | + |
| 216 | +### 3. 「mock」Tab |
| 217 | + |
| 218 | +mock表数据,支持批量数据mock,左栏进行mock数据类型配置,右栏显示mock结果 |
| 219 | + |
| 220 | +**mock规则** |
| 221 | + |
| 222 | +左栏表单中「Mock Type」和「Mock Value」进行mock配置。初始化时,已经按照字段类型设置了默认的配置,可以按照需求进行修改。支持多种mock数据规则: |
| 223 | + |
| 224 | +- random:随机值 |
| 225 | + - string |
| 226 | + - name:姓名 |
| 227 | + - datetime:形如:2023-01-01 00:00:00 |
| 228 | + - integer |
| 229 | + - decimal |
| 230 | + - date:形如2023-01-01 |
| 231 | + - timestamp |
| 232 | + - time:形如18:00:00 |
| 233 | + - year:形如2023 |
| 234 | + - city |
| 235 | + - url |
| 236 | + - email |
| 237 | + - ip |
| 238 | + - university |
| 239 | + - phone |
| 240 | +- lexicon:自定义词库 |
| 241 | +- database:数据库,需要填写`table.field` |
| 242 | +- increment:递增 |
| 243 | +- fixed:固定值 |
| 244 | +- regex:正则 |
| 245 | +- none:不进行mock,生成insert语句时包含此字段 |
| 246 | + |
| 247 | + |
| 248 | +**词库创建** |
| 249 | + |
| 250 | +点击「lexicon」按钮,即可进行词库的创建 |
| 251 | + |
| 252 | + |
| 253 | + |
| 254 | +**mock数据预览** |
| 255 | + |
| 256 | +配置好mock配置后,可以点击「preview」按钮进行mock数据的预览,默认会生成50条数据 |
| 257 | + |
| 258 | + |
| 259 | + |
| 260 | +**mock数据** |
5 | 261 |
|
6 | | -Mybatis-Sql-Viewer是一款增强idea对mybatis支持的插件,主要功能如下:<br/> |
7 | | -<ul> |
8 | | -<li>快速从代码跳转到mapper及从mapper返回代码</li> |
9 | | -<li>mapper文件中的xml语句/方法转换成sql语句,支持参数mock、数据源配置、sql执行</li> |
10 | | -</ul> |
| 262 | +预览数据符合要求后,点击「mock」按钮完成数据的插入,默认插入100条数据,通过修改「Mock Rows」的值指定mock记录数,经测试,插入10w条数据花费时间在10秒内,所以可以进行大批量数据mock。 |
11 | 263 |
|
12 | | -## 安装 |
| 264 | + |
13 | 265 |
|
14 | | -`IntelliJ IDEA` > `Preferences` > `Plugins` > `Marketplace` > `Search for "mybatis sql view"` > `Install Plugin` > `Restart IntelliJ IDEA` |
| 266 | +**mock数据清理** |
15 | 267 |
|
16 | | -## 使用 |
| 268 | +mock数据完成后,会存储主键id的范围(持久化存储到本地文件),在对SQL语句进行压测完成后,可以进行清理,避免污染日常真实的测试数据。点击「Clean」按钮即可完成清理工作 |
17 | 269 |
|
18 | | - |
| 270 | + |
19 | 271 |
|
20 | | -## 注意 |
21 | 272 |
|
22 | | -由于使用了mybatis包将xml转成sql语句,会对整个项目进行编译,第一次使用时,加载会有一定耗时,请耐心等待。 |
|
0 commit comments