应用场景:
在向数据库批量插入时,对象为List,而且需要再次使用这一批带有主键的数据进一步操作问题描述:
首先是从微服务某接口中获取某学校的所有学生,用list接收,然后把这个list batchInsert入库,同时将这些学生按照班级放入到map中(key为班级id,value是该班级的学生的list)
代码如下:
Map<Integer, List<Student>> eachClassStudentsMap = new HashMap<>();
List<Student> wStudentList = new ArrayList<>();
for (Class c : classList) {
List<Student> studentsList = apiService.getStudent(uid, c.getId(),c.getUd());
wStudentList .addAll(studentsList);
eachClassStudentsMap.put(c.getId(), studentsList);
}
studentDao.batchInsert(wStudentList );
在入库之后,发现不仅wStudentList 里面的对象是有id的,而且studentsList 里面也有返回的id。
原因分析:
首先wStudentList 里的对象有id是因为:
Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认设置为 false。当设置改为 true 时,表示如果插入的表以自增列为主键,就会允许 JDBC 支持自动生成主键,并且可以将自动生成的主键返回。
其次studentsList里的对象也有id的原因是:
wStudentList .addAll(studentsList);
这里用到了addAll,addAll()在ArrayList里做的是System.arraycopy(),而System.arraycopy()复制目标studentsList里全是student对象,复制给wStudentList 的将是引用对象
结论
在返回主键后,先返回的是每个student对象里面的id,然后导致了studentsList的变化,最后才是体现了wStudentList 的变化。