若依集成mybatisplus、兼容旧分页【亲测有效】

news2024/9/21 12:36:40

这里写目录标题

    • 一 修改pom文件
      • 最外层的pom.xml增加如下配置
      • common模块的pom文件加入如下配置
    • 二 framework模块的config包增加两个类
      • MybatisPlusPageConfigurer
      • SqlFilterArgumentResolver
    • 三 全局搜索com.ruoyi.framework.config.MyBatisConfig类,将此类注释掉
    • 四 yml注释掉mybatis,粘贴plus的配置
    • 五 修改service和mapper层
    • 六 BaseController重载一个getDataTable
    • 七 写个plus的分页测试一下
    • 八 测试一个plus的修改功能

一 修改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;
	}


}

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;
		};
	}
}

三 全局搜索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));

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel表中复制粘贴有隐藏行的情况

一、原始数据&#xff0c;没有任何隐藏的情况&#xff1a; 二、隐藏3、4行&#xff1a; 这种情况下&#xff1a; 三、我想复制粘贴出可见的内容&#xff0c;全选&#xff0c;ctrlc复制 四、ctrlv粘贴到别处&#xff0c;结果却是 发现隐藏的行也被复制粘贴出来了。并不是我们想…

求求你,别再用 Mybatis Plus 的伪批量新增了!

前言 大家好&#xff0c;我是小哈~ 本文节选自小哈写的《Mybatis Plus 教程》中的批量新增一节&#xff0c;旨在帮助大家如何在 Mybatis Plus 中&#xff0c;实现 MySQL 真实的批量新增&#xff0c;而不是伪批量新增。 最近&#xff0c;小哈在带小伙伴做 前后端分离项目&#x…

2023年MySQL-8.0.34保姆级安装教程

重点放前面&#xff1a;演示环境为windows环境。 MySQL社区版本安装教程如下&#xff1a; 一、MySQL安装包下载二、安装配置设置三、配置环境变量 大体分为3个步骤&#xff1a;①安装包的下载&#xff1b;②安装配置设置&#xff1b;③配置环境变量 一、MySQL安装包下载 下载官…

界面长的像算抄袭吗?

昨晚&#xff0c;在GitHub和X上&#xff0c;被一次疑似抄袭的问题刷了一会儿屏&#xff0c;主要是下面这个issue&#xff1a; 相关的开源项目是小米的米效&#xff0c;英文名&#xff1a;Mone。一个以微服务为中心的一站式企业协同研发平台。支持公有云、私有云、混合云等多种部…

Redis Cluster集群运维与核心原理剖析

Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性…

2023/09/07 c++qt day2

#include <iostream>using namespace std; //封装一个学生类 struct stu { private://存放学生的成绩int stu_score[256];//记录学生个数int stu_num; public://用于设置学生个数void setNum(){cout<<"请输入学生的个数"<<" ";cin>&g…

神策数据发布汽车行业 CJO 解决方案,打造客户旅程全新体验

最近&#xff0c;围绕数字化客户经营&#xff0c;神策数据基于“客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;”理念&#xff0c;发布汽车行业全新解决方案&#xff0c;通过全渠道打通给客户带来一致的、个性化的体验&#xff0c;…

如何做好自己的职业规划

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 进入公司以后&#xff0c;就是进入了人生的下一个阶段&#xff0c;通过前面几个章节&#xff0c;我们谈到了入职新公司后应该如何开展工作。这节我们来聊一聊如何做好职业规…

2594. 修车的最少时间

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【数组】 题目来源 2594. 修车的最少时间 题目解读 给你一个表示机械工能力的数组 ranks&#xff0c;ranks[i] 表示第 i 位机械工可以在 r a n k s [ i ] ∗ n 2 ranks[…

【三维】NeRF神经辐射场构建三维模型

论文地址&#xff1a;paper 代码地址&#xff1a;code 视频地址&#xff1a;油管 目录 0.&#x1f308;&#x1f308;摘要 1.&#x1f308;&#x1f308;nerf主要原理 2.&#x1f308;&#x1f308;网络结构 2.1&#x1f4cc;渲染 2.2&#x1f4cc;消融实验 3.&#x…

链表反转问题

链表反转常用的两种方式 1.建立虚拟头结点辅助反转 Java 实现 public static ListNode reverseListByDummyNotCreate(ListNode head) {ListNode ans new ListNode(-1);ListNode cur head;while (cur ! null) {ListNode next cur.next;cur.next ans.next;ans.next cur;cur…

抖音集团都在用的画质评估工具,确定不试试吗?

导读 本文从抖音集团内部画质评估体系的建设历程着笔&#xff0c;主要分享了画质评测对于业务的重要性、主要应用场景和内部产品的一些典型实践案例。通过分享业务视角遇到的一些问题和我们的解决思路&#xff0c;希望能抛砖引玉&#xff0c;为遇到类似困扰的伙伴们提供有价值的…

[C++学习] 多进程通信共享内存

ref:https://blog.csdn.net/qq_35733751/article/details/82872197 多线程共享进程的地址空间&#xff0c;如果多个线程需要访问同一块内存&#xff0c;用全局变量即可。 在多进程中&#xff0c;每个进程的地址空间是独立的&#xff0c;不共享的&#xff0c;如果多个进程需要访…

Redis持久化、主从与哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次数…

yolov7添加pconv模块

连接pconv 1、复制到models-common.py文件最后 2、添加模块到yolo.py 3、修改网络&#xff0c;建议替换3x3的卷积&#xff0c;后面的参数不要了 4、不能替换步长为2的卷积

CSS笔记(黑马程序员pink老师前端)浮动,清除浮动

浮动可以改变标签的默认排列方式。浮动元素常与标准流的父元素搭配使用. 网页布局第一准则:多个块级元素纵向排列找标准流&#xff0c;多个块级元素横向排列找浮动。 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框…

【算法系列篇】分治-快排

文章目录 前言什么是分冶1.颜色分类1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 排序数组2.1 题目要求2.2 做题思路2.3 Java代码实现 3.数组中的第k个最大元素3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 最小的k个数4.1 题目要求4.2 做题思路4.3 Java代码实现 总结 前言 …

前端面试题合集(一)

前端面试题合集 1.js异步方案2.文件上传如何限制文件类型3. 说出 与的区别4.多维数组如何降维5.如何给一个按钮绑定两个onclick事件 1.js异步方案 js异步方法分为两种&#xff0c;分别为defer和async,如果没有写其中一种的话代码从上到下同步执行&#xff0c;遇到脚本代码之后…

埋头干活不会汇报,别说 996 就算 007 也没用!

​ 见字如面&#xff0c;我是军哥&#xff01; 经调研发现 80% 的程序员认为工作汇报就是形式主义&#xff0c;无聊至极&#xff0c;但是我要和你说&#xff0c;做好工作汇报非常重要&#xff0c;这直接关系到你在这家公司能否快速成长和晋升加薪&#xff0c;而且要告诉你一件扎…

vue3:18、Pinia持久化(pinia-plugin-persistedstate)

安装插件 npm i pinia-plugin-persistedstate main.js中引入 import { createApp } from vue import { createPinia } from pinia import App from ./App.vue import piniaPluginPersistedstate from pinia-plugin-persistedstate // createApp(App).use(CreatePinia()).mou…