当前位置: 首页 > news >正文

SpringBoot3 + MyBatisPlus 快速整合

一、前言

MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。 这个发展到目前阶段已经很成熟了,社区也比较活跃,可以放心使用。官网地址:https://baomidou.com

二、快速开始

引入依赖

这里我引入了核心 starter 依赖,以及官方提供的代码生成器依赖,如果你不用代码生成器可以不引用

<properties><mybatis-plus.version>3.5.7</mybatis-plus.version> <!-- mybatis增强 orm 框架 -->
</properties><dependencies><!--   mybatis-plus 相关依赖   --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- 代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version></dependency><!--  mysql 依赖 版本由继承的 spring-boot-starter-parent 控制,也可以自己指定  --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency>
</dependencies>

配置数据库连接

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/itshare-dev?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=trueusername: rootpassword: root

这样整合就完成了,接下来就可以编写我们的业务代码了。

三、业务开发

使用 mybatis-plus 的基本开发流程一般是这样的,他和一些全自动的 ORM 框架还是有点区别的,比如 SpringDataJPA 或者 Hibernate 并不能根据实体对象自动执行 ddl 创建表结构(现在可以通过插件做到,这里我们不深究),一般都是通过先有表,再有实体对象

通常是:

创建数据表 -> 代码生成器生成基础类 -> 在这个基础上开发业务代码

当然你可以在代码生成器阶段尽可能的抽象出相似的地方,甚至可以生成简单的 CRUD 代码,市面上有很多案例可供参考,若依,eladmin 等等。这里我只介绍基础的 entity、mapper、service 生成。

3.1 创建数据表

这里我就不列举了,根据你自己业务来。

3.2 代码生成器

引入依赖

<!-- 代码生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version>
</dependency>
<!-- 模板引擎 -->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId>
</dependency>

代码生成工具类

public class CodeGenerator {private static final String DB_URL = "jdbc:mysql://localhost:3306/itshare-dev?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false";private static final String USERNAME = "root";private static final String PASSWORD = "root";public static void main(String[] args) {AtomicReference<String> loadModulePackageName = new AtomicReference<>("");// 获取当前路径String path = System.getProperty("user.dir");// &tinyInt1isBit=falseFastAutoGenerator.create(DB_URL, USERNAME, PASSWORD).globalConfig((scanner, builder) -> {// 设置作者builder.author("曹申阳").disableOpenDir().enableSpringdoc() // 如果想用swagger,生成 springdoc 规范注解 把这个放开// 指定输出目录.outputDir(path + "\\src\\test\\java");}).dataSourceConfig(builder ->builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {if (JdbcType.TINYINT == metaInfo.getJdbcType()) {return DbColumnType.INTEGER;}return typeRegistry.getColumnType(metaInfo);})).packageConfig((scanner, builder) -> {loadModulePackageName.set(scanner.apply("请输入当前父包模块名称:"));builder.parent("com.yang.itshare") // 设置父包名.moduleName(loadModulePackageName.get()) // 设置父包模块名.service("service").serviceImpl("service.impl").mapper("mapper").controller("controller").entity("entity")// 设置mapperXml生成路径.pathInfo(Collections.singletonMap(OutputFile.xml, path + "\\src\\main\\resources\\mapper\\" + loadModulePackageName.get()));}).strategyConfig((scanner, builder) -> {// 设置需要生成的表名builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))).addTablePrefix("itshare_") // 设置过滤表前缀.entityBuilder() // 设置 entity 生成规则.addTableFills(new Column("create_time", FieldFill.INSERT)).addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)).logicDeleteColumnName("is_deleted").idType(IdType.AUTO).enableLombok()// lombok 注解.controllerBuilder() // 设置 controller 生成规则.enableRestStyle() // 开启生成@RestController 控制器.build();}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();}/*** 处理 all 情况*/protected static List<String> getTables(String tables) {return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));}}

亲测可用,注释也很清楚,想要自己配置可以参考配置文件 https://baomidou.com/reference/new-code-generator-configuration/

运行测试一下:我习惯将生成的放在 test 下,然后再复制到项目下,方便调试,如果你足够自信,可以指定到想要的地方,一步到位。

这个时候还差最后一步,开启 mapper 扫描,就可以正常使用了

@MapperScan("com.yang.itshare.*.mapper")

你可以加在启动类上,或者其它可以被扫描到的类上,我习惯加载 mybatis 的插件配置类上,后面会介绍。

四、常用插件功能

4.1 逻辑删除

配置全局逻辑删除属性

mybatis-plus:global-config:db-config:logic-delete-field: is_deleted # 全局逻辑删除字段名logic-delete-value: 1 # 逻辑已删除值logic-not-delete-value: 0 # 逻辑未删除值# 打印 sql 日志configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 配置mapper的扫描,找到所有的mapper.xml映射文件 如果和默认路径一样可以不配置mapper-locations: classpath*:/mapper/**/*.xml

这里我把常用的也放出来了,日志打印,以及 xml 扫描,我一般就放默认地址,这里不加也可以,防止大家想要修改位置,可以在这里配置路径。

加逻辑删除注解

如果你使用的是我上面的代码生成器代码,会自动添加注解

否则,需要自己完成这一步。

之后在调用 mybatis-plus 封装的查询以及删除操作时,会默认加上这个删除的判断,比如查询会过滤掉以删除的,删除会变成修改这个删除标记的状态值,并不会真正的删除。注意,如果是使用自己编写的 xml 将不会生效。

4.2 自动填充字段

实现 MetaObjectHandler

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Override
public void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}@Override
public void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

实体类上添加注解

如果你使用我上面的代码生成器,会自动添加,否则要自己指定

4.3 分页插件和防止全表更新与删除插件

创建配置类

@Configuration
@MapperScan("com.yang.itshare.*.mapper")
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防全表更新与删除插件PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);paginationInnerInterceptor.setMaxLimit(1000L);interceptor.addInnerInterceptor(paginationInnerInterceptor); // 如果配置多个插件, 切记分页最后添加return interceptor;}
}

我一般会在这里加上 mapper 的扫描,当然你也可以加在启动类上

还有很多可用插件,大家根据需要引入即可 https://baomidou.com/plugins/

五、总结

这样我们完成了基本的整合,已经可以满足我们前期的开发工作。至于一些高级功能,比如 多数据源支持,数据权限插件,等等。等我们需要的时候,可以自己查阅官方文档进行添加,官方文档写的很详细。

相关文章:

SpringBoot3 + MyBatisPlus 快速整合

一、前言 MyBatis 最佳搭档&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。 这个发展到目前阶段已经很成熟了&#xff0c;社区也比较活跃&#xff0c;可以放心使用。官网地址&#xff1a;https://baomidou.com 二、快速开始 引入依赖 这里我引入了核心…...

单片机(学习)2024.10.9

目录 汇编整体分类 1.指令 2.伪操作 3.伪指令 汇编代码 汇编初始化 数据搬运指令 算术运算指令 加法 减法 乘法 比较指令 跳转指令 逻辑运算指令 与或&#xff0c;异或 左移右移 内存操作 LOAD/STORE 指令 写 读 CPU的栈机制 栈的概念 栈的种类 1.空栈(…...

操作符详解(C 语言)

目录 一、操作符的分类二、算数操作符1. 除法操作符2. 取余操作符 三、位移操作符1. 进制2. 原码、反码和补码3. 左移操作符&#xff08;<<&#xff09;和右移操作符&#xff08;>>&#xff09; 四、位操作符1. 按位与 &2. 按位或 |3. 按位异或 ^4. 按位取反 ~…...

自动化测试数据:如何正确地选择不同格式文件「详细介绍」?

自动化测试数据&#xff1a;如何正确地选择不同格式文件「详细介绍」&#xff1f; 前言1. 不同的格式文件对比2. 读取文件2.1 读取Excel文件2.2 读取CSV文件2.3 读取YAML文件2.3.1 字典2.3.2 列表2.3.3 混合类型2.3.4 包含列表的字典2.3.5 包含字典的列表2.3.6 复杂嵌套 2.4 读…...

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…...

国家人工智能创新应用先导区数据及城市人工智能先导区准自然实验数据(2006-2023年)

一、测算方式&#xff1a;参考C刊《当代财经》冯婉昕&#xff08;2024&#xff09;老师的做法&#xff0c;本文的核心解释变量为国家人工智能创新应用先导区政策 &#xff08;AI&#xff09;。企业的金融资产配置是企业生产经营的内生变量&#xff0c;因此&#xff0c;如果选择…...

搜维尔科技:感受、握持、推动、连接和挤压虚拟物体,SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能

感受、握持、推动、连接和挤压虚拟物体&#xff0c;SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能 感受、握持、推动、连接和挤压虚拟物体&#xff0c;SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能...

C++中的引用详解

C中的引用详解 什么是引用 引用是一种取别名的机制&#xff0c;用于为变量提供一个新的名字。在C中&#xff0c;引用的语法使用&符号。引用允许我们以一种更安全和直观的方式来操作变量。 为什么要使用指针 在C中&#xff0c;虽然引用提供了一些优势&#xff0c;但指针仍…...

软考中级 - 软件设计师学习笔记 - 1.3 计算机安全

1.3.1 安全威胁 计算安全&#xff1a;指的是计算机资产安全&#xff0c;是要保证这些计算机资产不受自然和人为的有害因素的威胁和危害。 1.3.2 加密技术和认证技术 加密技术&#xff1a;对称加密(私有密钥加密)、非对称加密(公开密钥加密)。对称加密&#xff08;私钥/私有密…...

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系&#xff0c;并且是以左手坐标系进行展示的。 1.全局坐标系&#xff08;global&#xff09; 全局坐标系描述的是游戏对象在整个世界&#xff08;场景&#xff09;中的相对于坐标原点&#xff08;0&#xff0c;0&#xff0c;0&#xff09;的位置…...

牛顿迭代多维+原理推导

这是两个函数了两个变量的情况&#xff0c;对于三个函数两个变量&#xff0c;牛顿迭代的雅可比矩阵不能求逆&#xff0c; 右边的增量的求解就不能用这个公式了呢。对于有逆矩阵但不能求逆的公式&#xff0c;这个逆矩阵是求解线性方程时出现的&#xff0c;就可用不求逆的方法解…...

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1&#xff1a;input_size 每个词的词向量维度&#xff08;输入层神经元的个数&#xff09;参数2&#xff1a;hidden_size 隐藏层神经元的个数参数3&#xff1a…...

MySQL(B站CodeWithMosh)——2024.10.11(14)

ZZZZZZ目的ZZZZZZ代码ZZZZZZ重点ZZZZZZ操作&#xff08;非代码&#xff0c;需要自己手动&#xff09; 8- CASE运算符The CASE Operator_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p62&vd_sourceeaeec77dfceb13d96cce76cc299fdd08 在sql_store中&am…...

Transformer的预训练模型

Transformer的预训练模型有很多,其中一些在自然语言处理(NLP)和计算机视觉等领域取得了巨大成功。以下是一些主要的Transformer预训练模型: 1. BERT (Bidirectional Encoder Representations from Transformers) 简介: BERT 是谷歌推出的双向Transformer模型,专注于编码器…...

手撕单例模式

在Go语言中实现单例模式&#xff0c;通常需要确保一个类只有一个实例&#xff0c;并且提供一个全局访问点。Go语言本身没有类的概念&#xff0c;但可以通过结构体和函数来模拟这种行为。下面是一个简单的手撕单例模式的实现示例&#xff1a; 懒汉式&#xff08;延迟初始化&…...

UE4 材质学习笔记06(布料着色器/体积冰着色器)

一.布料着色器 要编写一个着色器首先是看一些参考图片&#xff0c;我们需要找出一些布料特有的特征&#xff0c;下面是一个棉织物&#xff0c;可以看到布料边缘的纤维可以捕捉光线使得边缘看起来更亮 下面是缎子和丝绸的图片&#xff0c;与棉织物有几乎相反的效果&#xff0c;…...

人工智能学习框架

人工智能学习框架是指用于开发和训练机器学习和深度学习模型的软件库和工具集。这些框架帮助开发者更高效地构建、训练和部署模型&#xff0c;加速人工智能应用的开发进程。 常见的人工智能学习框架 TensorFlow 由Google开发&#xff0c;是一个开源的深度学习框架&#xff0c;…...

GEE 教程:Landsat TOA数据计算地表温度(LST)

目录 简介 函数 expression(expression, map) Arguments: Returns: Image reduceRegion(reducer, geometry, scale, crs, crsTransform, bestEffort, maxPixels, tileScale) Arguments: Returns: Dictionary 代码 结果 简介 地表温度(Land Surface Temperature,LS…...

Web编程---配置Tomcat

文章目录 一、目的二、原理三、过程1. 解压“apache-tomcat-10.0.27-windows-x64.zip”文件到指定文件夹。2. 配置环境变量3.修改编码方式&#xff0c;防止 Tomcat 控制台出现乱码。4.启动 Tmocat5.打开浏览器&#xff0c;地址栏输入 http://localhost:8080 &#xff0c;如果看…...

物联网5G模块WIFI模块调式记录(Pico)

调试环境 MCU&#xff1a;Pico1&#xff08;无wifi版&#xff09;5G模块&#xff1a;EC800K&#xff08;iot专用4g卡&#xff09;WIFI模块&#xff1a;ESP01s&#xff08;Esp8266芯片&#xff09;、DX-WF24开发环境&#xff1a;MacBook Pro Sonoma 14.5开发工具&#xff1a;Th…...

USBToolBox高效管理实战指南:多设备USB映射自动化配置全流程

USBToolBox高效管理实战指南&#xff1a;多设备USB映射自动化配置全流程 【免费下载链接】tool the USBToolBox tool 项目地址: https://gitcode.com/gh_mirrors/too/tool 在现代多设备办公环境中&#xff0c;USB映射&#xff08;将物理USB端口映射为系统可识别的逻辑设…...

网盘直链下载助手完整教程:如何轻松获取百度、阿里云盘等八大平台真实下载地址

网盘直链下载助手完整教程&#xff1a;如何轻松获取百度、阿里云盘等八大平台真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用…...

从零构建企业级Text2Sql应用:Vanna私有化部署与Dify工作流集成

1. 企业级Text2Sql应用的核心价值 想象一下&#xff0c;财务部门的同事对着Excel表格发愁&#xff1a;"能不能帮我找出上季度华东区销售额超过50万的所有客户&#xff1f;"传统做法需要找IT部门提需求&#xff0c;等开发人员写SQL查询&#xff0c;流程可能长达数三天…...

Dobby跨平台编译技术指南:从环境配置到多架构部署实践

Dobby跨平台编译技术指南&#xff1a;从环境配置到多架构部署实践 【免费下载链接】Dobby a lightweight, multi-platform, multi-architecture hook framework. 项目地址: https://gitcode.com/gh_mirrors/do/Dobby 一、基础认知&#xff1a;Hook框架与跨平台编译基础 …...

原神抽卡记录导出工具:一键备份分析你的抽卡历史数据

原神抽卡记录导出工具&#xff1a;一键备份分析你的抽卡历史数据 【免费下载链接】genshin-wish-export biuuu/genshin-wish-export - 一个使用Electron制作的原神祈愿记录导出工具&#xff0c;它可以通过读取游戏日志或代理模式获取访问游戏祈愿记录API所需的authKey。 项目…...

解决PyQtWebEngine安装难题:高效配置与常见问题排查

1. PyQtWebEngine安装问题全景分析 第一次接触PyQt5的开发者经常会遇到这样的报错&#xff1a;ModuleNotFoundError: No module named PyQt5.QtWebEngineWidgets。这个看似简单的错误背后&#xff0c;其实隐藏着PyQt5版本演进带来的架构变化。从PyQt5 5.12版本开始&#xff0c;…...

YOLO11实战:从零到一搭建高效目标检测开发环境

1. 为什么选择YOLO11&#xff1f; 目标检测是计算机视觉领域最基础也最实用的技术之一。从自动驾驶的车辆识别到工业质检的缺陷检测&#xff0c;都离不开这项技术。而YOLO系列作为目标检测领域的"常青树"&#xff0c;一直以速度快、精度高著称。最新推出的YOLO11在保…...

西门子触摸屏报警处理:除了弹窗,用这个‘非中断式’方法让产线更丝滑

西门子HMI非中断报警系统设计&#xff1a;让产线效率提升30%的实战方案 在快节奏的工业现场&#xff0c;每一次操作中断都意味着产能的隐形流失。传统HMI报警弹窗就像突然按下的暂停键——操作员必须停下手中任务去点击确认&#xff0c;而流水线上的产品仍在流动。这种矛盾在汽…...

Arduino Mega硬件PWM舵机库:绕过Software Delay实现±0.5μs高精度控制

1. 项目概述Servo Hardware PWM是一款专为 Arduino/Genuino Mega 系列开发板设计的高性能舵机控制库。其核心目标是绕过软件定时与通用 I/O 抽象层&#xff0c;直接利用 ATmega2560 微控制器内置的 16 位硬件定时器/计数器&#xff08;Timer3、Timer4、Timer5&#xff09;生成精…...

DataX 实战:从零部署到多场景数据同步

1. DataX入门&#xff1a;为什么选择它作为数据同步工具 第一次接触DataX是在三年前的一个紧急项目里&#xff0c;当时需要把生产环境的MySQL数据实时同步到分析库。试过几种方案后&#xff0c;最终被DataX的稳定性和灵活性打动。作为阿里开源的数据同步工具&#xff0c;它最大…...