當我們在寫 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是否寫錯 地址是: github.com/gejun123456…
識別trim標籤
識別set標籤
識別where標籤
sql是否正確檢測
不過該外掛是收費的,一個月3元 一年29 歡迎各位免費試用 brucege.com
當然外掛還有很多其他的功能 可以看外掛的文件 gejun123456.github.io/MyBatisCode…