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對象里,這樣就最簡單了,但是搜了半天都沒有這個這個功能

原創文章,歡迎轉載,轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM