mysql的分頁查詢(for迴圈)
阿新 • • 發佈:2019-02-10
這兩天寫了一個定時任務,關於查詢表中快過期的卡,傳送簡訊提醒,在查詢中,因為生產上的資料數十萬條,資料量大,如果直接一下子查出來,會對資料庫造成很大的壓力,用到分頁查詢,按照正常邏輯,查詢表中總數量,然後根據當前頁以及每頁數量,迴圈對資料庫進行查詢;
- //分頁查詢,每次查詢1000條資料
- int pageSize = 1000;//每頁數量
- int page = 1;//定義總頁數
- int offset;//當前頁起始數
- int rowCount;//當前頁結束數
- List<GiftCard> list = null;
- List<Integer> userIdList = new ArrayList<Integer>();
- //得到總頁數
- if(giftCardCount > 0){
- if(giftCardCount%pageSize==0){
- page=(int) (giftCardCount/pageSize);
- }else{
- page=(int) (giftCardCount/pageSize+1);
- }
- }
- //查詢出還有三天且綁定了使用者的優選卡資訊
- for (int i = 1; i < page + 1; i++) {
- if(page == 1){//即將過期賬號查詢只有一頁時
- offset = 0
- rowCount = (int) giftCardCount;
- list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);
- if(null != list && list.size() > 0) {
- for (GiftCard giftCard : list) {
- Integer userId = giftCard.getUserId();
- userIdList.add(userId);
- }
- }
- }else{//即將過期優選卡查詢多頁時分頁處理
- if(i == 1){
- offset = 0;
- }else{
- offset = (i-1)*pageSize;
- }
- if(page == i){
- //rowCount = (int) giftCardCount;
- rowCount = (int) giftCardCount - (i-1) * pageSize;
- }else {
- //rowCount = i*pageSize -1;
- rowCount = pageSize;
- }
- list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);
- if(null != list && list.size() > 0) {
- for (GiftCard giftCard : list) {
- Integer userId = giftCard.getUserId();
- userIdList.add(userId);
- }
- }
- }
- }
上面的程式碼,是否能進一步優化呢?
如果採用for迴圈的break跳出會不會邏輯更加簡單些?
每一次迴圈查出1000條,當某一次查出的資料的數量不夠1000條時,表示再往下迴圈已然沒有資料,這個時候跳出,迴圈結束,即將過期卡的資訊也被完全查出,相比上面的業務邏輯,簡單許多,在生產商可以節省不少時間,修改程式碼如下:
- //分頁查詢,每次查詢1000條資料
- int pageSize = 1000;//每頁數量
- int offset;//當前頁起始數
- List<GiftCard> list = null;
- List<Integer> userIdList = new ArrayList<Integer>();
- for(int i = 0;i>=0;i++){
- offset = i*pageSize;
- list = giftcardDAO.getGiftCardThreeDaysDue(pageSize,offset,currentTime,fourDaysTime);
- if(null != list && list.size() > 0) {
- for (GiftCard giftCard : list) {
- Integer userId = giftCard.getUserId();
- userIdList.add(userId);
- }
- }
- if(null != list && list.size() > 0 && list.size() < pageSize){
- break;
- }
- }
補充:這裡也順便介紹下java跳出for迴圈的break和continue語句;
“break”語句用來結束迴圈,即不再執行後邊的所有迴圈。
示例:計算1+2+3+4......+100的結果。
- publicclass example1{
- publicstaticvoid main(String[] args){
- int result=0;
- for(int i=1;i<=100;i++){
- if(i>50) break;
- result+=i;
- }
- System.out.println(result);
- }
- }
1275
分析:程式只計算了1+2+3+4+......+50的結果,後邊的迴圈全部沒有執行,即當i=51的時候,迴圈就結束了。
另外,“break”語句可以與switch開關語句一起使用,當break用於開關語句switch中時,可使程式跳出switch而執行switch以後的語句;如果沒有break語句,則會從滿足條件的地方(即與switch(表示式)括號中表達式匹配的case)開始執行,直到switch結構結束。
“continue”語句用來結束當前迴圈,並進入下一次迴圈,即僅僅這一次迴圈結束了,不是所有迴圈結束了,後邊的迴圈依舊進行。
示例:計算1+2+3+4......+100的結果。
- publicclass example1{
- publicstaticvoid main(String[] args){
- int result=0;
- for(int i=1;i<=100;i++){
- if(i>50&&i<=60) continue;
- result+=i;
- }
- System.out.println(result);
- }
- }
4495
分析:程式計算了1+2+3+......+48+49+50+61+62+63+......+100的結果,僅僅沒有對i=51,52......60進行迴圈。