本文已参与「新人创作礼」活动,一起开启掘金创作之路。
分页的插件有多种,现简单记录一下使用Mybatis-plus的分页插件。
环境说明:
SpringBoot版本:2.3.2
数据库:MySQL
Mybatis-plus的Maven依赖:
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
首先要创建一个配置类:
package com.wl.standard.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author wl
* @date 2021/7/27
*/
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInnerInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInnerInterceptor.setMaxLimit(500L);
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
此部分参考官方文档:mp.baomidou.com/guide/page.…
然后编写一个分页参数的包装类:
package com.wl.standard.common;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wl.standard.utils.CommonUtils;
import lombok.Data;
import java.io.Serializable;
/**
* @author wl
* @date 2021/7/27
*/
@Data
public class PageInfo<T> implements Serializable {
private JSONArray records;
private long total;
private long pageSize;
private long current;
public void setPageInfo(IPage<T> page) {
this.total = page.getTotal();
this.pageSize = page.getSize();
this.current = page.getCurrent();
this.records = CommonUtils.listToJsonArray(page.getRecords());
}
}
Service层定义方法:
package com.wl.standard.service;
import java.util.List;
import com.wl.standard.common.PageInfo;
import com.wl.standard.entity.City;
/**
* @author wl
* @date 2021/7/27
*/
public interface CityService {
/**
* Mybatis-plus分页
* @param pageNum
* @param pageSize
* @return
*/
PageInfo<City> getPageInfo(Integer pageNum, Integer pageSize);
}
Service层实现:
package com.wl.standard.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.wl.standard.mapper.CityMapper;
import com.wl.standard.entity.City;
import com.wl.standard.service.CityService;
import lombok.extern.slf4j.Slf4j;
/**
* @author wl
* @date 2021/7/27
*/
@Slf4j
@Service
public class CityServiceImpl extends ServiceImpl<CityMapper, City> implements CityService{
@Override
public com.wl.standard.common.PageInfo<City> getPageInfo(Integer pageNum, Integer pageSize) {
Page<City> cityPage = new Page<>(pageNum, pageSize);
com.wl.standard.common.PageInfo<City> pageInfo = new com.wl.standard.common.PageInfo<>();
pageInfo.setPageInfo(baseMapper.selectPage(cityPage, null));
return pageInfo;
}
}
Dao层代码省略
Controller层:
package com.wl.standard.controller;
import com.wl.standard.common.result.HttpResult;
import com.wl.standard.common.result.HttpResultWithPage;
import com.wl.standard.entity.City;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.wl.standard.service.CityService;
import java.util.List;
/**
* @author wl
* @date 2021/7/14
*/
@RestController
@RequestMapping("/city")
public class CityController {
private final CityService cityService;
@Autowired
public CityController(CityService cityService) {
this.cityService = cityService;
}
@GetMapping("/getPageInfo")
public HttpResultWithPage<City> getPageInfo(@RequestParam(value = "pageNum", required = false, defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize) {
return new HttpResultWithPage<>(cityService.getPageInfo(pageNum, pageSize));
}
}
其中返回结果的包装类和工具类代码如下:
package com.wl.standard.common.result;
import com.wl.standard.common.PageInfo;
/**
* @author wl
* @date 2021/7/27
*/
public class HttpResultWithPage<T> extends HttpResult{
private PageInfo<T> pageInfo;
public HttpResultWithPage(PageInfo<T> pageInfo) {
this.pageInfo = pageInfo;
setData(pageInfo.getRecords());
pageInfo.setRecords(null);
}
public HttpResultWithPage() {
super();
}
public PageInfo<T> getPageInfo() {
return this.pageInfo;
}
}
package com.wl.standard.common.result;
import lombok.Data;
@Data
public class HttpResult {
private String code;
private String msg;
private Object data;
public HttpResult() {
this.code = HttpResultCode.SUCCESS.getCode();
this.msg = HttpResultCode.SUCCESS.getMsg();
}
public HttpResult(String code, String msg) {
this.code = code;
this.msg = msg;
}
public HttpResult(HttpResultCode restResultCode) {
this.code = restResultCode.getCode();
this.msg = restResultCode.getMsg();
}
public HttpResult(Object data) {
this.code = HttpResultCode.SUCCESS.getCode();
this.msg = HttpResultCode.SUCCESS.getMsg();
this.setData(data);
}
public static HttpResult success() {
return new HttpResult();
}
public static HttpResult fail(String msg) {
return new HttpResult(HttpResultCode.FAIL.getCode(), msg);
}
}
package com.wl.standard.common.result;
public enum HttpResultCode {
// 成功
SUCCESS("200", "success"),
// 失败
FAIL("10000", "fail"),
// 请求方式不支持
REQUEST_METHOD_NOT_SUPPORTED("10002", "请求方式不支持"),
// 方法参数不正确
REQUEST_METHOD_ARGUMENT_NOT_VALID("10003", "方法参数不正确"),
// 用户名密码解密异常
USERNAME_PASSWORD_DECRYPT_ERROR("10004", "用户名密码解密异常"),
// service层错误
SERVICE_EXCEPTION("10005", ""),
// 数据源访问错误
DATA_SOURCE_ACCESS_ERROR("10006", "数据源访问错误"),
// 文件内容错误
INVALID_FILE_DATA("10007", "文件内容错误"),
// 系统内部错误
SYSTEM_ERROR("50000", "系统内部错误");
/**
* 返回状态码
*/
private String code;
/**
* 返回状态信息
*/
private String msg;
HttpResultCode(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
package com.wl.standard.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.regex.Pattern;
/**
* @author wl
* @date 2021/7/14
*/
public class CommonUtils {
private static final int DEFAULT_PAGE_NUM = 1;
private static final int DEFAULT_PAGE_SIZE = 10;
public static <T> JSONArray listToJsonArray(List<T> list) {
return JSONArray.parseArray(JSON.toJSONString(list, SerializerFeature.WriteMapNullValue));
}
public static <T> JSONArray listToJsonArray(List<T> list, boolean formatDate) {
return formatDate ? JSONArray.parseArray(JSON.toJSONString(list, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue))
: JSONArray.parseArray(JSON.toJSONString(list, SerializerFeature.WriteMapNullValue));
}
}
测试:
不传值
传值