1. 程式人生 > >mysql的分頁查詢(for迴圈)

mysql的分頁查詢(for迴圈)

這兩天寫了一個定時任務,關於查詢表中快過期的卡,傳送簡訊提醒,在查詢中,因為生產上的資料數十萬條,資料量大,如果直接一下子查出來,會對資料庫造成很大的壓力,用到分頁查詢,按照正常邏輯,查詢表中總數量,然後根據當前頁以及每頁數量,迴圈對資料庫進行查詢;

  1. //分頁查詢,每次查詢1000條資料
  2. int pageSize = 1000;//每頁數量
  3. int page = 1;//定義總頁數
  4. int offset;//當前頁起始數
  5. int rowCount;//當前頁結束數
  6. List<GiftCard> list = null;  
  7. List<Integer> userIdList = new ArrayList<Integer>();  
  8. //得到總頁數
  9. if(giftCardCount > 0){             
  10.     if(giftCardCount%pageSize==0){  
  11.         page=(int) (giftCardCount/pageSize);  
  12.     }else{  
  13.         page=(int) (giftCardCount/pageSize+1);  
  14.     }  
  15. }  
  16. //查詢出還有三天且綁定了使用者的優選卡資訊
  17. for (int i = 1; i < page + 1; i++) {           
  18.     if(page == 1){//即將過期賬號查詢只有一頁時
  19.         offset = 0
    ;  
  20.         rowCount = (int) giftCardCount;  
  21.         list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);  
  22.         if(null != list && list.size() > 0) {  
  23.             for (GiftCard giftCard : list) {  
  24.                 Integer userId = giftCard.getUserId();  
  25.                 userIdList.add(userId);  
  26.             }             
  27.         }  
  28.     }else{//即將過期優選卡查詢多頁時分頁處理
  29.         if(i == 1){                   
  30.             offset = 0;  
  31.         }else{  
  32.             offset = (i-1)*pageSize;                      
  33.         }  
  34.         if(page == i){                    
  35.             //rowCount = (int) giftCardCount;
  36.             rowCount = (int) giftCardCount - (i-1) * pageSize;  
  37.         }else {  
  38.             //rowCount = i*pageSize -1;
  39.             rowCount = pageSize;  
  40.         }  
  41.         list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);  
  42.         if(null != list && list.size() > 0) {  
  43.             for (GiftCard giftCard : list) {  
  44.                 Integer userId = giftCard.getUserId();  
  45.                 userIdList.add(userId);  
  46.             }             
  47.         }  
  48.     }  
  49. }  

上面的程式碼,是否能進一步優化呢?

如果採用for迴圈的break跳出會不會邏輯更加簡單些?

每一次迴圈查出1000條,當某一次查出的資料的數量不夠1000條時,表示再往下迴圈已然沒有資料,這個時候跳出,迴圈結束,即將過期卡的資訊也被完全查出,相比上面的業務邏輯,簡單許多,在生產商可以節省不少時間,修改程式碼如下:

  1. //分頁查詢,每次查詢1000條資料
  2. int pageSize = 1000;//每頁數量      
  3. int offset;//當前頁起始數 
  4. List<GiftCard> list = null;  
  5. List<Integer> userIdList = new ArrayList<Integer>();  
  6. for(int i = 0;i>=0;i++){  
  7.     offset = i*pageSize;  
  8.     list = giftcardDAO.getGiftCardThreeDaysDue(pageSize,offset,currentTime,fourDaysTime);  
  9.     if(null != list && list.size() > 0) {  
  10.         for (GiftCard giftCard : list) {  
  11.             Integer userId = giftCard.getUserId();  
  12.             userIdList.add(userId);  
  13.         }             
  14.     }  
  15.     if(null != list && list.size() > 0 && list.size() < pageSize){  
  16.         break;  
  17.     }  
  18. }  
這裡利用了for迴圈的break跳出,優化程式碼簡化邏輯,而且減少了對資料庫的訪問次數。

補充:這裡也順便介紹下java跳出for迴圈的break和continue語句;

“break”語句用來結束迴圈,即不再執行後邊的所有迴圈。

示例:計算1+2+3+4......+100的結果。

  1. publicclass example1{  
  2.     publicstaticvoid main(String[] args){  
  3.         int result=0;  
  4.         for(int i=1;i<=100;i++){  
  5.             if(i>50break;  
  6.             result+=i;  
  7.         }  
  8.         System.out.println(result);  
  9.     }  
  10. }  
輸出結果:
1275

分析:程式只計算了1+2+3+4+......+50的結果,後邊的迴圈全部沒有執行,即當i=51的時候,迴圈就結束了。

另外,“break”語句可以與switch開關語句一起使用,當break用於開關語句switch中時,可使程式跳出switch而執行switch以後的語句;如果沒有break語句,則會從滿足條件的地方(即與switch(表示式)括號中表達式匹配的case)開始執行,直到switch結構結束。

“continue”語句用來結束當前迴圈,並進入下一次迴圈,即僅僅這一次迴圈結束了,不是所有迴圈結束了,後邊的迴圈依舊進行。

示例:計算1+2+3+4......+100的結果。

  1. publicclass example1{  
  2.     publicstaticvoid main(String[] args){  
  3.         int result=0;  
  4.         for(int i=1;i<=100;i++){  
  5.             if(i>50&&i<=60continue;  
  6.             result+=i;  
  7.         }  
  8.         System.out.println(result);  
  9.     }  
  10. }  
輸出結果:
4495

分析:程式計算了1+2+3+......+48+49+50+61+62+63+......+100的結果,僅僅沒有對i=51,52......60進行迴圈。