在面對大批次資料查詢的時候,如果一次性全部查出來的話,即便是查詢方法再怎麼做最佳化,都會遇到資料量大這個瓶頸,有時候一次查詢會非常耗時,在web專案中甚至會造成查詢超時,進而會影響到使用者使用體驗。這個時候就要用到分頁查詢,避免大量資料一次性查詢造成阻塞。下面基於springboot專案介紹使用SQL分頁,和springmvc中GET方法傳遞引數,完成前後端資料分頁的查詢。建議入門級小白閱讀,大神請略過。
專案環境:springboot + mybatis + postgresql
使用SQL分頁,主要就是兩個引數,一個是pageSize,另一個是pageIndex,分別代表分頁的每一頁有多少條資料和頁碼的索引,也就是第幾頁。
SQL分頁mapper.xml檔案中SQL程式碼為:
public List<Selary> pagingSelectByUnconditional(@Param("pageSize") int pageSize, @Param("index") int index);
service介面和實現類中對應程式碼為:
//service介面public List<Selary> pagingSelectByUnconditional(@Param("pageSize") int pageSize, @Param("index") int index); //service實現類@Overridepublic List<Selary> pagingSelectByUnconditional(int pageSize, int index) { return selaryMapper.pagingSelectByUnconditional(pageSize, index);}
這樣就可以在controller中查詢出該頁碼上的資料了。但是這樣並不是完整的,因為這樣只返回了當前頁的資料,還需要返回一共有多少條資料,所以還需要再進行一次有多少條資料的SQL查詢。這裡只給出查詢的SQL語句:
SELECT COUNT(id) FROM "base".Selary;
將查詢總數返回的資料和查詢該頁的資料一起返回給前端頁面。
springmvc GET方法傳遞引數查詢在controller中使用GET方法查詢,pageSize和pageIndex(程式碼中我使用index)引數寫在url中。
controller中接收引數有不同的方式,但是基本都是透過不同的註解完成。下面逐一介紹:
1)@RequestMapping註解
@RequestMapping(value= "/pagingselectbyunconditional", method = RequestMethod.GET)public Result pagingSelectByUnconditional(int pageSize, int index){ Map<String, Object> stringObjectMap = new HashMap<String, Object>(); try{ stringObjectMap.put("total", selaryImpl.getselaryTableCount()); stringObjectMap.put("result", selaryImpl.pagingSelectByUnconditional(pageSize, index)); stringObjectMap.put("pageSize", pageSize); stringObjectMap.put("pageIndex", index); result.returnSuccess(stringObjectMap); }catch (Exception e){ result.returnError(); }finally { return result; }
這裡直接在方法的形參中寫入引數,此時url為:
http://localhost:ip/pagingselectbyunconditional?pageSize=10&index=0
可以直接解析出url中的pageSize和index
2)@RequestParams註解
@RequestMapping(value = "/pagingselectbyunconditional", method = RequestMethod.GET)public Result pagingSelectByUnconditional(@RequestParam("pageSize") int pg, @RequestParam("index") int in){ Map<String, Object> stringObjectMap = new HashMap<String, Object>(); try{ stringObjectMap.put("total", selaryImpl.getselaryTableCount()); stringObjectMap.put("result", selaryImpl.pagingSelectByUnconditional(pageSize, index)); stringObjectMap.put("pageSize", pageSize); stringObjectMap.put("pageIndex", index); result.returnSuccess(stringObjectMap); }catch (Exception e){ result.returnError(); }finally { return result; }}
@RequestParams註解會解析url中的pageSize和index,
此時url為:http://localhost:ip/pagingselectbyunconditional?pageSize=10&index=0
注意@RequestParams括號中的引數一定要和url中的對應。
3)@PathVariable註解
@RequestMapping(value = "/pagingSelectByUnconditional/{pageSize}/{index}", method = RequestMethod.GET) public Result pagingSelectByUnconditional(@PathVariable ("pageSize") int pg, @PathVariable("index") int in){ Map<String, Object> stringObjectMap = new HashMap<String, Object>(); try{ stringObjectMap.put("total", selaryImpl.getselaryTableCount()); stringObjectMap.put("result", selaryImpl.pagingSelectByUnconditional(pageSize, index)); stringObjectMap.put("pageSize", pageSize); stringObjectMap.put("pageIndex", index); result.returnSuccess(stringObjectMap); }catch (Exception e){ result.returnError(); }finally { return result; }}
@PathVariable會按順序解析url中的引數,此時url為:
http://lcoalhost:ip/ori/orbitczmlpath/pagingselectbyunconditional/10/0
注意此時@RequestMapping中的value
最後附上一張請求成功的圖片
請求結果