当前位置: 首页 > 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…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...