当前位置: 首页 > 科技观察

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

时间:2023-03-12 10:51:12 科技观察

虽然MybatisPlus提供了PaginationInnerInterceptor插件来进行分页,而且这个插件也不错用,但是我们在开发项目的时候,总是希望前端和后端协同工作,实现一些有用的功能。比如点击前端表单的表头进行排序。我们可以将这个功能与分页插件结合起来完成。而且我们现在经常开发多端项目。当不同的前端使用不同的组件适配后端接口时,我们可能总会遇到命名方式不一致的情况。比如A前端框架中的当前页面叫做currPage,B框架中叫做page等条件。基于这种实际情况,我们需要在项目中对MybatisPlus的分页进行一定程度的封装,使其能够满足我们在不同情况下的实际需求。首先是分页插件的配置@ConfigurationpublicclassMPConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQLInterceptor)稍后配置pager插件);MybatisPlus支持分页,可以使用service的page方法或者mapper的selectPage方法进行分页。两种方法都需要传入com.baomidou.mybatisplus.extension.plugins.pagination.Page对象,也就是实际用于分页的参数对象。我们可以在这个对象中设置分页的页数和每页的数据量,以及排序字段和排序方式。但是排序字段是直接通过字符串拼接填入sql中的,所以存在sql注入的风险,所以我们需要一个过滤sql注入的工具类。我参考了JeecgBoot中的工具类,稍作修改@Slf4jpublicclassSqlUtil{privatefinalstaticStringxssStr="'|and|exec|insert|select|delete|update|drop|count|chr|mid|master|truncate|char|声明|;|或|+";publicstaticvoidinjection(Stringvalue){if(value==null||"".equals(value)){返回;}value=value.toLowerCase();String[]xssArr=xssStr.split("\\|");for(Stringxss:xssArr){if(value.contains(xss)){log.error("可能存在SQL注入风险:存在SQL注入关键字[{}]值[{}]",xss,价值);thrownewRuntimeException("请注意该值可能存在SQL注入风险!--->"+value);}}}publicstaticvoidinjection(String[]values){String[]xssArr=xssStr.split("\\|");for(Stringvalue:values){if(value==null||"".equals(value)){返回;}值=value.toLowerCase();for(Stringxss:xssArr){if(value.contains(xss)){log.error("可能存在SQL注入风险:存在SQL注入关键字[{}]值[{}]",xss,价值);thrownewRuntimeException("请注意该值可能存在SQL注入风险!--->"+value);}}}}}com.baomidou.mybatisplus.extension.plugins.pagination.Page这个页面工具只提供了分页的功能,但是直接使用不是很方便,所以封装了一个工具类来获取信息需要分页的参数通过我们写的配置和匹配前端Table排序信息的参数,过滤SQL注入publicclassConstant{/***当前页码*/publicstaticfinalStringPAGE="page";/***每页显示的记录数*/publicstaticfinalStringLIMIT="pageSize";/***排序字段*/publicstaticfinalStringORDER_FIELD="prop";/***排序方法*/publicstaticfinalStringORDER="order";/***升序*/publicstaticfinalStringASC="ascending";}publicclassPageParamsextendsPage{publicPageParams(Mapparams){超级(getCurrPage(参数),getPageSize(参数));//排序StringorderField=(String)params.get(Constant.ORDER_FIELD);字符串顺序=(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));}}}publicPageParams(){super(getCurrPage(null),getPageSize(null));}privatestaticLonggetCurrPage(Mapparams){if(params!=null&¶ms.get(Constant.PAGE)!=null){returnLong.parseLong((String)params.get(Constant.PAGE));}返回1L;}privatestaticLonggetPageSize(Mapparams){if(params!=null&¶ms.get(Constant.LIMIT)!=null){returnLong.parseLong((String)params.get(Constant.LIMIT));}返回10L;}}相同,不同Tableframe接收到的数据格式也有一些差异。我们的分页方法返回的com.baomidou.mybatisplus.core.metadata.IPage不能满足我们的格式要求,所以我们根据实际情况封装了一个工具类来返回我们需要的数据格式@DatapublicclassPageResultimplementsSerializable{publicPageResult(IPage页面){this.page=page.getCurrent();this.pageSize=page.getSize();this.total=page.getTotal();this.rows=page.getRecords();}私有长页面;私有长页面大小;私有龙总;privateListrows;}最后调用分页就简单了@GetMapping("/list")publicSaResultlist(@RequestParamMapparams){IPagepage=userService.page(newPageParams(params),newLambdaQueryWrapper());返回SaResult.data(新的PageResult(页面));}