SpringBoot+Mybatis-plus分页

2,477 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

分页的插件有多种,现简单记录一下使用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));
    }
 
}

测试:

不传值

image.png

传值

image.png