當咱們在寫 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/#/