0


【问题记录】IDEA Mybatis *Mapper.xml 中 sql 无提示、无高亮、格式化失效问题 (已解决)

问题
先说版本,win 11,idea 2023.1
如标题,想去格式化mybatis中写的sql,但是ctrl alt L 一顿处理,其中的sql没有按照sql命令的格式去格式化,此外写sql 无提示也无高亮
问题示例
未格式化前,显然格式已经差不多了,按理来说再格式化也就稍微调整

<select id="selectxx" resultType="java.util.HashMap">SELECT* from (SELECT p.project_code projectCode,
                     p.project_name projectName,(SELECTcount(*)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>

但格式化的结果是这样,显然sql的格式不对:

<select id="selectxx" resultType="java.util.HashMap">SELECT* from (SELECT p.project_code projectCode,
        p.project_name projectName,(SELECTcount(*)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>

【半解决】
不能叫解决,只能说解决了一半。
先百度了一下,搜出来大多数解决方案都差不多,如下

  • 设置 → 语言方案 → sql方言 → 设为mysql(或其他 你用的数据库)
  • Database中配置MySQL的数据源

这两种方法试了都不行。在思否 这里 找到了一个,也就是半解决的方案,简要来说就是

  1. 选中sql代码
  2. 右键 → 显示上下文 → 注入语言或引用 → 在弹框中点选mysql或sql(或你的其他数据库)(其实可以搜索,虽然没有搜索框,但是默认取焦点,直接输入就可以搜索)
  3. 此时sql的高亮已经显示成功,再次格式化,发现sql格式化成功,如果你的idea连接了数据库,那么此时是可以有比如说select等关键字、表字段之类的联想提示的

其他方法就是插件,见【后话】

【解决示例】
这里是思否那个的例子,只是贴出来
原代码

<?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(selectcount(1)as flowNum
              from ccform_debit_all
              where cf_acctime >
                    to_char(sysdate,'yyyy-MM-dd'))crossjoin(selectcount(1)as flowNumMonth
                            from ccform_debit_all
                            where cf_acctime
                                      > to_char(sysdate,'yyyy-MM'))crossjoin(selectcount(1)as flowNumTotal
                             from ccform_debit_all
                             where cf_acctime
                                       > to_char(sysdate,'yyyy'))

【后话】
大家估计也知道为什么说是半解决了,因为它这个办法还是代码块级或者文件级别,要一个个操作,不是很方便,还是想要一个一劳永逸的。还有语言注入其实是临时的,重启idea就会消失,那就更鸡肋了,而且只能纯sql,对于像我的示例中这样,又包含sql又包括mybatis的语法的,比如

<if>

这样的到那就隔断了,

<if>

是不会被视为sql的,那么
要么写一个纯sql要么纯mybatis语法(其实这样还合理一点,但是这接手的二开,原来的就是混杂的),又或者手敲格式可能还更简单。

其实我还试过那个,就是idea 的插件,比如 SQLFormatter 之类的,那个也可以满足要求,但是问题比语言注入还多,缺点全都有而优点可以忽略,还不如打开一个sql控制台复制粘贴,所以还是放弃了。

如果有其他更好的办法,大家可以在评论分享一下,十分欢迎

2023.11.19更

虽然不是什么大问题,但看着膈应,差点就重装idea了,最后挣扎一次,幸好是解决了。

【过程】

  1. 想重装idea(差点,一上来肯定不能那么极端)
  2. (文件 → 管理ide设置 → 还原默认设置)(这时候会提示备份设置,当然也可以自己提前备份(文件 → 管理ide设置 → 导出设置))→ 重启
  3. 再打开项目,配置下jdk和maven,发现此次高亮没任何问题!
  4. 可知,不是代码问题。而就是配置问题,但配置由前面内容可知,都试过了,也不该有任何问题
  5. 尝试插件检查(为什么呢,因为我想起来我idea太重,有搜过相关内容,把idea部分用不上(自认为)的插件禁用了)

【解决】
插件检查不再赘述,总之最后找到了问题,是

XpathView + XSLT

这个插件被我禁用所导致的!
在这里插入图片描述
将其启用,正常了,mybatis xml有了高亮、格式化也正常了、关键字如select、where等也有了提示,表名、字段名也有了提示(需idea配置数据源)
最后,把idea的配置再导入就好了,过程很烦,但此事终告一段落,开心。

放一下图:
在这里插入图片描述
如果还是不行,建议全部检查一下:

  1. 插件:Database Tools and SQLXpathView + XSLTMyBatisCodeHelperPro 或者MyBatisX
  2. 设置:配置sql方言
  3. 数据源:配置数据库连接,选择架构(使用的数据库)

如果还是不行,也可以像我一样,清空设置,看看是不是idea本来就显示不了。如果是,那可能是idea版本问题了,我的版本是2023.1

标签: mybatis xml sql

本文转载自: https://blog.csdn.net/weixin_50624398/article/details/133958490
版权归原作者 CJCChester 所有, 如有侵权,请联系我们删除。

“【问题记录】IDEA Mybatis *Mapper.xml 中 sql 无提示、无高亮、格式化失效问题 (已解决)”的评论:

还没有评论