同名内部类遇到的mapper问题
记一次代码中遇到同名内部类遇到的问题
许久不写代码手生,突然来了个需求需要自己上手写代码,没想到遇到这么多问题,待我来慢慢梳理
内部类
可以看到截图中,同名的内部类很多,在启动程序的时候报错
我自己一开始看到这个报错,没有想到是所有这些同名的内部类的问题,因为这次开发的需求需要查两个不同IP的数据库(多数据源),数据库结构、表结构几乎一致,需要执行的SQL也一致(至于为啥需要查,当然是因为两块数据来源不同,但是现在都需要查询展示),这就导致我有相同的mapper文件 mapper.xml文件等等,我以为是大量的重复的mapper.xml导致的。
可以看到SQL中全都用了B1001$Dataresult 且都是全路径,就想到,可以不扫描涉及的实体类,所以修改了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);
}
}
大功告成,完结撒花