一、起因
有下面这样一段代码,在for循环中调用SQL,然后将查询到的值回填;导致,for循环中会调用很多SQL,速度很慢。
text
1
2
3
4
5
6
7
for (DeclareCategory dc :list){
ParameterVO parameter = new ParameterVO();
parameter.setId(dc.getId());
List<Stage> stages = stageMapper.getdeclaryStagePing(parameter);
dc.setStage(stages);
}
二、优化方案
可以将参数提前封装好,进行批量查询,再将查询的结果进行匹配回填,这样能大大提高效率,数据量大的情况下效果更明显。
三、实施方案
1、将需要的参数进行封装为List
text
1
2
3
4
5
6
7
8
9
10
11
12
public ParameterVO packeParam(List<DeclareCategory> list){
//提取出所有DC的id
List<Long> dcIds = new ArrayList<>();
for (DeclareCategory dc : list){
dcIds.add(dc.getId());
}
//封装传入参数
ParameterVO parameter=new ParameterVO();
parameter.setArray(dcIds);
return parameter;
}
2、创建查询结果的返回实体类
text
1
2
3
4
5
6
7
8
9
public class ResultStageVO {
private Long declareCategoryId;
private List<Stage> list;
//get、set自行补齐
}
3、mapper的xml文件
封装结果集
text
1
2
3
4
5
6
7
8
9
<resultMap type="com.ruoyi.declare.vo.ResultStageVO" id="StageResultList">
<result column="declare_category_id" property="declareCategoryId"/>
<collection property="list" ofType="com.ruoyi.common.core.domain.entity.Stage">
<result property="id" column="id"/>
<result property="projectId" column="project_id"/>
......
</collection>
</resultMap>
ql语句,用正常的foreach循环即可
text
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
s.*,
p.*
FROM
project p,
WHERE
p.id = s.project_id
AND
<foreach item="array" collection="array" open="(" separator="or" close=")">
p.declare_category_id = ${array}
</foreach>
GROUP BY s.id
4、mapper文件
text
1
2
List<ResultStageVO> getDeclaryStageShen(ParameterVO parameter);
5、对结果集进行匹配合并
具体查看这里





评论
登录后即可评论
分享你的想法,与作者互动
暂无评论