当咱们在写 mybatis的sql时 因为没有sql自动补全,写sql花时间比较多 而且很容易写错 只能经过写testcase来看 sql是否是写错了 通常项目中又用到了spring,大一点的项目启动spring就要花点时间,测试起来也比较麻烦git
若是mybatis有sql的全自动补全 而且可以本身执行sql就会方便不少github
当咱们使用Intellij高级版时,Intellij高级版有一个自带的数据库, 在它的这个数据库写sql 时能够进行全自动的补全和检测sql的正确性spring
而且Intellij 有一个 Inject Language的功能, 即咱们能够把一种语言 注入到 一个字符串 或一个 xml块中sql
所以利用Intellij高级版 咱们能够把 sql这种语言注入到咱们写的 mybatis的xml块中数据库
这样mybatis的sql 就能够提供自动补全了 (前提是咱们要把数据库给配置好)mybatis
截图以下测试
- sql自动补全和检测
- 执行sql
这样的补全 其实就已经方便不少了插件
但若是咱们的sql里面添加了 include set trim where foreach这类mybatis自定义的标签的时候 在这些标签后面的sql不能进行自动补全 和识别了 因为Intellij不能识别这些标签 致使也不能执行sql3d
如下是截图code
- 没法识别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/#/