美文网首页服务端开发实战
Mybatis sql 如何进行全自动补全 检测sql的正确性

Mybatis sql 如何进行全自动补全 检测sql的正确性

作者: 葛俊_0f97 | 来源:发表于2018-11-10 17:23 被阅读508次

当我们在写 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/#/

相关文章

  • Mybatis sql 如何进行全自动补全 检测sql的正确性

    当我们在写 mybatis的sql时 由于没有sql自动补全,写sql花时间比较多 并且很容易写错只能通过写tes...

  • mybatis和hibernate区别

    mybatis是半自动的,hibernate是全自动的,就是说mybatis可以配置sql语句,对于sql调优来说...

  • 动态sql

    一、动态sql mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 if...

  • MyBatis学习:动态sql

    1.动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通...

  • mybatis动态sql

    一 动态sql 1.1 什么是动态sql? mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对...

  • J2EE进阶学习——Mybatis(五):动态sql

    1.什么是动态sql mybatis核心对sql语句进行灵活操作,通过表达式进行推断,对sql进行灵活拼接、组装。...

  • MyBatis动态sql

    动态sql就是可以对sql语句进行灵活的封装,拼接。通过mybatis语法的判断可以实现动态sql。 1 if标签...

  • SQL语句

    SQL基础应用 SQL语句自动补全 SQL的介绍 SQL-92标准SQL-99标准 image SQL常用分类 表...

  • Mybatis如何防止SQL注入

    Mybatis如何防止SQL注入 什么是SQL注入 sql注入是一种代码注入技术,将恶意的sql插入到被执行的字段...

  • SQL智能代码补全引擎【sql-code-intelligenc

    sql-code-intelligence 支持标准的Spark SQL补全,也支持MLSQL语法补全。 其基本交...

网友评论

    本文标题:Mybatis sql 如何进行全自动补全 检测sql的正确性

    本文链接:https://www.haomeiwen.com/subject/pmkgtqtx.html