Mybatis sql 如何進行全自動補全 檢測sql的正確性 提升開發效率

葛俊發表於2018-11-12

當我們在寫 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是否寫錯 地址是: github.com/gejun123456…

識別trim標籤

識別trim標籤.gif

識別set標籤

識別set.gif

識別where標籤

識別include和where.gif

sql是否正確檢測

檢測sql是否正確.gif

不過該外掛是收費的,一個月3元 一年29 歡迎各位免費試用 brucege.com

當然外掛還有很多其他的功能 可以看外掛的文件 gejun123456.github.io/MyBatisCode…

相關文章