springboot架構内實作分頁查詢
這個作業屬于哪個課程 | 2021春/S班 |
---|---|
這個作業要求在哪裡 | 作業要求 |
這個作業的目标 | 總結個人技術 |
- 這個技術是後端實作分頁查詢,(展示的後端為spring boot)一般在顯示某某清單的情況下都要用到這一門技術。學習改技術是因為我負責的顯示學生和學生團隊子產品會出現查詢結果很多,需要分頁顯示查詢結果。技術的難點主要就是如何使用pagehelper插件。
- 該技術的使用步驟
- 因為是一個外接的插件,是以先在pom.xml中引入依賴,在裡面加入:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
- 該插件需要傳入的參數是代表第幾頁的pageNum和一頁有幾條資料的pageSize,可以将這兩個參數封裝到一個類裡面,這邊取名為PageRequest。而傳回的結果應該設定一個類來盛放,這邊舉例去查詢所有學生的具體資料,于是建立一個學生類。
@Data public class PageRequest { //目前頁碼 int pageNum; //每頁數量 int pageSize; } //這邊@Dada的注解是自動給你添加屬性字段的get和set方法
@Data @AllArgsConstructor @ExcelTarget("users") public class User implements Serializable { private String id; @Excel(name = "賬戶", orderNum = "1") private String account; @Excel(name = "姓名", orderNum = "2") private String userName; @Excel(name = "密碼", orderNum = "3") private String password; @Excel(name = "權限", orderNum = "4") private String perms; private Set<Role> roles; private String salt; private String classId; private String tokenSalt; private String teamId; private String totalScore="0"; private ClassRoom classRoom; private String pairTeamId; public User() { } public User(String id, String userName, String password, Set<Role> roles) { this.id = id; this.userName = userName; this.password = password; this.roles = roles; } public static ArrayList<User> getUsers() { ArrayList<User> userList = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setId(i + ""); user.setUserName("小鹿" + i); user.setPassword("123456"); user.setPerms("無" + i); userList.add(user); } return userList; } } //這個是我們實際情況具體的學生類,真正使用的話可以像上一個pageRequest類一樣簡單。
- 需要編寫一個擷取所有學生清單的接口(這個比較簡單,自行在mapper檔案裡面寫一個函數就可以了),然後在具體的service裡面寫擷取學生清單的函數,友善後面調用。
- 在service裡面寫一個selByPage函數
@Override public PageInfo<User> selByPage(PageRequest pageRequest) { int pageNum=pageRequest.getPageNum(); int pageSize=pageRequest.getPageSize(); PageHelper.startPage(pageNum,pageSize); //傳參數建構PageHelper List<User> studentList= this.selAll(); //擷取所有學生清單 return new PageInfo<User>(studentList); //将分頁結果傳回 }
- 在control類裡面寫函數
//分頁查詢學生資料 @RequestMapping("/selByPage") @ResponseBody public ResponseData selByPage(PageRequest pageRequest){ PageInfo<User> pageInfo = studentService.selByPage(pageRequest); return new ResponseData("傳回的學生清單","200",pageInfo); }
- 最後展示使用postman的查詢結果: 這邊可以看到,傳入了pageNum和pageSize兩個參數,封裝到了pageRequest類裡面。傳回的結果,data屬性是我們需要的(message屬性和code屬性是我們自己封裝的屬性,為了提示傳回情況)。裡面的total表示學生數,然後裡面包含了每一條學生的json資料。
個人技術部落格1----關于springboot架構内實作分頁查詢 - 注意:頁數第一頁是從1開始,如果輸入的pageNum<=0,結果會從第一頁開始。如果輸入的pageNum太大,會傳回最後一頁的結果。
- 如果不使用插件的話,得先擷取學生清單的長度,自己設計邏輯來判斷傳入的pageSize和pageNum屬性有沒有出錯,最後通過sql自帶的分頁查詢查找結果。
可以參考笨笨先飛的部落格@Select("SELECT u.id,account,user_name as userName,PASSWORD,perms,salt,total_score as totalScore,team_id as teamId,class_id as classId FROM user u\n" + " left join user_role ur on ur.userid = u.id\n" + " where ur.roleid = 2 limit #{pageNo},#{pageSize}") public List<User> selByPage(int pageNo,int pageSize);
- 總結:使用插件的話會友善很多很多,不過就像我在個人實踐總結提出的問題1一樣,自己寫相關的函數封裝起來,自己設計自己的分頁查詢插件也是可以的。雖然麻煩,效果也不一定比用插件好,但是可以增進自己對具體問題的了解。
-
參考:
作者:王小錘DW3