具体情况:现在有2个list (A,B) ,A list里面有A对象,A对象有属性id,A1属性, Blist里面有B对象 其中BId 和 B1属性,其中Alist里面的id和Blist里面的BId 有相等值,如何把Blist里面B1复制给ALIST里面的A1
具体解决办法
传统方式
对Alist进行循环,每次都往数据库查询具体关联的值:id,这样的弊端是需要进行几百次的查询,大大降低了效率:
for (int i = 0; i < Alist.size(); i++) {
B b = BMapper.select(Alist.get(i).getId());
Alist.setA(b.getB())
}
改进方式
直接将A里面的id全部拿出,形成1个idlist,进行一次查询;
List<String> ids = new ArrayList<>();
for (int i = 0; i < Alist.size(); i++) {
ids.add(Alist.get(i).getId());
}
然后进行1次查询,讲所有B找出
List<B> BList = BMapper.selectListByIds(ids);
//BMapper
List<B> selectListByIds(@Param("ids") List<String> ids);
// mybaits.xml
<select id="selectListByIds" parameterType="list" resultMap="BaseResultMap">
SELECT * from B
<where>
<if test="ids!=null">
BId in
<foreach item="id" collection="ids" index="index"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
同时进行复制操作(注意:这里用到了java 8的stream流,用来快速对list进行操作)
for (A a: AList) {
//增加最后登陆时间
B b = BList .stream()
.filter(b1-> b1.getBId().equals(a.getId()))
.findFirst()
.orElse(null);
if (b != null){
a.setA1(b.getB1());
}
}
结论
// 数据量为10000
传统方式的接口耗时:6.89s
改进方式接口耗时:
: