Mybatis sql 如何进行全自动补全 检测 sql 的正确性 提升开发效率

2018-11-12 09:10:40 +08:00
 gejun123456

当我们在写 mybatis 的 sql 时 由于没有 sql 自动补全,写 sql 花时间比较多 并且很容易写错 只能通过写 testcase 来看 sql 是不是写错了 一般项目中又用到了 spring,大一点的项目启动 spring 就要花点时间,测试起来也比较麻烦

如果 mybatis 有 sql 的全自动补全 并且能够自己执行 sql 就会方便很多

当我们使用 Intellij 高级版时,Intellij 高级版有一个自带的数据库, 在它的这个数据库写 sql 时可以进行全自动的补全和检测 sql 的正确性

并且 Intellij 有一个 Inject Language 的功能, 即我们可以把一种语言 注入到 一个字符串 或一个 xml 块中

因此利用 Intellij 高级版 我们可以把 sql 这种语言注入到我们写的 mybatis 的 xml 块中

这样 mybatis 的 sql 就可以提供自动补全了 (前提是我们要把数据库给配置好)

截图如下

这样的补全 其实就已经方便很多了

但如果我们的 sql 里面添加了 include set trim where foreach 这类 mybatis 自定义的标签的时候 在这些标签后面的 sql 不能进行自动补全 和识别了 由于 Intellij 不能识别这些标签 导致也不能执行 sql

以下是截图

如何解决

       SELECT <include refid="all_column"/>
        FROM comment_p_o
        <where>
            <if test="pojo.id != null"> AND id = #{pojo.id} </if>
            <if test="pojo.article_id != null"> AND article_id = #{pojo.article_id} </if>
        </where>

可以改写为

      SELECT <include refid="all_column"/>
        FROM comment_p_o
        WHERE 1=1
            <if test="pojo.id != null"> AND id = #{pojo.id} </if>
            <if test="pojo.article_id != null"> AND article_id = #{pojo.article_id} </if>

对于 set 和 trim 这种 如果有明确会更新的字段 也是可以转的 把明确要改的字段 放在最后一个 就可以避免逗号的问题 但是对于下面这种 就没办法转了

update order_info
    <set>
      <if test="orderId != null">
        order_id = #{orderId,jdbcType=VARCHAR},
      </if>
      <if test="userEmail != null">
        user_email = #{userEmail,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}

改写为

update order_info
    set 
      <if test="orderId != null">
        order_id = #{orderId,jdbcType=VARCHAR},
      </if>
      <if test="userEmail != null">
        user_email = #{userEmail,jdbcType=VARCHAR}
      </if>
    where id = #{id,jdbcType=INTEGER}

就会有问题 如果 userEmail 为空 sql 就错了

所以这个方案不是很完美 所以有下面这个方案

由于 Intellij 不支持 Mybatis 的标签,要是 Intellij 能支持这块就好了 幸运的是,有一个 Intellij 插件支持这个功能,可以正确识别 Mybatis 的标签 在这些标签后面的 sql 可以自动补全 可以识别带标签的 mybatis 的语句 是否正确 从此不用担心 sql 是否写错 地址是: https://github.com/gejun123456/MyBatisCodeHelper-Pro

识别 trim 标签

识别 set 标签

识别 where 标签

sql 是否正确检测

不过该插件是收费的,一个月 3 元 一年 29 欢迎各位免费试用 http://brucege.com

当然插件还有很多其他的功能 可以看插件的文档 https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/

6218 次点击
所在节点    Java
27 条回复
brucewuio
2018-11-12 09:20:44 +08:00
楼主 为什么不把绿色的 injection 高亮去掉 看的我有强迫症
gejun123456
2018-11-12 09:30:06 +08:00
@brucewuio #1 默认的忘了换。
gejun123456
2018-11-12 09:31:29 +08:00
话说大家都用 Intellij 自带的那个数据库么,写 sql 有补全真的很好用
hzw94
2018-11-12 09:47:55 +08:00
我一般都在 navicat 中写好 sql,跑成功后,再复制到 xml 中。

现在才知道,Intellij 能跑 sql !
wanghaocun
2018-11-12 09:49:48 +08:00
可以可以 支持支持 插件在用了 不过我还没发现 IntelliJ IDEA 的这个功能呢 等下试试
jaclla
2018-11-12 09:50:24 +08:00
一直在用~ 楼主大佬特别热心,不仅解决 bug 甚至还远程帮你写 sql !
hiveex
2018-11-12 09:51:36 +08:00
一般都是在 navicat 中跑好了拷进去
navicat 要是能连 redis 的话,那就很棒了。
az402
2018-11-12 09:56:11 +08:00
在楼主的群里,只想说楼主天天发版本更新跟不上啊。
最主要每次更新还都有新功能。(这条 9:56 发)
zzh161
2018-11-12 10:01:14 +08:00
楼主更新的很勤快啊,上次提出的功能很快就加进去了
gejun123456
2018-11-12 10:14:53 +08:00
@hzw94 #4 哈哈,看来可以写个 Intellij 高级版的操作数据库的教程,我以前也是用 navicat 的,自从发现了这个 就没有用其他的了。Intellij 高级版中的这个数据库 和 datagrip 基本一致,sql 补全和检测语法很方便我这种手残党。 每次写个 sql 出错了检查半天实在太麻烦了。
MessiahJK
2018-11-12 10:15:57 +08:00
MyBatisCodeHelper 这个插件超好用,让 Mybatis 用法变得超级简单
monsterj
2018-11-12 10:59:17 +08:00
大佬,涨知识了
lol3721987
2018-11-12 11:00:05 +08:00
由于项目原因,这插件一直在用,挺顺手的,提升了开发速度。。关键是作者高产似(______)。
bxb100
2018-11-12 11:47:37 +08:00
插件现在兼容 IDEA 自带的数据库了? [鼓掌]
gejun123456
2018-11-12 11:49:00 +08:00
@bxb100 #14 yeah 可以从 IDEA 自带的数据库来生成 crud 代码哈
Foam151
2018-11-12 14:08:53 +08:00
Intellij 自带的那个数据库,写 sql 有补全好像有的是时候不灵啊
sl450282169
2018-11-12 14:10:03 +08:00
因为项目结构与多数据库的关系 之前一直是在 datagrip 里边写好 sql 复制到 xml 文件里边.后来这个插件有了语句检测之后,一些小语句就直接放在 idea 里边写了.不过因为 idea 神一般的数据库切换和执行方式,长 sql 还是在 datagrip 里边.
yang2yang
2018-11-12 14:22:57 +08:00
支持一下,又涨知识了
slLiaNg
2018-11-12 16:33:17 +08:00
一直用,开发起来节省不少时间,超级好用
benzzz
2018-11-12 16:44:13 +08:00
打开了新世界的大门

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/506860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX