当我们在写 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 自动补全和检测

- 执行 sql

这样的补全 其实就已经方便很多了
但如果我们的 sql 里面添加了 include set trim where foreach 这类 mybatis 自定义的标签的时候 在这些标签后面的 sql 不能进行自动补全 和识别了 由于 Intellij 不能识别这些标签 导致也不能执行 sql
以下是截图
- 无法识别 mybatis 的标签 点到标签后的列 无法补全和跳转

如何解决
- 避免使用 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 标签

识别 set 标签

识别 where 标签

sql 是否正确检测

不过该插件是收费的,一个月 3 元 一年 29 欢迎各位免费试用 http://brucege.com
当然插件还有很多其他的功能 可以看插件的文档 https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/