首頁>技術>

在面對大批次資料查詢的時候,如果一次性全部查出來的話,即便是查詢方法再怎麼做最佳化,都會遇到資料量大這個瓶頸,有時候一次查詢會非常耗時,在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

最後附上一張請求成功的圖片

請求結果

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何在skynet框架中使用socket+protobuf