mybaits batchInsert 返回主键Id对batchInsert 对象的影响分析

应用场景:

在向数据库批量插入时,对象为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 的变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值