zoukankan      html  css  js  c++  java
  • for循环里使用查询如何优化(代码库)

      for循环里的查询,只是为了赋值对象中的一个字段,如果每一个都重新查一下数据库,影响效率

      应该先进行查询,然后再循环里组装自己需要的业务数据

      如下代码:list1 查询出对象的一部分内容,list2 查询出对象的另一部分内容,然后在for循环里组装这个对象。

      其中关键点是:循环里嵌套的循环,每次遍历完数据以后,再remove掉,注意list的remove方法

     

     1 public List<Timetable> listTimetableByUserAndTime(Long userId, Integer userType, Date leftDate, Date rightDate) {
     2         List<Lesson> list1 = courseService.listLessonByStudentIdAndTime(userId, leftDate, rightDate);
     3         if (list1 == null || list1.isEmpty()) {
     4             return new ArrayList<>();
     5         }
     6         List<Timetable> list2 = courseService.listLessonByUserIdAndUserTypeAndLessonId(userId, userType, list1);
     7         if (list2 == null) {
     8             list2 = new ArrayList<>();
     9         }
    10 
    11         List<Timetable> ansList = new ArrayList<>();
    12         for (Lesson lesson : list1) {
    13             Timetable timetable = new Timetable();
    14             timetable.setUserId(userId);
    15             timetable.setUserType(userType);
    16             timetable.setLessonId(lesson.getId());
    17             timetable.setLessonTime(DateUtil.convertDateToLong(lesson.getStartTime()));
    18 
    19             //循环赋值
    20             if (list2.isEmpty()) {
    21                 timetable.setWatchState(0);
    22             } else {
    23                 boolean flag = true;
    24                 for (int i = 0; i < list2.size(); i++) {
    25                     Timetable tmp = list2.get(i);
    26                     //两个实体类的代码进行相等比较,更好的方法是重写equals,这里不考虑了
    27                     if (timetable.getUserId().equals(tmp.getUserId()) && timetable.getUserType().equals(tmp.getUserType()) && timetable.getLessonId().equals(tmp.getLessonId())) {
    28                         //如果相等,赋值以后,还要从list里移除,跳出循环
    29                         flag = false;
    30                         timetable.setId(tmp.getId());
    31                         timetable.setWatchState(tmp.getWatchState());
    32                         list2.remove(i);
    33                         break;
    34                     }
    35                 }
    36                 //没有找到相同的实体
    37                 if (flag) {
    38                     timetable.setWatchState(0);
    39                 }
    40             }
    41             ansList.add(timetable);
    42         }
    43 
    44         return ansList;
    45     }

    PS:刚开始我总觉还有一种办法,就是在使用mybatis的时候,有没有可能,传的参数是List对象,返回的值直接赋值到这个参数里的List对象里,这样就最简单了,但是搜了半天都没有这个这个功能

    原创文章,欢迎转载,转载请注明出处!

  • 相关阅读:
    控件
    ASP.NET简介与Repeater重复器
    WinForm简介
    ADO.net测试题
    6.08练习
    高级查询几种方法
    数据库查询的几种方式
    MySQL更新(修改、查询)
    create(创建) table(表格) student<表名>
    候选键,主键,外键
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/java_for_select.html
Copyright © 2011-2022 走看看