ruoyi-vue整合mybatis-plus

news/2025/3/20 16:07:21/文章来源:https://www.cnblogs.com/zhangzl419/p/18783288

提纲
1 顶层pom中引入mybatis-plus
2 ruoyi-common中引入mybatis-plus
3 ruoyi-framework中引入mybatis-plus
4 ruoyi-admin项目下application.yml中配置mybatis-plus



1 顶层pom中引入mybatis-plus

有些文章中说要家pagehelper,但是我发现ruoyi-vue后端项目中已经有pagehelper了,所以就不加了。

<mybatis-plus.version>3.5.2</mybatis-plus.version>
<lombok.version>1.18.12</lombok.version>
<!-- mybatis-plus依赖 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version>
</dependency>
<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version>
</dependency>


2 ruoyi-common项目下pom中引入mybatis-plus

<!-- mybatis-plus依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>


3 ruoyi-framework下的pom中引入mybatis-plus

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

ruoyi-framework/src/main/java/com.ruoyi.framework/config中删除MybatisConfig类,增加MybatisPlusConfig类

package com.ruoyi.framework.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;@Configuration
public class MybatisPlusConfig {static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";@Autowiredprivate Environment env;public static String setTypeAliasesPackage(String typeAliasesPackage) {ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);List<String> allResult = new ArrayList<String>();try {for (String aliasesPackage : typeAliasesPackage.split(",")) {List<String> result = new ArrayList<String>();aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;Resource[] resources = resolver.getResources(aliasesPackage);if (resources != null && resources.length > 0) {MetadataReader metadataReader = null;for (Resource resource : resources) {if (resource.isReadable()) {metadataReader = metadataReaderFactory.getMetadataReader(resource);try {result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());} catch (ClassNotFoundException e) {e.printStackTrace();}}}}if (result.size() > 0) {HashSet<String> hashResult = new HashSet<String>(result);allResult.addAll(hashResult);}}if (allResult.size() > 0) {typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));} else {throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");}} catch (IOException e) {e.printStackTrace();}return typeAliasesPackage;}public Resource[] resolveMapperLocations(String[] mapperLocations) {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<Resource> resources = new ArrayList<Resource>();if (mapperLocations != null) {for (String mapperLocation : mapperLocations) {try {Resource[] mappers = resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {// ignore}}}return resources.toArray(new Resource[resources.size()]);}/*** 新版配置** @return*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//能够添加很多拦截器实现mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//乐观锁拦截器mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}

ruoyi-framework/src/main/java/com.ruoyi.framework/下创建mybatisplus包,包下创建MyMetaObjectHandler类

package com.ruoyi.framework.mybatisplus;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;
import java.time.LocalDateTime;@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {public static final String CREATE_BY = "createBy";public static final String CREATE_TIME = "createTime";public static final String UPDATE_BY = "updateBy";public static final String UPDATE_TIME = "updateTime";public static final String DELETED = "delFlag";/*** 插入时的填充策略*/@Overridepublic void insertFill(MetaObject metaObject) {// 起始版本 3.3.0(推荐使用)this.setFieldValByName(CREATE_BY, SecurityUtils.getUsername(), metaObject);this.setFieldValByName(CREATE_TIME, formatDate(metaObject.getSetterType(CREATE_TIME)), metaObject);this.setFieldValByName(UPDATE_BY, SecurityUtils.getUsername(), metaObject);this.setFieldValByName(UPDATE_TIME, formatDate(metaObject.getSetterType(CREATE_TIME)), metaObject);this.setFieldValByName(DELETED, "0", metaObject);}/*** 更新时的填充策略*/@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName(UPDATE_BY, SecurityUtils.getUsername(), metaObject);this.setFieldValByName(UPDATE_TIME, formatDate(metaObject.getSetterType(CREATE_TIME)), metaObject);}/*** 处理特殊日期** @param setterType 参数类型* @return 日期类型*/private Object formatDate(Class<?> setterType) {if (Date.class.equals(setterType)) {return new Date();} else if (LocalDateTime.class.equals(setterType)) {return LocalDateTime.now();} else if (Long.class.equals(setterType)) {return System.currentTimeMillis();}return null;}
}


4 ruoyi-admin项目下application.yml中配置mybatis-plus

ruoyi-admin下application.yml中一定要注释掉mybatis配置,加上mybatis-plus的配置

# MyBatis配置
#mybatis:
#  # 搜索指定包别名
#  typeAliasesPackage: com.ruoyi.**.domain
#  # 配置mapper的扫描,找到所有的mapper.xml映射文件
#  mapperLocations: classpath*:mapper/**/*Mapper.xml
#  # 加载全局的配置文件
#  configLocation: classpath:mybatis/mybatis-config.xml# Mybatis-plus的配置
mybatis-plus:# 对应的 XML 文件位置mapperLocations: classpath*:mapper/**/*Mapper.xml# 实体扫描,多个package用逗号或者分号分隔typeAliasesPackage: com.ruoyi.**.domain# 针对 typeAliasesPackage,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象#typeAliasesSuperType: Class<?># 如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler#typeHandlersPackage: null# 如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性#typeEnumsPackage: null# 启动时是否检查 MyBatis XML 文件的存在,默认不检查checkConfigLocation: false# 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种:# SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句(PreparedStatement)# REUSE:该执行器类型会复用预处理语句(PreparedStatement)# BATCH:该执行器类型会批量执行所有的更新语句executorType: SIMPLE# 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署configurationProperties: nullconfiguration:# 自动驼峰命名规则(camel case)映射# 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名mapUnderscoreToCamelCase: true# 默认枚举处理类,如果配置了该属性,枚举将统一使用指定处理器进行处理# org.apache.ibatis.type.EnumTypeHandler : 存储枚举的名称# org.apache.ibatis.type.EnumOrdinalTypeHandler : 存储枚举的索引# com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler : 枚举类需要实现IEnum接口或字段标记@EnumValue注解.defaultEnumTypeHandler: org.apache.ibatis.type.EnumTypeHandler# 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。aggressiveLazyLoading: true# MyBatis 自动映射策略# NONE:不启用自动映射# PARTIAL:只对非嵌套的 resultMap 进行自动映射# FULL:对所有的 resultMap 都进行自动映射autoMappingBehavior: PARTIAL# MyBatis 自动映射时未知列或未知属性处理策# NONE:不做任何处理 (默认值)# WARNING:以日志的形式打印相关警告信息# FAILING:当作映射失败处理,并抛出异常和详细信息autoMappingUnknownColumnBehavior: NONE# Mybatis一级缓存,默认为 SESSION# SESSION session级别缓存,同一个session相同查询语句不会再次查询数据库# STATEMENT 关闭一级缓存localCacheScope: SESSION# 开启Mybatis二级缓存,默认为 truecacheEnabled: trueglobal-config:# 是否打印 Logo bannerbanner: true# 是否初始化 SqlRunnerenableSqlRunner: falsedbConfig:# 主键类型# AUTO 数据库ID自增# NONE 空# INPUT 用户输入ID# ASSIGN_ID 全局唯一ID# ASSIGN_UUID 全局唯一ID UUIDidType: AUTO# 表名前缀tablePrefix: null# 字段 format,例: %s,(对主键无效)columnFormat: null# 表名是否使用驼峰转下划线命名,只对表名生效tableUnderline: true# 大写命名,对表名和字段名均生效capitalMode: false# 全局的entity的逻辑删除字段属性名logicDeleteField: null# 逻辑已删除值logicDeleteValue: 2# 逻辑未删除值logicNotDeleteValue: 0# 字段验证策略之 insert,在 insert 的时候的字段验证策略# IGNORED 忽略判断# NOT_NULL 非NULL判断# NOT_EMPTY 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)# DEFAULT 默认的,一般只用于注解里# NEVER 不加入 SQLinsertStrategy: NOT_NULL# 字段验证策略之 update,在 update 的时候的字段验证策略updateStrategy: NOT_NULL# 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件selectStrategy: NOT_NULL


参考资料
1、https://blog.csdn.net/qq_27480007/article/details/130522139
2、https://www.jb51.net/program/330752f1y.htm



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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原厂】点阵LED数码管驱动/内置显示RAM为8x16位-LED显示驱动芯片VK1640 SOP28

产品品牌:永嘉微电/VINKA 产品型号:VK1640 封装形式:SOP28 概述 VK1640是一种数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、LED 驱 动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx16GRID的点阵LED显示。 适用于小型LED显示屏驱动。采用SOP28的封装形式…

portainer学习笔记1

Portainer是一款非常好用的docker容器管理平台,部署也很easy。# 创建portainer数据卷 docker volume create portainer_data # 拉取镜像启动portainer docker run -d -p 8000:8000 -p 9443:9443 \ --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/dock…

安装Python保姆级教程(Pycharm破解码+解释器安装)

一、进入Python官网首页,下载最新的Python版本 https://www.python.org/downloads/ 选择最新的Python3.10.5,下载64位的版本 二、下载完成后,进行安装 1.双击Python-3.10.5-amd64.exe 3.出现此页面表示安装成功 三、运行Python 1.Win+R打开控制台,输入Python 此时出现了一…

dify知识库

一、概述 知识库功能将 RAG 管线上的各环节可视化,提供了一套简单易用的用户界面来方便应用构建者管理个人或者团队的知识库,并能够快速集成至 AI 应用中。 开发者可以将企业内部文档、FAQ、规范信息等内容上传至知识库进行结构化处理,供后续 LLM 查询。 相比于 AI 大模型内…

DevOps 平台选型对比:功能与价值剖析

在数字化转型加速的当下,高效的软件开发流程成为企业竞争力的关键。DevOps 平台作为整合开发与运维的重要工具,其选型至关重要。Gitee DevOps 是一款在行业内表现出色的平台,能为企业提供从代码管理到部署上线的全流程支持。通过对其功能、价格、用户体验等多方面与市场竞品…

关于如何搭建anythingllm+ollama(deepseekr1、嵌入模型)+milvus的本地知识库语言模型

这里只是对于自己在部署过程中踩到的坑做个记录。 以anythingllm为平台,接入基于ollama运行deepseekr1通用模型、嵌入模型,使用milvus作为向量数据库。其中milvus和anythingllm均在docker desktop中运行。 一、ollama 1.首先在ollama官网下载并安装ollama。 2.然后在官网的mo…

Endnote 修改了参考文献格式后,文献的引用有的上标,有的不是上标

如上图,有的文献引用是正常格式,有的文献引用的的方括号是上标的形式。解决如下: 打开Endnote,找到“编辑”---“输出样式”---“编辑XXXXXX”(XXXXXX表示你正在使用的参考文献格式)---“引用”---“模板”---“Citatian” 将方框中的“Bibliography Number”两边的方括号…

Explain查询Sql效率

Explain分析Sql性能 前言 在我们平时开发中,因为系统可能属于初级阶段,数据库的数据还不是很多,所以自我感觉写的Sql语句上运行起来速度还不错,殊不知,随着时间推移,数据量日益增多,系统的查询效率会在打折扣,所以,Sql性能调优手段还得了解一下下。 Explain是什么?有…

部署mall项目遇到的问题和解决方案

部署mall项目爬坑日记 原作者项目 环境:ubuntu20 docker容器相关的坑 发现容器打印的日志和当前时间有出入,相差了8小时,后面得知容器和宿主机的时区不同导致 !> 解决办法有如下几种:1.在刚开始创建容器的时候,docker run后面加上-v /etc/localtime:/etc/localtime:ro2…

高并发下如何保证幂等性

好文章怕丢失?码起来! 本文转载自原文 高并发下如何保证接口的幂等性? 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场…

考OCP认证要交哪些费用?

考OCP认证要交哪些费用? 考OCP认证,指的是Oracle数据库管理员中级认证 Oracle Certified Professional,这是Oracle非常有名的一个认证,对于个人帮助巨大。 OCP认证要交不少钱,些费用因考试版本、培训机构和地区差异而有所不同,以下是综合各渠道信息后的费用说明: 1. 考…

JDK 24 发布,新特性解读!

真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22、Java 23一样。 下一个长期支持版是 Java 25,预计今年 9 月份发布。 Java 24 带来的新特性还是蛮多的,一共 24 个。Java 23 和 Java 23 都只有 12 个,Java 24的新特性相当于这…