V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gejun123456
V2EX  ›  Java

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

  •  
  •   gejun123456 ·
    gejun123456 · 2018-11-12 09:10:40 +08:00 · 6420 次点击
    这是一个创建于 2202 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当我们在写 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 就可以提供自动补全了 (前提是我们要把数据库给配置好)

    截图如下

    • Intellij 高级版自带的 sql 自动补全和检测 Intellij 自带的 sql 的自动补全.gif
    • 执行 sql Intellij 自带的数据库执行 sql.gif

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

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

    以下是截图

    • 无法识别 mybatis 的标签 点到标签后的列 无法补全和跳转 Intellij 标签无法识别.gif

    如何解决

    • 避免使用 where set trim 等标签 带标签的 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 标签 识别 trim 标签.gif

    识别 set 标签 识别 set.gif

    识别 where 标签 识别 include 和 where.gif

    sql 是否正确检测 检测 sql 是否正确.gif

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

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

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

    现在才知道,Intellij 能跑 sql !
    wanghaocun
        5
    wanghaocun  
       2018-11-12 09:49:48 +08:00
    可以可以 支持支持 插件在用了 不过我还没发现 IntelliJ IDEA 的这个功能呢 等下试试
    jaclla
        6
    jaclla  
       2018-11-12 09:50:24 +08:00
    一直在用~ 楼主大佬特别热心,不仅解决 bug 甚至还远程帮你写 sql !
    hiveex
        7
    hiveex  
       2018-11-12 09:51:36 +08:00
    一般都是在 navicat 中跑好了拷进去
    navicat 要是能连 redis 的话,那就很棒了。
    az402
        8
    az402  
       2018-11-12 09:56:11 +08:00
    在楼主的群里,只想说楼主天天发版本更新跟不上啊。
    最主要每次更新还都有新功能。(这条 9:56 发)
    zzh161
        9
    zzh161  
       2018-11-12 10:01:14 +08:00
    楼主更新的很勤快啊,上次提出的功能很快就加进去了
    gejun123456
        10
    gejun123456  
    OP
       2018-11-12 10:14:53 +08:00
    @hzw94 #4 哈哈,看来可以写个 Intellij 高级版的操作数据库的教程,我以前也是用 navicat 的,自从发现了这个 就没有用其他的了。Intellij 高级版中的这个数据库 和 datagrip 基本一致,sql 补全和检测语法很方便我这种手残党。 每次写个 sql 出错了检查半天实在太麻烦了。
    MessiahJK
        11
    MessiahJK  
       2018-11-12 10:15:57 +08:00
    MyBatisCodeHelper 这个插件超好用,让 Mybatis 用法变得超级简单
    monsterj
        12
    monsterj  
       2018-11-12 10:59:17 +08:00
    大佬,涨知识了
    lol3721987
        13
    lol3721987  
       2018-11-12 11:00:05 +08:00
    由于项目原因,这插件一直在用,挺顺手的,提升了开发速度。。关键是作者高产似(______)。
    bxb100
        14
    bxb100  
       2018-11-12 11:47:37 +08:00
    插件现在兼容 IDEA 自带的数据库了? [鼓掌]
    gejun123456
        15
    gejun123456  
    OP
       2018-11-12 11:49:00 +08:00
    @bxb100 #14 yeah 可以从 IDEA 自带的数据库来生成 crud 代码哈
    Foam151
        16
    Foam151  
       2018-11-12 14:08:53 +08:00
    Intellij 自带的那个数据库,写 sql 有补全好像有的是时候不灵啊
    sl450282169
        17
    sl450282169  
       2018-11-12 14:10:03 +08:00
    因为项目结构与多数据库的关系 之前一直是在 datagrip 里边写好 sql 复制到 xml 文件里边.后来这个插件有了语句检测之后,一些小语句就直接放在 idea 里边写了.不过因为 idea 神一般的数据库切换和执行方式,长 sql 还是在 datagrip 里边.
    yang2yang
        18
    yang2yang  
       2018-11-12 14:22:57 +08:00
    支持一下,又涨知识了
    slLiaNg
        19
    slLiaNg  
       2018-11-12 16:33:17 +08:00
    一直用,开发起来节省不少时间,超级好用
    benzzz
        20
    benzzz  
       2018-11-12 16:44:13 +08:00 via iPhone
    打开了新世界的大门
    TommyLemon
        21
    TommyLemon  
       2018-11-12 20:06:37 +08:00
    skyFuture
        22
    skyFuture  
       2018-11-12 20:12:38 +08:00
    赞一个~~
    pengbin790000
        23
    pengbin790000  
       2018-11-13 08:51:55 +08:00
    最近刚开始使用,有付费免费,不过免费的功能就很实用了,付费也不贵,最重要的是,更新很勤快,功能也在完善,最近新添加了 swagger 注解
    TorkyC
        24
    TorkyC  
       2018-11-13 08:54:56 +08:00
    留着先
    Accat1024
        25
    Accat1024  
       2018-11-13 08:56:51 +08:00
    是我需要的,感谢。
    luckyqiang
        26
    luckyqiang  
       2018-11-15 11:22:16 +08:00
    学习了
    gejun123456
        27
    gejun123456  
    OP
       2019-03-14 15:44:10 +08:00
    @Foam151 #16 IDEA 要配置下数据库,配置数据库的时候要一定要把数据库名填上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.