您现在的位置是:亿华云 > 应用开发

MybatisPlus与前端分页工具结合实现

亿华云2025-10-02 21:10:13【应用开发】6人已围观

简介虽然MybatisPlus提供了PaginationInnerInterceptor插件用来分页,并且该插件使用起来也还不错,但是我们开发项目的时候总是希望前后端搭配干活,实现一些好用的功能。比如说前

虽然MybatisPlus提供了PaginationInnerInterceptor插件用来分页,端分并且该插件使用起来也还不错,页工但是具结我们开发项目的时候总是希望前后端搭配干活,实现一些好用的合实功能。

比如说前端表单点击表头排序,端分这个功能我们就可以结合分页插件完成。页工而且我们现在很多时候会开发多端项目,具结在不同前端使用不同组件适配后端接口的合实时候,总可能遇到命名方式不一致的端分问题,比如A前端框架中当前页叫currPage,页工B框架中叫page等情况。具结基于这样的合实实际情况,我们需要对项目中MybatisPlus的端分分页进行一定程度的封装,让它能满足我们不同情况下的页工实际需要。

MybatisPlus与前端分页工具结合实现

首先是具结分页插件的配置

MybatisPlus与前端分页工具结合实现

@Configuration

MybatisPlus与前端分页工具结合实现

public class MPConfig {

@Bean

public MybatisPlusInterceptor mybatisPlusInterceptor() {

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

return interceptor;

}

}

配置好分页插件以后MybatisPlus就支持分页了,服务器租用可以使用service的page方法或者mapper的selectPage方法进行分页。这两个方法都需要传入

com.baomidou.mybatisplus.extension.plugins.pagination.Page对象,这个对象也就是实际用来分页的参数对象了。我们可以在这个对象中设置分页的页数,每页的数据数量,同时也可以设置排序的字段、排序的方式。但是排序字段是直接通过字符串连接的方式填写在sql中的,所以是存在sql注入的风险的,所以我们需要个过滤SQL注入工具类,我参考了JeecgBoot中的亿华云工具类,稍作修改

@Slf4j

public class SqlUtil {

private final static String xssStr = "|and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+";

public static void injection(String value) {

if (value == null || "".equals(value)) {

return;

}

value = value.toLowerCase();

String[] xssArr = xssStr.split("\\|");

for (String xss:xssArr) {

if(value.contains(xss)){

log.error("可能存在SQL注入风险:存在SQL注入关键词[{ }] 值[{ }]",xss,value);

throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);

}

}

}

public static void injection(String[] values) {

String[] xssArr = xssStr.split("\\|");

for (String value : values) {

if (value == null || "".equals(value)) {

return;

}

value = value.toLowerCase();

for (String xss:xssArr) {

if(value.contains(xss)){

log.error("可能存在SQL注入风险:存在SQL注入关键词[{ }] 值[{ }]",xss,value);

throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);

}

}

}

}

}

com.baomidou.mybatisplus.extension.plugins.pagination.Page这个分页工具只是提供了分页的功能,但是并不能很方便的直接拿来使用,所以我封装了一个工具类,用来通过我们写好的配置从参数中获取分页需要的信息以及配合前端Table排序的参数信息,并且过滤了SQL注入

public class Constant {

/

**

* 当前页码

*/

public static final String PAGE = "page";

/

**

* 每页显示记录数

*/

public static final String LIMIT = "pageSize";

/

**

* 排序字段

*/

public static final String ORDER_FIELD = "prop";

/

**

* 排序方式

*/

public static final String ORDER = "order";

/

**

* 升序

*/

public static final String ASC = "ascending";

}

public class PageParamsextends Page{

public PageParams(Mapparams){

super(getCurrPage(params),getPageSize(params));

// 排序

String orderField = (String)params.get(Constant.ORDER_FIELD);

String order = (String)params.get(Constant.ORDER);

if(StrUtil.isNotEmpty(orderField) && StrUtil.isNotEmpty(order)){

// SQL 注入过滤

SqlUtil.injection(orderField);

// 设置排序方式

if(Constant.ASC.equals(order)){

addOrder(OrderItem.asc(orderField));

}else {

addOrder(OrderItem.desc(orderField));

}

}

}

public PageParams(){

super(getCurrPage(null),getPageSize(null));

}

private static Long getCurrPage(Mapparams){

if(params != null && params.get(Constant.PAGE) != null){

return Long.parseLong((String)params.get(Constant.PAGE));

}

return 1L;

}

private static Long getPageSize(Mapparams){

if(params != null && params.get(Constant.LIMIT) != null){

return Long.parseLong((String)params.get(Constant.LIMIT));

}

return 10L;

}

}

相同的,不同的Table框架中接收的数据格式也有一些差别,我们分页方法返回的

com.baomidou.mybatisplus.core.metadata.IPage也不能满足我们的格式要求。所以根据实际情况封装一个工具类,用来返回我们需要的数据格式

@Data

public class PageResult implements Serializable {

public PageResult(IPage page){

this.page = page.getCurrent();

this.pageSize = page.getSize();

this.total = page.getTotal();

this.rows = page.getRecords();

}

private Long page;

private Long pageSize;

private Long total;

private List rows;

}

最后分页调用的时候就变得简单了

@GetMapping("/list")

public SaResult list(@RequestParam Mapparams){

IPagepage = userService.page(new PageParams(params),new LambdaQueryWrapper());

return SaResult.data(new PageResult(page));

}

源码库

很赞哦!(13395)