配置Mybatis-plus分页插件,返回统一结果集 一、M

一、MyBatisPlusConfig中配置分页插件

1
2
3
4
5
6
7
8
9
10
11
java复制代码   /**
* 配置分页插件
* @return page
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
  1. 分页实现的原理

Mybatis-plus分页插件使用的是IPage进行分页。IPage内部原理是基于拦截器,拦截的是方法以及方法中的参数。判断是否是查询操作,如果是查询操作,才会进入分页的处理逻辑。 进入分页逻辑处理后,拦截器会通过反射获取该方法的参数进行判断是否存在IPage对象的实现类。如果不存在则不进行分页,存在则将该参数赋值给IPage对象,然后进行拼接sql的处理完成分页操作。

在这里插入图片描述

二、统一结果集

  1. 创建返回码定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
java复制代码public class ResultCode {

/**
* 成功
**/
public final static int OK = 20000;
/**
* 失败
**/
public final static int ERROR = 20001;
/**
* 用户名或密码错误
**/
public final static int LOGIN_ERROR = 20002;
/**
* 权限不足
**/
public final static int ACCESS_ERROR = 20003;
/**
* 远程调用失败
**/
public final static int REMOTE_ERROR = 20004;
/**
* 重复操作
**/
public final static int REPEAT_ERROR = 20005;
}
  1. 创建结果集类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
java复制代码@Data
@ApiModel(value = "全局统一返回结果")
public class R implements Serializable {

public final static String OK_MSG = "请求成功";
public final static String FAIL_MSG = "请求失败";

@ApiModelProperty(value = "是否成功")
private boolean success;

@ApiModelProperty(value = "返回码")
private Integer code;

@ApiModelProperty(value = "返回消息")
private String message;

@ApiModelProperty(value = "返回数据")
private Object data;

@ApiModelProperty(value = "总条数")
private Long total;

@ApiModelProperty(value = "分页信息")
private PageInfo pageInfo;

@Data
public static class PageInfo {

@ApiModelProperty("当前页")
protected int currentPage;
@ApiModelProperty("页大小")
protected int pageSize;
@ApiModelProperty("总记录数")
protected long totalCount;
@ApiModelProperty("总页数")
protected long totalPage;

public PageInfo() {
}

@ConstructorProperties({"currentPage", "pageSize", "totalCount", "totalPage"})
public PageInfo(int currentPage, int pageSize, long totalCount, long totalPage) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.totalPage = totalPage;
}
}

private R(){}

private R(int code, String msg, Object data) {
this.code = code;
this.message = msg;
if (data instanceof Page<?>) {
Page<?> page = (Page<?>) data;
this.total = page.getTotal();
this.data = page.getRecords();
this.pageInfo = new PageInfo((int)page.getCurrent(), (int)page.getSize(), page.getTotal(), page.getPages());
} else {
this.data = data;
}
}

public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.OK);
r.setMessage("成功");
return r;
}
public static R ok(Object data) {
return new R(ResultCode.OK, OK_MSG, data);
}

public static R ok(String msg, Object data) {
return new R(ResultCode.OK, msg, data);
}

public static R error(){
R r = new R();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("失败");
return r;
}

public static R error(String msg) {
return new R(ResultCode.ERROR, msg, null);
}

public static R error(int errorCode, String msg) {
return new R(errorCode, msg, null);
}


public R message(String message){
this.setMessage(message);
return this;
}

public R code(Integer code){
this.setCode(code);
return this;
}

public R data(Object data){
this.setData(data);
return this;
}

}

三、编写分页接口

  1. 先编写查询类

代码如下:

1
2
3
4
5
6
java复制代码@Data
public class MemberQueryVo extends BasePageEntity{

@ApiModelProperty(value = "用户名")
private String userName;
}
  1. service层

先定义一个查询分页的接口,在实现类里做相关处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java复制代码@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {

@Override
public IPage<Member> listMemberPage(MemberQueryVo queryVo) {
IPage<Member> page = new Page<>(queryVo.getCurrentPage(),queryVo.getCurrentPage());
//条件查询
LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<Member>();

if (StringUtils.isNotBlank(queryVo.getUserName())) {
queryWrapper.like(Member::getUserName, queryVo.getUserName());
}

return baseMapper.selectPage(page,queryWrapper);
}
}
  1. controller层

编写分页接口,代码如下:

1
2
3
4
5
6
java复制代码    @ApiOperation(value = "分页用户列表")
@GetMapping(value = "/getPage")
public R listPage(MemberQueryVo queryVo){
IPage<Member> page = memberService.listMemberPage(queryVo);
return R.ok(page);
}
  1. 接口测试

直接通过swagger生成的api接口页面进行测试,当前页、每页参数传1时,返回的分页信息里,总数是两条,只返回了一条数据。说明分页成功。
在这里插入图片描述
再进行条件查询的时候,也成功查询对应数据。
在这里插入图片描述


总结

感谢大家的阅读,上就是今天要讲的内容,本文简单介绍了如何配置分页插件、以及分页的原理。如有不足之处,纯属能力有限,还请多多包涵。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%