为什么springboot中的mapper层方法不能重载? mapper[xxx] is ignored, because it exists, maybe from xml file

今天写代码的时候,习惯性的在mapper中写了个重载,如下图

 然后在项目启动时候,居然报错了。报错信息如下。

重载的写法在代码中会经常遇到,为什么到这里就不行了呢?到这里我甚至怀疑我的idea又抽风了 ,先按老规矩重启一下,没效果,那好吧,我们排查一遍。

首先全文搜一下报错信息,搜到了

 点进去瞅瞅发生了什么

 

    /**
     * MybatisPlus 加载 SQL 顺序:
     * <p> 1、加载 XML中的 SQL </p>
     * <p> 2、加载 SqlProvider 中的 SQL </p>
     * <p> 3、XmlSql 与 SqlProvider不能包含相同的 SQL </p>
     * <p>调整后的 SQL优先级:XmlSql > sqlProvider > CurdSql </p>
     */
    @Override
    public void addMappedStatement(MappedStatement ms) {
        if (mappedStatements.containsKey(ms.getId())) {
            /*
             * 说明已加载了xml中的节点; 忽略mapper中的 SqlProvider 数据
             */
            logger.error("mapper[" + ms.getId() + "] is ignored, because it exists, maybe from xml file");
            return;
        }
        mappedStatements.put(ms.getId(), ms);
    }

这里用到了一个内存缓存来储存,然后他判断了缓存的key是否重复,从这个代码可以看出来这个可以是什么呢?继续向下看

根据这个程序调用栈我们依次向下找,找到了id,继续向上找,瞅瞅这个id是怎么来的。

 还是这个类,向上翻发现了它的构造方法,第一个属性值为id

好了,现在我们只需要确定是谁调用了这个构造器,继续沿着程序调用栈向下走一步。

 找到了它的调用处,这里的变量名改为了 mappedStatementId,我们不要搞混了,记下来继续找mappedStatementId这个属性。

 ok,找到这里就知道这个id是根据什么来命名的了,这个type是从这个类的构造器中取的,就是我们扫描的类名,上图的命名规则为类名+.+方法名。

所以当spring扫描到我们mapper中的方法时,方法的重载会导致MappedStatement 中的key重复,我们还是老老实实的回去改方法名吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差点资深程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值