一 修改pom文件

最外层的pom.xml增加如下配置

若依使用的是3.8.6的
自带的pagehelper用的1.4.6里面的jsqlparser用的4.5.0
mybatis-plus用的3.4.2里面的jsqlparser用的4.0.0

<pagehelper.boot.version>1.4.6</pagehelper.boot.version>

pagehelper需要修改如下,

           <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
                <exclusions>
                    <exclusion>
                        <artifactId>mybatis-spring</artifactId>
                        <groupId>org.mybatis</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>mybatis</artifactId>
                        <groupId>org.mybatis</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>jsqlparser</artifactId>
                        <groupId>com.github.jsqlparser</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

plus包需要新增
hutool工具包和lombok工具包如果不需要的话可以自行删除并修改后面的类里面的代码

   
			<!--mybatis-plus-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.2</version>
            </dependency>
            <!--hutool开发工具包-->
	        <dependency>
	            <groupId>cn.hutool</groupId>
	            <artifactId>hutool-all</artifactId>
	            <version>5.2.5</version>
	        </dependency>
	        <!--lombok开发工具包-->
	        <dependency>
	            <groupId>org.projectlombok</groupId>
	            <artifactId>lombok</artifactId>
	            <version>1.18.22</version>
	        </dependency>

common模块的pom文件加入如下配置

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

jsqlparser包,不剔除是这样的,有个冲突,建议保留plus里面的版本
解决冲突的好办法看这个文章
https://blog.csdn.net/lh155136/article/details/121907377
在这里插入图片描述

二 framework模块的config包增加三个类

MybatisPlusPageConfigurer

package cn.chinaunicom.sh.wxy.config;

import com.baomidou.mybatisplus.annotation.DbType;
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;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author admin
 */
@Configuration(proxyBeanMethods = false)
public class MybatisPlusPageConfigurer implements WebMvcConfigurer {

	/**
	 * SQL 过滤器避免SQL 注入
	 * @param argumentResolvers
	 */
	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
		argumentResolvers.add(new SqlFilterArgumentResolver());
	}

	/**
	 * 分页插件
	 */
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
		return interceptor;
	}

	/**
	 * 审计字段自动填充
	 * @return {@link MetaObjectHandler}
	 */
	@Bean
	public MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {
		return new MybatisPlusMetaObjectHandler();
	}

}

SqlFilterArgumentResolver

package cn.chinaunicom.sh.wxy.config;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * 解决Mybatis Plus Order By SQL注入问题
 * @author admin
 */
@Slf4j
public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver {

	private final static String[] KEYWORDS = { "master", "truncate", "insert", "select", "delete", "update", "declare",
			"alter", "drop", "sleep" };

	/**
	 * 判断Controller是否包含page 参数
	 * @param parameter 参数
	 * @return 是否过滤
	 */
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return parameter.getParameterType().equals(Page.class);
	}

	/**
	 * @param parameter 入参集合
	 * @param mavContainer model 和 view
	 * @param webRequest web相关
	 * @param binderFactory 入参解析
	 * @return 检查后新的page对象
	 * <p>
	 * page 只支持查询 GET .如需解析POST获取请求报文体处理
	 */
	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
								  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {

		HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

		String[] ascs = request.getParameterValues("ascs");
		String[] descs = request.getParameterValues("descs");
		String current = request.getParameter("current");
		String size = request.getParameter("size");

		Page<?> page = new Page<>();
		if (StrUtil.isNotBlank(current)) {
			page.setCurrent(Long.parseLong(current));
		}

		if (StrUtil.isNotBlank(size)) {
			page.setSize(Long.parseLong(size));
		}
		List<OrderItem> orderItemList = new ArrayList<>();
		Optional.ofNullable(ascs).ifPresent(s -> orderItemList.addAll(
				Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList())));
		Optional.ofNullable(descs).ifPresent(s -> orderItemList.addAll(
				Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList())));
		page.addOrder(orderItemList);
		return page;
	}

	/**
	 * 判断用户输入里面有没有关键字
	 * @return Predicate
	 */
	private Predicate<String> sqlInjectPredicate() {
		return sql -> {
			for (String keyword : KEYWORDS) {
				if (StrUtil.containsIgnoreCase(sql, keyword)) {
					return false;
				}
			}
			return true;
		};
	}
}

MybatisPlusMetaObjectHandler

package com.ruoyi.framework.config;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.util.ClassUtils;

import java.nio.charset.Charset;
import java.util.Date;

/**
 * MybatisPlus 自动填充配置
 *
 * @author admin
 */
@Slf4j
public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {

	@Override
	public void insertFill(MetaObject metaObject) {
		log.debug("mybatisPlus插入填充--------------");
		Date date = new Date();

		fillValIfNullByName("createTime", date, metaObject, false);
		fillValIfNullByName("updateTime", date, metaObject, false);
		fillValIfNullByName("createBy", getUserName(), metaObject, false);
		fillValIfNullByName("updateBy", getUserName(), metaObject, false);
		fillValIfNullByName("deleteFlag", "1", metaObject, false);
	}

	@Override
	public void updateFill(MetaObject metaObject) {
		log.debug("mybatisPlus更新填充--------------");
		fillValIfNullByName("updateTime", new Date(), metaObject, true);
		fillValIfNullByName("updateBy", getUserName(), metaObject, true);
	}

	/**
	 * 填充值,先判断是否有手动设置,优先手动设置的值,例如:job必须手动设置
	 * @param fieldName 属性名
	 * @param fieldVal 属性值
	 * @param metaObject MetaObject
	 * @param isCover 是否覆盖原有值,避免更新操作手动入参
	 */
	private static void fillValIfNullByName(String fieldName, Object fieldVal, MetaObject metaObject, boolean isCover) {
		// 1. 没有 get 方法
		if (!metaObject.hasSetter(fieldName)) {
			return;
		}
		// 2. 如果用户有手动设置的值
		Object userSetValue = metaObject.getValue(fieldName);
		String setValueStr = StrUtil.str(userSetValue, Charset.defaultCharset());
		if (StrUtil.isNotBlank(setValueStr) && !isCover) {
			return;
		}
		// 3. field 类型相同时设置
		Class<?> getterType = metaObject.getGetterType(fieldName);
		if (ClassUtils.isAssignableValue(getterType, fieldVal)) {
			metaObject.setValue(fieldName, fieldVal);
		}
	}

	/**
	 * 获取 spring security 当前的用户名
	 * @return 当前用户名
	 */
	private String getUserName() {
		LoginUser loginUser = SecurityUtils.getLoginUser();
		return loginUser.getUsername();
	}

}

三 全局搜索com.ruoyi.framework.config.MyBatisConfig类,将此类注释掉

四 yml注掉mybatis,粘贴plus的配置

如果配置不同,请自行修改

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  check-config-location: true
  type-aliases-package: com.ruoyi.**.domain
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

五 修改service和mapper层

mapper接口继承BaseMapper<你的Entity>

public interface PageInfoMapper extends BaseMapper<PageInfoEntity> {

service接口继承IService<你的Entity>接口

public interface IPageInfoService extends IService<PageInfoEntity> {

service类继承ServiceImpl<你的Mapper,你的Entity>类 实现 你的Service接口

public class PageInfoServiceImpl extends ServiceImpl<PageInfoMapper, PageInfoEntity> implements IPageInfoService {

你的Entity类上面需要增加表的名字

@TableName("business_info")
public class BusinessInfoEntity

六 BaseController重载一个getDataTable

    protected TableDataInfo getDataTable(List<?> list, Long total)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(total);
        return rspData;
    }

在这里插入图片描述

七 写个plus的分页测试一下

	@GetMapping("/getPageInfoPage")
    public TableDataInfo getPageInfoPage(Page page, InfoReq infoReq) {
        
        Page<InfoEntity> page1 = businessInfoService.page(page, new QueryWrapper<InfoEntity>());

        return getDataTable(page1.getRecords(), page1.getTotal());
    }

我用的前端写的请求,返回的格式和原来的一样,已兼容
在这里插入图片描述
在这里插入图片描述
日志如下,到此就分页兼容了

在这里插入图片描述

八 测试一个plus的修改功能

        InfoEntity entity = new InfoEntity();
        entity.setCustName("哈哈哈");
        Long id = 1L;
        businessInfoService.update(entity, new QueryWrapper<InfoEntity>().lambda().eq(InfoEntity::getId, id));

看日志也没问题
在这里插入图片描述

Logo

快速构建 Web 应用程序

更多推荐