测试代码

共准备了以下几个测试代码:

  1. 空白对照
public List<User> test0() {    return new ArrayList<>();}
  1. for循环遍历
public List<User> test1(@RequestBody List<Integer> ids) {    List<User> list = new ArrayList<>();    for (Integer id : ids) {        list.add(userService.getById(id));    }    return list;}
  1. listByIds
public List<User> test2(@RequestBody List<Integer> ids) {    return userService.listByIds(ids);}
  1. mapper中的foreach
// controllerpublic List<User> test3(@RequestBody List<Integer> ids) {    return userService.selectByIds(ids);}// mapper@Select("<script>" +            "select * from user where id in " +                "<foreach collection='list' item='item' open='(' separator=',' close=')'>" +                    "#{item}" +                "</foreach>" +        "</script>")List<User> selectByIds(@Param("list") List<Integer> ids);

测试结果

n为ids的长度,使用postman发送请求,各接口响应时间如下:

ntest0test1test2test3
1214ms260ms260ms260ms
2214ms302ms260ms260ms
10214ms655ms260ms260ms
40214ms2.08s260ms260ms
240214ms10.71s261ms261ms
1000214ms-267ms267ms

测试结论

空白对照基本可以看做除去数据库查询以外的其他时间,减去这段时间后,可以看出本次实验环境下一次数据库查询的时间大概为40ms左右。使用mybatis的listByIds和foreach的时间基本相同,因为无论n为多少,都只会执行一次数据库查询。而使用for循环反复创建数据库连接的开销太大。