一个很正经的目录!
分页参数PageParamDTO
在我们进行分页查询的时候,我们经常需要对其中的某些字段进行某种排序(升序,降序)。那么前端每次都需要发送不同的参数,甚至不同个数的参数,这就对后端如何接受参数有所要求,有时候可能直接将排序规则拼接在字符串中如下
@PathVariable("/findAll/{id}/{DESC}")
那么这就是对id的降序排序,但是我们需要思考一个问题,分页和排序一般需要几个参数
- 当前页数是哪一页
- 每页展示几条数据
- 待排序的字段
- 排序的方式
如果都是用请求地址拼接或者请求参数的方式未免有些许繁琐,我们不如将其进行抽象,通过一个DTO,在需要进行分页或分页并排序的操作时由前端发送给后台,请在model.dto下新建PageParamDTO,内容如下
/**
* @Author Alfalfa99
* @Date 2020/9/18 13:33
* @Version 1.0
* 分页查询DTO
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageParamDTO {
/**
* cp: 当前页数
* ps: 每一页的数据条数
* order: 需要排序的字段-排序的方式(asc:升序,desc:降序)
*/
@NotNull(message = "当前页数不能为空")
private Integer cp;
@NotNull(message = "每页条数不能为空")
private Integer ps;
private Map<String,String> order;
}
当然我们拿到了装载着待排序字段和排序规则的map之后还需要进行一系列的判断并拼接成字符串,最后放到PageHelper中使用。
编写PageParamCheckUtil
/**
* @Author Alfalfa99
* @Date 2020/9/17 20:23
* @Version 1.0
* 检查分页参数
*/
@Component
public class PageParamCheckUtil {
public String CheckOrder(Map<String, String> map) {
StringBuilder finalOrder = new StringBuilder();
//判断map是否为空
if (map != null && !map.isEmpty()) {
//读取map中的所有待排序字段及其排序方法
for (String s : map.keySet()) {
//把待排序字段加入finalOrder
finalOrder.append(s);
String order = map.getOrDefault(s, "asc").toLowerCase();
if ("desc".equals(order)) {
finalOrder.append(" " + order + ",");
} else {
finalOrder.append(" asc,");
}
}
finalOrder.deleteCharAt(finalOrder.length() - 1);
}
return finalOrder.toString();
}
}
这里要注意,如果map为空请不要把空格拼接进去,不然Mybatis在执行时会报错。
那么我就是用一个实例来进行测试吧(这里就不仔细阐述在哪里添加代码了,大家懂的都懂)
//UserDao
/**
* 查询所有用户
*
* @return
*/
@Select("SELECT * FROM tb_user")
List<User> findAllUser();
//UserService
private final PageParamCheckUtil ppC; //需要先注入该工具类
/**
* 查询所有用户
*
* @return 返回用户列表
*/
public PageResult<User> findAllUser(PageParamDTO ppDTO) {
Page<Object> page = PageHelper.startPage(ppDTO.getCp(), ppDTO.getPs(), ppC.CheckOrder(ppDTO.getOrder()));
List<User> allUser = adminDao.findAllUser();
return new PageResult<>(page.getPages(), page.getTotal(), allUser);
}
在进行查询之前使用PageHelper.startPage(当前页数,每页条数,排序规则)方法,即可帮我们自动排序并分页,page.getPages() 用来返回该分页参数下一共会有多少页, page.getTotal()用来获得总的数据条数。我们使用前文说过的分页结果类进行包装 ,返回到Controller层进行处理。
@PostMapping("/findAllUser")
public CommonResult<PageResult<User>> findAllUser(@Valid @RequestBody PageParamDTO ppDTO) {
PageResult<User> allUser = adminService.findAllUser(ppDTO);
return new CommonResult<>(20000, "OK", allUser);
}
首先我们先往User表中插入数条数据(为了便于查看效果,我们在这里就不使用Postman进行新增用户操作,而是直接通过SQLYog向表中插入数据):
然后启动项目(先在拦截器配置类中放行相关接口)使用 postman进行如下测试:
可以看到我们成功的把四条记录都已经查询出来,在这里各位读者也可以自行修改cp,ps的参数来体验一下不同的分页规则,我们更主要的是要测试一下能否正常排序:
通过id降序
通过id升序
通过id降序,如果id相同则通过nickname升序
大家可以在数据库中多插入一些数据 ,然后自己尝试一下相关的操作,通过PageParamDTO和PageParamCheckUtil我们不管前端传入几个待排序的字段都可以进行便捷的排序啦!
其他的需求点都大同小异(CRUD),不再单独编写相关文章啦(其实就是我懒 )。
后记
本系列的文章到这里已经临近尾声。由于水平有限时间匆忙,文章中难免出现纰漏与错误,项目构思时也有不足之处,希望看到这里的你能够对这个项目有自己的想法,同时也请各位读者指出文章中的不足之处,笔者将一一改正!祝各位看到这里的读者今后写码之路一帆风顺,永无BUG!我们下个系列再见~
后端的代码后续会整理发布在我的GitHub中,如果有需要的读者可以前往自取(求star求点赞! )
点这里前往我的GitHub
本次博客的内容也到此为止了,如果对博客内容有疑问可以私信联系笔者,如果这篇文章对你有用希望你能点一个赞,谢谢~