功能中进行频繁查询、提高查询效率的方法

我曾遇到过的情况需要将多个DO模型转换成VO模型,由于DO模型中存在着的是ID集合,需要转换成VO中的集合,每一个ID集合都要进行一次批量查询,难免会有重复的ID,每一次查询都进行一次IO,消耗的时间是非常多的,(查询就会涉及到IO,有想了解的可以了解一下)所以我们可以保存要转换的所有的DO模型中的ID提取出来,保存为set集合,然后根据set集合的数据进行批量查询出所有的结果,保存到map集合中,键值对为 id :值,后面进行查询,就直接从集合中获取。
给出一个简单的例子:
下面是定义 DO 和 VO 的模型

public class StudentDO {
    private String id;
    private String studentName;
    private String classId;
    private List<String> courseIdList;

    public StudentDO() {
    }

    public StudentDO(String id, String studentName, String classId, List<String> courseIdList) {
        this.id = id;
        this.studentName = studentName;
        this.classId = classId;
        this.courseIdList = courseIdList;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getClassId() {
        return classId;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }

    public List<String> getCourseIdList() {
        return courseIdList;
    }

    public void setCourseIdList(List<String> courseIdList) {
        this.courseIdList = courseIdList;
    }

    @Override
    public String toString() {
        return "StudentDO{" +
                "id='" + id + '\'' +
                ", studentName='" + studentName + '\'' +
                ", classId='" + classId + '\'' +
                ", courseIdList=" + courseIdList +
                '}';
    }
}
public class StudentVO {
    private String id;
    private String studentName;
    private ClassVO classInfo;
    private List<CourseVO> courseList;

    public StudentVO() {
    }

    public StudentVO(String id, String studentName, ClassVO classInfo, List<CourseVO> courseList) {
        this.id = id;
        this.studentName = studentName;
        this.classInfo = classInfo;
        this.courseList = courseList;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public ClassVO getClassInfo() {
        return classInfo;
    }

    public void setClassInfo(ClassVO classInfo) {
        this.classInfo = classInfo;
    }

    public List<CourseVO> getCourseList() {
        return courseList;
    }

    public void setCourseList(List<CourseVO> courseList) {
        this.courseList = courseList;
    }

    @Override
    public String toString() {
        return "StudentVO{" +
                "id='" + id + '\'' +
                ", studentName='" + studentName + '\'' +
                ", classInfo=" + classInfo +
                ", courseList=" + courseList +
                '}';
    }
}

具体的转换代码:先获取所有的id进行去重处理,进行批量查询放到map中

//获取courseVO
        Set<String> courseIds = new HashSet<>(); // 将 id 进行去重并排序
        for (StudentDO studentDO : studentList) {
            List<String> courseIdList = studentDO.getCourseIdList();
            courseIds.addAll(courseIdList);
        }
        List<String> courseIdList = new ArrayList<>(courseIds);
        //去重之后依然能够获取所有的课程信息,因为包含了所有的id 后面虽然不能一一对应 但是可以通过 id 来一一对应
        //listCourseByIds() 根据id集合来进行批量查询返回courseList
        List<CourseVO> courseVOS = courseService.listCourseByIds(courseIdList);
        //设置课程id和课程对应关系
        Map<String, CourseVO> courseMap = new HashMap<>();
        for (CourseVO courseVO : courseVOS) {
            courseMap.put(courseVO.getId(), courseVO);
        }

DO模型中根据id从map中获取 VO List

List<CourseVO> courseVOList = studentDO.getCourseIdList().stream().map(id -> courseMap.get(id)).collect(Collectors.toList());

此时就完成了操作,上述操作比起重复进行查询,或者是只用单一的查询,要节省很多的IO操作的时间,灵活使用map,虽然代码可能看起来变长了,但是效率变高了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一个基于 MyBatis 的增强工具,提供了许多便捷的功能和优化查询效率方法。下面是一些可以提升查询效率的 MyBatis-Plus 的使用技巧: 1. 使用分页:通过使用 MyBatis-Plus 提供的分页功能,可以避免一次性加载过多的数据,减少查询的数据量。 ```java Page<T> page = new Page<>(pageNum, pageSize); IPage<T> result = myService.page(page, queryWrapper); ``` 2. 使用条件构造器:MyBatis-Plus 提供了 QueryWrapper 和 LambdaQueryWrapper 等条件构造器,可以方便地构建复杂的查询条件,避免手动拼接 SQL,提高查询效率。 ```java QueryWrapper<T> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "John").ge("age", 18); List<T> result = myService.list(queryWrapper); ``` 3. 使用 SQL 注入器:MyBatis-Plus 内置了一些常用的 SQL 注入器,如批量插入、逻辑删除等,可以简化开发并提高执行效率。 ```java myService.saveBatch(list); // 批量插入 myService.removeById(id); // 逻辑删除 ``` 4. 合理使用缓存:MyBatis-Plus 支持二级缓存和本地缓存,可以根据实际情况选择合适的缓存策略,减少对数据库的频繁查询。 5. 动态表名和字段名:MyBatis-Plus 支持动态生成表名和字段名,可以根据运行时的条件动态选择表和字段,提高查询效率。 ```java @TableName("${tableName}") public class User { // ... } ``` 需要根据具体的业务场景和需求来选择合适的优化方法,以上仅为一些常见的示例。同时,还可以结合 MyBatis-Plus 提供的其他功能,如性能分析、慢 SQL 监控等,进行性能优化和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值