同名内部类遇到的mapper问题

记一次代码中遇到同名内部类遇到的问题

许久不写代码手生,突然来了个需求需要自己上手写代码,没想到遇到这么多问题,待我来慢慢梳理

内部类

在这里插入图片描述可以看到截图中,同名的内部类很多,在启动程序的时候报错
启动报错
我自己一开始看到这个报错,没有想到是所有这些同名的内部类的问题,因为这次开发的需求需要查两个不同IP的数据库(多数据源),数据库结构、表结构几乎一致,需要执行的SQL也一致(至于为啥需要查,当然是因为两块数据来源不同,但是现在都需要查询展示),这就导致我有相同的mapper文件 mapper.xml文件等等,我以为是大量的重复的mapper.xml导致的。

mapper截图
在这里插入图片描述
可以看到SQL中全都用了B1001$Dataresult 且都是全路径,就想到,可以不扫描涉及的实体类,所以修改了nacos配置
nacos配置
其实就是去掉了之前的*,具体到只扫描其他的实体类,不扫描我开发的这块需要用到的实体类。前提是之后需要使用实体类必须引入全路径。
结果又报错,找不到mapper
这次是自己粗心大意,classpath没写对,需要注意,mapperLocations不能加“,”分隔。修改之后就OK了。

parameterType = “java.lang.String” 报错 找不到get方法

我就把这个去掉了,其实也可以写成parameterType=“string”

list.remove() IDE编辑器报警告

在这里插入图片描述
一个小小的需要注意的地方
List遍历删除指定元素,需要逆序,逆序
举个例子

给定一个整数集合{1,2,2,3,4},删除其中能够被2整除的元素(即最后集合变为{1,3})

看到这个问题,是不是开始觉得很简单

for (int i = 0; i<list.size(); i++) {
            if(list.get(i)%2==0){
                list.remove(i);
            }
        }

但是执行完你会发现结果
不是{1,3}而是{1,2,3},为什么会发生这么奇怪的结果呢?一切都要从这个remove方法说起

public E remove(int index) {
        Objects.checkIndex(index, size);
        final Object[] es = elementData;

        @SuppressWarnings("unchecked") E oldValue = (E) es[index];
        fastRemove(es, index);

        return oldValue;
    }

private void fastRemove(Object[] es, int i) {
        modCount++;
        final int newSize;
        if ((newSize = size - 1) > i)
            System.arraycopy(es, i + 1, es, i, newSize - i);
        es[size = newSize] = null;
    }

/**
     * Copies an array from the specified source array, beginning at the
     * specified position, to the specified position of the destination array.
     * @HotSpotIntrinsicCandidate
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

当我们遍历到下标为1的第二个元素2时,做了如下操作

> 下标                      0   1  2  3   4
> 原集合                    1   2  2  3   4
> 新集合                    1   2  3  4

也就是说集合在执行remove之后顺序已经发生了改变,当我们继续遍历下标为2的元素时,本来为2的元素现在被改变到下标为1的位置,这就造成了2这个元素被完美错过了!所以得出的结果是{1,2,3}而不是{1,3}

如果我们在IDE编写上述代码时,编译器会用黄色背景色提醒我们
编译器发出了一个良性的提示——你的循环删除元素有可能会遇到问题,你小心一点
说了会出现的问题和原因,最后我们说一下解决方案

逆序遍历元素

下标 4 3 2 1 0
原集合 2 3 2 4 5
新集合 3 2 4 5
新集合 3 4 5

1 如果这个元素是第一个元素,那么直接删除,其他元素顺序不用更改,不影响接下来的遍历
2 如果不是第一个元素,那么这个元素之前的元素需要改变位置,由于之前的元素已经判断过所以即使改变了位置也没问题,这个元素之后的元素不会改变位置,所以仍然不影响后续的遍历

for (int i = list.size()-1; i >=0; i--) {
            if(list.get(i)%2==0){
                list.remove(i);
            }
        }

大功告成,完结撒花

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值