【問題】
先說版本,win 11,idea 2023.1
如標(biāo)題,想去格式化mybatis中寫的sql,但是ctrl alt L 一頓處理,其中的sql沒有按照sql命令的格式去格式化,此外寫sql 無提示也無高亮
【問題示例】
未格式化前,顯然格式已經(jīng)差不多了,按理來說再格式化也就稍微調(diào)整
<select id="selectxx" resultType="java.util.HashMap">
SELECT * from (SELECT p.project_code projectCode,
p.project_name projectName,
(SELECT count(*)
FROM table_os os
where os.project_code = p.project_code
and os.del_flag = '0'
<if test="query.saleCode!='' and query.saleCode!=null ">
and os.sale_code like concat('%',#{query.saleCode},'%')
</if>
) as size
FROM table_p p
where p.del_flag='0'
<if test="query.projectType!='' and query.projectType!=null">
and p.project_type like concat('%',#{query.projectType},'%')
</if>
<if test="query.projectCode!='' and query.projectCode!=null">
and p.project_code like concat('%',#{query.projectCode},'%')
</if>
<if test="query.projectName!='' and query.projectName!=null">
and p.project_name like concat('%',#{query.projectName},'%')
</if>
) as php
where size > 0
order by size desc
</select>
但格式化的結(jié)果是這樣,顯然sql的格式不對(duì):
<select id="selectxx" resultType="java.util.HashMap">
SELECT * from (SELECT p.project_code projectCode,
p.project_name projectName,
(SELECT count(*)
FROM table_os os
where os.project_code = p.project_code
and os.del_flag = '0'
<if test="query.saleCode!='' and query.saleCode!=null ">
and os.sale_code like concat('%',#{query.saleCode},'%')
</if>
) as size
FROM table_p p
where p.del_flag='0'
<if test="query.projectType!='' and query.projectType!=null">
and p.project_type like concat('%',#{query.projectType},'%')
</if>
<if test="query.projectCode!='' and query.projectCode!=null">
and p.project_code like concat('%',#{query.projectCode},'%')
</if>
<if test="query.projectName!='' and query.projectName!=null">
and p.project_name like concat('%',#{query.projectName},'%')
</if>
) as php
where size > 0
order by size desc
</select>
【半解決】
不能叫解決,只能說解決了一半。
先百度了一下,搜出來大多數(shù)解決方案都差不多,如下
設(shè)置 → 語言方案 → sql方言 → 設(shè)為mysql(或其他 你用的數(shù)據(jù)庫)Database中配置MySQL的數(shù)據(jù)源
這兩種方法試了都不行。在思否 這里 找到了一個(gè),也就是半解決的方案,簡(jiǎn)要來說就是
- 選中sql代碼
- 右鍵 → 顯示上下文 → 注入語言或引用 → 在彈框中點(diǎn)選mysql或sql(或你的其他數(shù)據(jù)庫)(其實(shí)可以搜索,雖然沒有搜索框,但是默認(rèn)取焦點(diǎn),直接輸入就可以搜索)
- 此時(shí)sql的高亮已經(jīng)顯示成功,再次格式化,發(fā)現(xiàn)sql格式化成功,如果你的idea連接了數(shù)據(jù)庫,那么此時(shí)是可以有比如說select等關(guān)鍵字、表字段之類的聯(lián)想提示的
其他方法就是插件,見【后話】
【解決示例】
這里是思否那個(gè)的例子,只是貼出來
原代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace跟接口綁定-->
<mapper namespace="com.sunyard.monitor.dao.FlowMapper">
<select id="queryFlowNum" resultType="com.sunyard.monitor.domain.Flow">
select * from(select count(1) as flowNum from ccform_debit_all where cf_acctime > to_char(sysdate,'yyyy-MM-dd'))cross join(select count(1) as flowNumMonth from ccform_debit_all where cf_acctime > to_char(sysdate,'yyyy-MM')) cross join (select count(1) as flowNumTotal from ccform_debit_all where cf_acctime > to_char(sysdate,'yyyy'))
</select>
</mapper>
其中的sql格式化以后
select *
from (select count(1) as flowNum
from ccform_debit_all
where cf_acctime >
to_char(sysdate, 'yyyy-MM-dd'))
cross join(select count(1) as flowNumMonth
from ccform_debit_all
where cf_acctime
> to_char(sysdate, 'yyyy-MM'))
cross join (select count(1) as flowNumTotal
from ccform_debit_all
where cf_acctime
> to_char(sysdate, 'yyyy'))
【后話】
大家估計(jì)也知道為什么說是半解決了,因?yàn)樗@個(gè)辦法還是代碼塊級(jí)或者文件級(jí)別,要一個(gè)個(gè)操作,不是很方便,還是想要一個(gè)一勞永逸的。還有語言注入其實(shí)是臨時(shí)的,重啟idea就會(huì)消失,那就更雞肋了,而且只能純sql,對(duì)于像我的示例中這樣,又包含sql又包括mybatis的語法的,比如<if>
這樣的到那就隔斷了,<if>
是不會(huì)被視為sql的,那么
要么寫一個(gè)純sql要么純mybatis語法(其實(shí)這樣還合理一點(diǎn),但是這接手的二開,原來的就是混雜的),又或者手敲格式可能還更簡(jiǎn)單。
其實(shí)我還試過那個(gè),就是idea 的插件,比如 SQLFormatter 之類的,那個(gè)也可以滿足要求,但是問題比語言注入還多,缺點(diǎn)全都有而優(yōu)點(diǎn)可以忽略,還不如打開一個(gè)sql控制臺(tái)復(fù)制粘貼,所以還是放棄了。
如果有其他更好的辦法,大家可以在評(píng)論分享一下,十分歡迎
2023.11.19更
雖然不是什么大問題,但看著膈應(yīng),差點(diǎn)就重裝idea了,最后掙扎一次,幸好是解決了。
【過程】
- 想重裝idea(差點(diǎn),一上來肯定不能那么極端)
- (文件 → 管理ide設(shè)置 → 還原默認(rèn)設(shè)置)(這時(shí)候會(huì)提示備份設(shè)置,當(dāng)然也可以自己提前備份(文件 → 管理ide設(shè)置 → 導(dǎo)出設(shè)置))→ 重啟
- 再打開項(xiàng)目,配置下jdk和maven,發(fā)現(xiàn)此次高亮沒任何問題!
- 可知,不是代碼問題。而就是配置問題,但配置由前面內(nèi)容可知,都試過了,也不該有任何問題
- 嘗試插件檢查(為什么呢,因?yàn)槲蚁肫饋砦襥dea太重,有搜過相關(guān)內(nèi)容,把idea部分用不上(自認(rèn)為)的插件禁用了)
【解決】
插件檢查不再贅述,總之最后找到了問題,是XpathView + XSLT
這個(gè)插件被我禁用所導(dǎo)致的!
將其啟用,正常了,mybatis xml有了高亮、格式化也正常了、關(guān)鍵字如select、where等也有了提示,表名、字段名也有了提示(需idea配置數(shù)據(jù)源)
最后,把idea的配置再導(dǎo)入就好了,過程很煩,但此事終告一段落,開心。
放一下圖:
如果還是不行,建議全部檢查一下:文章來源:http://www.zghlxwxcb.cn/news/detail-758126.html
- 插件:
Database Tools and SQL
、XpathView + XSLT
、MyBatisCodeHelperPro
或者MyBatisX
- 設(shè)置:配置sql方言
- 數(shù)據(jù)源:配置數(shù)據(jù)庫連接,選擇架構(gòu)(使用的數(shù)據(jù)庫)
如果還是不行,也可以像我一樣,清空設(shè)置,看看是不是idea本來就顯示不了。如果是,那可能是idea版本問題了,我的版本是2023.1文章來源地址http://www.zghlxwxcb.cn/news/detail-758126.html
到了這里,關(guān)于【問題記錄】IDEA Mybatis *Mapper.xml 中 sql 無提示、無高亮、格式化失效問題 (已解決)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!