个人技术博客1----关于springboot框架内实现分页查询
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开始,如果输入的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