當(dāng)我們?cè)趯?mybatis的sql時(shí) 由于沒有sql自動(dòng)補(bǔ)全噪奄,寫sql花時(shí)間比較多 并且很容易寫錯(cuò)
只能通過(guò)寫testcase來(lái)看 sql是不是寫錯(cuò)了 一般項(xiàng)目中又用到了spring梗醇,大一點(diǎn)的項(xiàng)目啟動(dòng)spring就要花點(diǎn)時(shí)間,測(cè)試起來(lái)也比較麻煩
如果mybatis有sql的全自動(dòng)補(bǔ)全 并且能夠自己執(zhí)行sql就會(huì)方便很多
當(dāng)我們使用Intellij高級(jí)版時(shí)保屯,Intellij高級(jí)版有一個(gè)自帶的數(shù)據(jù)庫(kù), 在它的這個(gè)數(shù)據(jù)庫(kù)寫sql
時(shí)可以進(jìn)行全自動(dòng)的補(bǔ)全和檢測(cè)sql的正確性
并且Intellij 有一個(gè) Inject Language的功能竟终, 即我們可以把一種語(yǔ)言 注入到 一個(gè)字符串 或一個(gè) xml塊中
因此利用Intellij高級(jí)版 我們可以把 sql這種語(yǔ)言注入到我們寫的 mybatis的xml塊中
這樣mybatis的sql 就可以提供自動(dòng)補(bǔ)全了 (前提是我們要把數(shù)據(jù)庫(kù)給配置好)
截圖如下
-
Intellij高級(jí)版自帶的sql自動(dòng)補(bǔ)全和檢測(cè)
Intellij自帶的sql的自動(dòng)補(bǔ)全.gif -
執(zhí)行sql
Intellij自帶的數(shù)據(jù)庫(kù)執(zhí)行sql.gif
這樣的補(bǔ)全 其實(shí)就已經(jīng)方便很多了
但如果我們的sql里面添加了 include set trim where foreach這類mybatis自定義的標(biāo)簽的時(shí)候
在這些標(biāo)簽后面的sql不能進(jìn)行自動(dòng)補(bǔ)全 和識(shí)別了 由于Intellij不能識(shí)別這些標(biāo)簽 導(dǎo)致也不能執(zhí)行sql
以下是截圖
-
無(wú)法識(shí)別mybatis的標(biāo)簽 點(diǎn)到標(biāo)簽后的列 無(wú)法補(bǔ)全和跳轉(zhuǎn)
Intellij標(biāo)簽無(wú)法識(shí)別.gif
如何解決
- 避免使用 where set trim 等標(biāo)簽 帶標(biāo)簽的sql 大部分是可以轉(zhuǎn)成不帶標(biāo)簽的
如
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>
對(duì)于 set 和 trim這種 如果有明確會(huì)更新的字段 也是可以轉(zhuǎn)的 把明確要改的字段 放在最后一個(gè) 就可以避免逗號(hào)的問題 但是對(duì)于下面這種 就沒辦法轉(zhuǎn)了
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}
就會(huì)有問題 如果 userEmail為空 sql就錯(cuò)了
所以這個(gè)方案不是很完美 所以有下面這個(gè)方案
由于Intellij 不支持 Mybatis的標(biāo)簽,要是Intellij能支持這塊就好了
幸運(yùn)的是柄粹,有一個(gè)Intellij 插件支持這個(gè)功能喘鸟,可以正確識(shí)別Mybatis的標(biāo)簽 在這些標(biāo)簽后面的sql可以自動(dòng)補(bǔ)全 可以識(shí)別帶標(biāo)簽的mybatis的語(yǔ)句 是否正確
從此不用擔(dān)心sql是否寫錯(cuò)
地址是: https://github.com/gejun123456/MyBatisCodeHelper-Pro
識(shí)別trim標(biāo)簽
識(shí)別set標(biāo)簽
識(shí)別where標(biāo)簽
sql是否正確檢測(cè)
不過(guò)該插件是收費(fèi)的,一個(gè)月3元 一年29 歡迎各位免費(fèi)試用 http://brucege.com
當(dāng)然插件還有很多其他的功能 可以看插件的文檔 https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/