百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

自己动手写一款 IDEA Mybatis 插件:大大提高 CRUD 效率

bigegpt 2024-08-21 12:03 2 浏览

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

来源|juejin.cn/post/7246365103783673911

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...