开发IDEA插件记录
之前一直在使用一款插件叫 mybatis log plugin,它里面的 sql log 参数补全这个功能我比较喜欢,之前低版本好像并没有进行收费,但高版本之后它开始收费了。于是我打算自己开发一个类似的功能插件,取名叫 mybatis log analysis , 1.0.0版本的话首先会完成sql log 解析并自动参数补全,sql美化等简单功能。
为什么要做这个插件
用 MyBatis 写业务的人应该都有体会:控制台打印出来的 SQL 是带 ? 占位符的预编译语句,参数单独打在另一行。排查问题时想把这条 SQL 拿到数据库客户端里直接执行,就得手工把参数一个个填回去——参数一多,这个过程既繁琐又容易填错位置。参数补全类插件解决的就是这件小而高频的事,所以当常用的那款开始收费后,我第一反应不是找替代品,而是想着这个功能本身并不神秘,不如自己写一个,顺便把 IDEA 插件开发这条路摸一遍。
插件的功能规划
1.0.0 版本先把最核心、最常用的部分做出来:
-
sql log 解析并自动参数补全;
-
sql 美化(格式化输出,方便阅读长 SQL)。
之后待时间充裕之后将会把其他的使用功能也开发出来,如xml java 链接跳转,一键生成 controller,service,entity,mapper,xml等功能点。
目前已经开发完成1.0.0版本 并提交到了 IDEA PLUGIN 库中。
参数补全的原理
这个功能的原理并不复杂。MyBatis 在日志级别开到 DEBUG 时,会把一次查询拆成两行输出:
==> Preparing: select * from user where id = ? and status = ?
==> Parameters: 1024(Long), 1(Integer)
Preparing 行是带占位符的预编译 SQL,Parameters 行是按顺序排列的参数值,括号里附带了参数的 Java 类型。插件要做的事就是把两行配对起来:
-
从日志文本里定位相邻的
Preparing和Parameters行; -
按逗号切分参数列表,根据括号里的类型决定拼接方式——字符串、日期类型需要加引号,数字类型直接替换;
-
按顺序把处理后的参数依次填回 SQL 中的
?,得到一条可以直接执行的完整语句; -
最后走一遍 SQL 格式化,输出美化后的结果。
核心逻辑就是文本解析加字符串替换,真正花时间的反而是插件与 IDE 的集成部分:怎么注册一个工具窗口、怎么监听控制台输出、怎么把动作挂到菜单上,这些都要跟 IntelliJ 平台的 API 打交道。
开发过程中的感受
在开发插件的时候,简单的功能实现起来很简单, 但想要实现比较复杂的功能就必须要对IDEA 提供的API 等方法有个比较深层次的了解,可是我在官方插件文档上并没有找到比较完善的API 文档。只有一些官方给出的demo代码。这样的话就不得不花点时间去看demo代码并阅读理解才行。感觉会将是一个不太友好的学习曲线。
这一点和平时做业务开发很不一样。业务框架的文档通常是「查 API、看示例、直接用」,而 IntelliJ 平台更多要靠三种方式摸索:翻官方 demo 仓库、直接读平台源码、以及去看其他开源插件是怎么实现类似功能的。遇到不知道该用哪个扩展点的时候,找一个功能相近的开源插件对照它的 plugin.xml 和入口类,往往比翻文档更快。
贴上已经开发出来的插件地址:https://plugins.jetbrains.com/plugin/14958-mybatis-log-analysis
踩坑与注意
- 参数替换不能简单地做全局字符串替换。参数值本身可能包含逗号或问号,按逗号切分
Parameters行、按顺序逐个替换?,比一次性正则替换稳妥得多。 - 类型信息要用起来。
Parameters行括号里的类型决定了要不要加引号,忽略它拼出来的 SQL 在数据库里多半执行不了。 - 提交到 JetBrains 插件市场需要人工审核,插件的描述、图标、兼容的 IDE 版本范围都要在配置里写清楚,提前准备好这些能少来回折腾几次。
插件开发文档不够用的时候,IntelliJ Platform SDK 文档配合开源插件的源码对照着看,是目前体验最好的学习路径。
小结
这个插件本身的逻辑很小,价值在于把一件高频的手工活自动化掉了。对我而言更大的收获是完整走了一遍 IDEA 插件从开发到上架的流程:功能实现只占一小部分,理解平台的扩展机制、适应靠读源码和 demo 学习的方式,才是这条路上真正的门槛。后续版本会继续把 xml 与 java 之间的跳转、代码一键生成这些功能补上。
评论 / COMMENTS