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/#/

6466 次点击
所在节点    Java
27 条回复
TommyLemon
2018-11-12 20:06:37 +08:00
skyFuture
2018-11-12 20:12:38 +08:00
赞一个~~
pengbin790000
2018-11-13 08:51:55 +08:00
最近刚开始使用,有付费免费,不过免费的功能就很实用了,付费也不贵,最重要的是,更新很勤快,功能也在完善,最近新添加了 swagger 注解
TorkyC
2018-11-13 08:54:56 +08:00
留着先
Accat1024
2018-11-13 08:56:51 +08:00
是我需要的,感谢。
luckyqiang
2018-11-15 11:22:16 +08:00
学习了
gejun123456
2019-03-14 15:44:10 +08:00
@Foam151 #16 IDEA 要配置下数据库,配置数据库的时候要一定要把数据库名填上。

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

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

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

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

© 2021 V2EX