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

mybatis-plus + springboot 多对多实例

在MyBatis Plus中,自动填充数据是一种非常实用的功能,它可以自动地为一些字段设置默认值,比如创建时间和更新时间。对于多对多关系来说,虽然自动填充主要针对单一实体的字段,但在某些情况下,你可能也需要在创建或更新实体时自动填充与之相关的多对多关系。
下面我将展示如何在实体类中使用MyBatis Plus的自动填充功能,并且给出一个简单的多对多关系示例。


实体类定义
假设我们有两个实体类:Student 和 Course,它们之间存在多对多关系。我们将定义这两个实体类,并为它们添加自动填充字段。

// Student.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("student")
public class Student {@TableId(type = IdType.AUTO)private Long id;private String name;@ApiModelProperty(value = "创建时间")@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(exist = false)private List<Course> courses;
}// Course.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("course")
public class Course {@TableId(type = IdType.AUTO)private Long id;private String name;@ApiModelProperty(value = "创建时间")@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(exist = false)private List<Student> students;
}

这里我们使用了@TableField(fill = FieldFill.INSERT)和@TableField(fill = FieldFill.INSERT_UPDATE)注解来指定哪些字段应该在插入时和更新时自动填充。
自动填充处理器
为了使自动填充生效,你需要定义一个MetaObjectHandler实现类,并在Spring容器中注册它。

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}

这里我们重写了insertFill和updateFill方法,当实体插入或更新时,这些方法会被自动调用以填充指定的字段。
多对多关系处理
对于多对多关系的处理,你可以选择以下几种方式之一:
使用中间表:定义一个中间表来存储多对多关系,然后在插入或更新实体时,手动处理中间表的插入或更新。
使用注解:如果MyBatis Plus支持多对多关系的注解处理,那么你可以使用相应的注解来简化多对多关系的处理。
由于MyBatis Plus本身并不直接支持多对多关系的注解处理,这里我们采用第一种方式,即定义中间表并手动处理。
中间表定义

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("student_course")
public class StudentCourse {@TableId(type = IdType.AUTO)private Long id;private Long studentId;private Long courseId;@ApiModelProperty(value = "创建时间")@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}

Mapper接口定义

@Mapper
public interface StudentMapper extends BaseMapper<Student> {// 定义自定义方法
}@Mapper
public interface CourseMapper extends BaseMapper<Course> {// 定义自定义方法
}@Mapper
public interface StudentCourseMapper extends BaseMapper<StudentCourse> {// 定义自定义方法
}

Service层定义

@Service
public class StudentService {@Autowiredprivate StudentMapper studentMapper;@Autowiredprivate StudentCourseMapper studentCourseMapper;public void addStudentWithCourses(Student student, List<Long> courseIds) {studentMapper.insert(student); // 插入学生List<StudentCourse> studentCourses = courseIds.stream().map(courseId -> new StudentCourse(null, student.getId(), courseId)).collect(Collectors.toList());studentCourseMapper.insertBatch(studentCourses); // 插入多对多关系}
}

Controller定义

@RestController
@RequestMapping("/students")
public class StudentController {@Autowiredprivate StudentService studentService;@PostMappingpublic void addStudentWithCourses(@RequestBody Student student, @RequestParam List<Long> courseIds) {studentService.addStudentWithCourses(student, courseIds);}
}

总结
上述示例展示了如何在实体类中使用MyBatis Plus的自动填充功能。
对于多对多关系,我们定义了一个中间表,并在Service层手动处理了多对多关系的插入。
如果有更复杂的多对多关系需求,你可以根据具体情况进行调整。

相关文章:

mybatis-plus + springboot 多对多实例

在MyBatis Plus中&#xff0c;自动填充数据是一种非常实用的功能&#xff0c;它可以自动地为一些字段设置默认值&#xff0c;比如创建时间和更新时间。对于多对多关系来说&#xff0c;虽然自动填充主要针对单一实体的字段&#xff0c;但在某些情况下&#xff0c;你可能也需要在…...

SpringBoot日志整合

Spring Boot 整合日志框架的核心是通过 spring-boot-starter-logging 依赖来实现的&#xff0c;它默认整合了 Logback 日志框架。 Spring Boot 对各种日志框架进行了自动配置&#xff0c;使得我们可以很容易地在 Spring Boot 应用中使用日志。 Spring Boot 在类路径下寻找 Log…...

信创教育:培养未来科技创新的生力军

随着全球数字化转型的加速&#xff0c;信息技术应用创新&#xff08;简称“信创”&#xff09;产业作为推动国家信息技术自主可控和产业升级的关键领域&#xff0c;正迎来前所未有的发展机遇。信创教育&#xff0c;作为培养未来科技创新生力军的重要阵地&#xff0c;其重要性和…...

slowfast

核心网络网络架构: 1、分别获取高频和低频图像数据 2、分别进行特征提取 3、特征融合 4、预测 网络结构细节&#xff1a;...

怎么调试python脚本

打开pycharm community 2019.1软件&#xff0c;创建一个项目。 创建一个py后缀的文件作为示范&#xff0c;文件名自己定义。 编写代码&#xff0c;然后右键点击进行运行&#xff0c;查看一下是否有问题。 点击右上角的虫子图标&#xff0c;然后下面会有控制面板出来&#xff0c…...

Flask获取请求信息

示例代码 from flask import Flaskapp = Flask(__name__)if __name__ == "__main__": app.run(debug=True) 1、获取请求头 from flask import request@app.route("/headers", methods=["GET"])def get_headers(): headers = request.heade…...

Overleaf中放置高分辨率图片的方法

如果将ppt中的图片另存为png或jpg等格式&#xff0c;如果图中有密集的编码网格&#xff0c;则生成的pdf会糊掉。如何确保生成的pdf中的图片放大后仍然保持细节&#xff1f;亲测方案&#xff1a; 1、将ppt中的图片尺寸记下来&#xff0c;然后在ppt→设计中将ppt模板的大小设置成…...

【C语言】动态内存管理(malloc,free,calloc,realloc详解 )

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:C语言: C语言方向&#xff08;基础知识和应用&#xff09; (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、…...

如何寻找数值仿真参数最优解?CFD参数优化详解3来袭

本期文章将通过2个简单案例演示参数优化的操作步骤&#xff0c;一起来看看吧&#xff01; 流程自动化 实现 CFD 参数优化&#xff0c;首先要创建流程自动化。用户可采用SimLab的Python宏命令&#xff0c;录制建模流程。或在HyperWorks CFD模块的Template Manager创建Tcl/Tk命令…...

虚拟机macos中构建llvm、clang并配置Xcode

安装虚拟机macos&#xff0c;并安装brew&#xff1a; 安装vmware&#xff1a;https://www.bilibili.com/video/BV1Wo4y1E7fc/安装最新版的macos&#xff1a;极限苹果-Mac论坛-提供Mac软件和macOS苹果系统镜像下载下载并安装brew&#xff1a;版本要低&#xff0c;我装的是4.3.5…...

Java 中的 @SneakyThrows 注解详解:简化异常处理的利与弊

在 Java 开发中&#xff0c;异常处理是一个不可避免的重要部分。我们经常需要处理各种检查型异常&#xff08;checked exceptions&#xff09;&#xff0c;这有时会导致代码变得冗长且难以维护。为了简化异常处理&#xff0c;Lombok 提供了一个强大的注解——SneakyThrows。本文…...

系统编程 day11 进程(线程)3

fork函数的总结&#xff1a; 总结对进程学习之中的回收函数wait wait函数&#xff1a; 1.获取子进程的退出状态 2.回收资源------会让僵尸态的子进程销毁 注&#xff1a;1.wait函数本身是一个阻塞操作&#xff0c;会使调用者阻塞 2.父进程要获得子进程的退出状态 子进程&…...

[ Python 原理分析 ]如何实现用户实现博客文章点赞-物联网Python

目录 一、前言 二、Python爬虫 三、详细操作 3.1 建立基本工程 3.2 获取文章列表 3.2.1 找到获取文章请求 3.2.2 分析获取请求 3.2.3 构建获取请求 3.2.4 调试打印 3.3 实现点赞操作 3.3.1 判断点赞状态 3.3.2 找到点赞请求 3.2.3 分析点赞请求 3.2.4 构建点赞请…...

【47 Pandas+Pyecharts | 杭州二手房数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 过滤数据2.3 行政区处理2.4 地址处理2.5 房屋信息处理2.6 面积处理2.7 楼层处理2.8 年份处理2.9 房价处理2.10 删除不用的列2.11 数据类型转换2.12 查看…...

C++入门基础知识13

C 的关键字&#xff08;接上一篇博文&#xff09;&#xff01;&#xff01; 10. const_cast用法&#xff1a; 该运算符用来修改类型的 const 或 volatile 属性。除了 const 或 volatile 修饰之外&#xff0c; type_id 和 expression 的类型是一样的。常量指针被转化成非常量指针…...

IP地址证如何实现HTTPS访问?(内网IP、公网IP)

IP地址证书&#xff08;全称为IP地址的SSL/TLS证书&#xff09;是实现通过IP地址进行HTTPS访问的关键。以下是实现这一目标的详细步骤&#xff1a; 一、选择证书颁发机构&#xff08;CA&#xff09; 1.选择支持IP证书的CA&#xff1a;并非所有证书颁发机构都提供为IP地址颁…...

东土科技车规级网络芯片获批量应用

东土科技孵化的我国第一颗国产汽车芯片名录的车规级TSN交换网络芯片&#xff0c;于近期获得国家新能源汽车技术创新中心10万片芯片订单&#xff0c;将规模化应用于车载网关&#xff0c;赋能新一代自主可控汽车网络通信架构。 车规级TSN交换网络芯片于2021年流片成功&#xff0…...

nvidia系列教程-AGX-Orin pcie扩展M.2磁盘调试笔记

目录 前言 一、AGX-Orin pcie接口介绍 二、原理图连接 三、SDK配置 四、M.2磁盘调试 总结 前言 NVIDIA Jetson AGX Orin 是一款强大的嵌入式平台,广泛应用于 AI 推理、机器人和自动驾驶等领域。在扩展存储方面,PCIe 接口的 M.2 SSD 是一个常见的选择。本篇博客将记录如何…...

haproxy七层代理知识点以及各种配置

1.为什么用haproxy 当后端主机有一个出现问题了的时候&#xff0c;我们需要访问的流量全部打到正常工作的后端主机&#xff0c;所以我们需要后端检测&#xff0c;lvs没有后端检测&#xff0c;所以就需要用到haproxy 2.负载均衡 2.1 什么是负载均衡 负载均衡&#xff0c;Loa…...

uniapp自定义浮动图标、列表布局

uniapp自定义浮动图标 <button class="fab" @click="goPage"><image src="../../../static/yiyuan.png" mode="" style="width: 60rpx;height:60rpx;"></image></button>.fab {z-index: 100;positi…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...