MybatisPlus——分页实战
示例:编写一个UserController接口,实现User的分页查询:
说明:
如果排序字段为空,默认按照更新时间排序排序字段不为空,则按照排序字段排序
"pageNo":1.
"pageSize": 5,
"sortBy": "age",
"isAsc": false,
"name": "lcs"
定义查询类:
package com.example.mybatisplus03.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "分页查询实体")
public class PageQuery {
// 页数
@ApiModelProperty(value = "页码", example = "1")
private Integer pageNum;
// 每页条数
@ApiModelProperty(value = "每页条数", example = "10")
private Integer pageSize;
// 排序字段
@ApiModelProperty(value = "排序字段", example = "id")
private String orderBy;
// 排序方式,是否升序
@ApiModelProperty(value = "排序方式,是否升序", example = "true")
private Boolean isAsc;
}
定义实体类:
package com.example.mybatisplus03.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.example.mybatisplus03.query.PageQuery;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@TableName(value = "a_user", autoResultMap = true) // 默认表名, 可以自定义
@AllArgsConstructor
@NoArgsConstructor
public class User extends PageQuery {
private Integer id;
private String userName;
private String password;
private Integer age;
private float salary;
@TableField(typeHandler = JacksonTypeHandler.class) // 自定义类型处理器
private UserInfo userInfo;
public User(String s, String number, int i, float v) {
this.userName = s;
this.password = number;
this.age = i;
this.salary = v;
}
}
分页查询结果实体类:
package com.example.mybatisplus03.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "分页查询结果实体")
public class PagDTO<T> {
@ApiModelProperty(value = "总条数", example = "100")
private Integer total;
@ApiModelProperty(value = "总页数", example = "10")
private Integer pages;
@ApiModelProperty(value = "当前页数据", example = "10")
private List<T> list;
}
controller类:
@ApiOperation("分页查询用户")
@GetMapping("/user/page")
public PagDTO<User> selectUserByPage(UserQuery userQuery) {
return userService.selectUserByPage(userQuery);
}
Service类:
PagDTO<User> selectUserByPage(UserQuery userQuery);
Impl类:
@Override
public PagDTO<User> selectUserByPage(UserQuery userQuery) {
String userName = userQuery.getUserName();
Integer age = userQuery.getAge();
// 构建分页条件
Page<User> page = Page.of(userQuery.getPageNum(), userQuery.getPageSize());
// 如果排序条件不为空,构建排序条件,为空吗,默认为创建时间排序
if (userQuery.getOrderBy() != null && userQuery.getIsAsc() != null) {
page.addOrder(userQuery.getIsAsc() ? OrderItem.asc(userQuery.getOrderBy()) : OrderItem.desc(userQuery.getOrderBy()));
}
if (userName != null && age != null) {
// 查询条件不为空,构建查询条件
Page<User> userPage = lambdaQuery()
.like(User::getUserName, userName)
.eq(User::getAge, age)
.page(page);
}
// 返回分页结果
List<User> records = page.getRecords();
PagDTO<User> pagDTO = new PagDTO<>();
pagDTO.setTotal((int) page.getTotal());
pagDTO.setPages((int) page.getPages());
if (!CollectionUtils.isEmpty(records)) {
pagDTO.setList(records);
return pagDTO;
}
return pagDTO;
}