Spring Boot + MyBatis 动态字段更新方法
在Spring Boot和MyBatis中,实现动态更新不固定字段的步骤如下:
方法一:使用MyBatis动态SQL(适合字段允许为null的场景)
-
定义实体类
包含所有可能被更新的字段。 -
Mapper接口
定义更新方法,参数为实体对象:java
void updateUserSelective(User user);
-
XML映射文件
使用<set>和<if>动态生成SQL:xml
<update id="updateUserSelective" parameterType="User">UPDATE user<set><if test="name != null">name = #{name},</if><if test="age != null">age = #{age},</if><if test="address != null">address = #{address},</if><if test="phone != null">phone = #{phone},</if></set>WHERE id = #{id} </update>
注意:此方法无法将字段更新为null,因为参数为null时条件不成立。
方法二:使用Map和字段过滤(支持字段更新为null)
-
Service层过滤字段
在Service中定义允许更新的字段,并过滤请求参数:java
public void updateUser(Long id, Map<String, Object> updates) {Set<String> allowedFields = Set.of("name", "age", "address", "phone");updates.keySet().retainAll(allowedFields); // 过滤非法字段userMapper.updateUserSelective(id, updates); } -
Mapper接口
使用Map接收动态字段:java
void updateUserSelective(@Param("id") Long id, @Param("updates") Map<String, Object> updates); -
XML映射文件
动态生成更新语句:xml
<update id="updateUserSelective">UPDATE user<set><foreach collection="updates" index="key" item="value" separator=",">${key} = #{value}</foreach></set>WHERE id = #{id} </update>
注意:使用${key}存在SQL注入风险,需在Service层严格过滤字段名。
方法三:使用@UpdateProvider(灵活且安全)
-
定义SQL提供类
动态构建安全SQL:java
public class UserSqlProvider {public String updateSelective(Map<String, Object> params) {Long id = (Long) params.get("id");Map<String, Object> updates = (Map<String, Object>) params.get("updates");Set<String> allowedFields = Set.of("name", "age", "address", "phone");StringBuilder sql = new StringBuilder("UPDATE user SET ");allowedFields.forEach(field -> {if (updates.containsKey(field)) {sql.append(field).append(" = #{updates.").append(field).append("}, ");}});sql.setLength(sql.length() - 2); // 移除末尾逗号sql.append(" WHERE id = #{id}");return sql.toString();} } -
Mapper接口
使用@UpdateProvider注解:java
@UpdateProvider(type = UserSqlProvider.class, method = "updateSelective") void updateUserSelective(@Param("id") Long id, @Param("updates") Map<String, Object> updates);
优点:避免SQL注入,动态生成安全语句。
总结
-
方法一适合简单场景,字段无需设置为
null。 -
方法二灵活,需严格过滤字段。
-
方法三推荐用于生产环境,安全且维护性强。
根据需求选择合适方案,确保字段更新的灵活性和安全性。
相关文章:
Spring Boot + MyBatis 动态字段更新方法
在Spring Boot和MyBatis中,实现动态更新不固定字段的步骤如下: 方法一:使用MyBatis动态SQL(适合字段允许为null的场景) 定义实体类 包含所有可能被更新的字段。 Mapper接口 定义更新方法,参数为实体对象&…...
Unity多线程渲染指令队列设计与集成技术详解
一、多线程渲染架构设计背景 1. 传统渲染管线瓶颈分析 阶段单线程耗时占比可并行化潜力场景遍历与排序35%★★★★☆材质属性更新20%★★★★★GPU指令提交25%★★☆☆☆资源上传20%★★★★☆ 2. 多线程渲染优势 CPU核心利用率:从单线程到全核心并行 指令缓冲优…...
栈和队列学习记录
一、栈 1.栈的概念 操作受限的线性表-----栈:栈只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),另一端则是栈底(Bottom)。这种受限的操作方式使得栈遵循后进先出(LIFO…...
位运算练习:起床困难综合征(贪心,位运算)【算法竞赛进阶指南学习笔记】
目录 前情提要起床困难综合征(贪心,位运算) 前情提要 一些基础运算操作用法看看上一篇; 起床困难综合征(贪心,位运算) 题目原文 [P2114 NOI2014] 起床困难综合症 - 洛谷 思路分析 题目很长…...
ubuntu24设置拼音输入法,解决chrome不能输入中文
## 推荐方案:使用 Fcitx5 Fcitx5 是当前在 Wayland 环境下兼容性最好的输入法框架。 ### 1. 安装 Fcitx5 bash sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5 fcitx5-module-c…...
React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案
一条“Hydration failed”的错误,让我损失了半天时间 背景 我在用 Next.js App Router Redux 开发一个任务管理应用,一切顺利,直到打开了 SSR(服务端渲染),突然看到这个令人头皮发麻的报错: …...
轻量级景好鼠标录制器
景好鼠标录制器(详情请戳 官网)是一款免费无广的键鼠动作录制/循环回放工具,轻松自动化应对一些重复繁琐的操作任务,如来回切换窗口、文档同一相对位置的复制粘贴等场景,兼容Win XP - 11 。毕竟此款本身主打简约类型&a…...
leetcode--两数之和 三数之和
1.两数之和 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 …...
FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)
本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…...
openEuler安装nvidia驱动【详细版】
注意:在 openEuler 24.03 LTS 系统中安装 NVIDIA 驱动(RTX 3090)需要禁用默认的 Nouveau 驱动并手动安装官方驱动。 一、准备工作 系统更新与依赖安装 更新系统并安装必要依赖包:sudo dnf update -y sudo dnf install gcc make k…...
力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值
前言 简单、中等 √ 二分法思路很简单,但是判断边界太麻烦了!难道真的要去背模板吗 搜索插入位置 我的题解 循环条件左不超过右,目标大于中间值(向下取整)时,左中1,小于,右中-1&…...
基于Python爬虫的豆瓣电影信息爬取(可以根据选择电影编号得到需要的电影信息)
# 豆瓣电影信息爬虫(展示效果如下图所示:) 这是一个功能强大的豆瓣电影信息爬虫程序,可以获取豆瓣电影 Top 250 的详细信息。 ## 功能特点 - 自动爬取豆瓣电影 Top 250 的所有电影信息 - 支持分页获取,每页 25 部电影,共 10 页 - 获取每部电影的详细信息,包括: - 标题…...
程序员思维体操:TDD修炼手册
程序员思维体操:TDD修炼手册 ——从"先写代码"到"测试先行"的认知革命 一、重新认识TDD:不仅仅是写测试 什么是TDD(测试驱动开发) TDD其实很简单,不要看名字很高级复杂,传统开发是直…...
PHP异常处理__RuntimeException运行时错误
以下是对 PHP 中 RuntimeException 的详细解释: 一、RuntimeException 概述 RuntimeException 是 PHP 内置的异常类,它继承自 Exception 类。它通常用于表示在程序运行时发生的异常情况,这些异常情况通常是在程序正常执行过程中出现的错误&…...
从性能到安全:大型网站系统架构演化的 13 个核心维度
大型网站系统架构的演化是一个复杂的过程,涉及到多个维度的技术内容,从关键维度进行详细分析: 1.性能维度 缓存技术:包括浏览器缓存、CDN(内容分发网络)缓存、服务器端缓存(如 Memcached、Red…...
基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)
0、原图 一、优化地方 计算行的时候,采用概率分布去统计差值概率比较大的即为所要的值。 def find_common_difference(array):"""判断数组中每个元素的差值是否相等,并返回该差值:param array: 二维数组,其中每个元素是一个…...
spring Ai---向量知识库(二)
RAG:检索增强,结合了检索和生成两种技术;用于提升生成模型的效果。 1.信息检索(R) :系统从一个大型文档库中检索出与查询最相关的文档片段。这一步的目标是找到那些可能包含答案或相关信息的文档。 2.生成增强…...
Nvidia显卡架构演进
1 简介 显示卡(英语:Display Card)简称显卡,也称图形卡(Graphics Card),是个人电脑上以图形处理器(GPU)为核心的扩展卡,用途是提供中央处理器以外的微处理器帮…...
rollup使用讲解
rollup 总结 什么是 rollup? rollup 是一个 JavaScript 模块打包器,在功能上要完成的事和 webpack 性质一样,就是将小块代码编译成大块复杂的代码,例如 library 或应用程序。在平时开发应用程序时,我们基本上选择用 webpack,相比之下,rollup.js 更多是用于 library 打…...
USO服务器操作系统手动升级GCC 12.2.0版本
1. 从 GNU 官方 FTP 服务器下载 GCC 12.2.0 的源码包,并解压进入源码目录。 wget https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz tar -zxvf gcc-12.2.0.tar.gz cd gcc-12.2.0 2. 运行脚本下载并配置 GCC 编译所需的依赖库。此步骤会自动下载如 GMP…...
STM32F407使用ESP8266实现阿里云OTA(上)
文章目录 前言一、阿里云OTA二、命令调试1.升级包上传2.OTA订阅和上报的主题3.命令调试4.具体效果三、所用到的工具和材料前言 在经过前面对ESP8266、SD卡、FLASH的了解之后,终于要进入我们的正题了,就是使用STM32和ESP8266实现阿里云的OTA。这一功能并不复杂,只是需要主要…...
玩转Docker | 使用Docker部署DashMachine个人书签工具
玩转Docker | 使用Docker部署DashMachine个人书签工具 前言一、DashMachine介绍DashMachine简介DashMachine使用场景二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署DashMachine服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问Das…...
测试基础笔记第九天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…...
使用n8n构建自动化工作流:从数据库查询到邮件通知的使用指南
n8n是一款强大的开源工作流自动化工具,可以帮助你将各种服务和应用程序连接起来,创建复杂的自动化流程。下面我将详细介绍一个实用的n8n用例:从MySQL数据库查询数据并发送邮件通知,包括使用场景、搭建步骤和节点部署方法。 使用场…...
Python爬虫与代理IP:高效抓取数据的实战指南
目录 一、基础概念解析 1.1 爬虫的工作原理 1.2 代理IP的作用 二、环境搭建与工具选择 2.1 Python库准备 2.2 代理IP选择技巧 三、实战步骤分解 3.1 基础版:单线程免费代理 3.2 进阶版:多线程付费代理池 3.3 终极版:Scrapy框架自动…...
Unity 将Excel表格中的数据导入到Mysql数据表中
1.Mysql数据表users如下: 2.即将导入的Excel表格如下: 3.代码如下: using System; using System.Data; using System.IO; using Excel; using MySql.Data.MySqlClient; using UnityEngine; using UnityEditor;public class ImportExcel {// …...
JavsScript 原型链
解决构造函数浪费内存的问题 每一个构造函数都有一个属性prototype属性,指向一个原型对象 原型是构造函数的一个属性 prototype 给数组类型扩展 正常代码: prototype中的this指向为调用对象 所以 基本关系:构造函数产生两个部分&…...
MySQL 索引:深度解析与高效使用
MySQL 索引:深度解析与高效使用 引言 MySQL 是一种广泛使用的开源关系型数据库管理系统,其强大的功能和性能使其成为众多应用程序的首选数据库。在 MySQL 中,索引是提高查询效率的关键因素之一。本文将深入探讨 MySQL 索引的概念、类型、创建、优化以及注意事项,帮助您更…...
消息中间件RabbitMQ02:账号的注册、点对点推送信息
一、默认用户登录和账号注册 1.登录 安装好了RMQ之后,我们可以访问如下地址: RabbitMQ Management 输入默认的管理员密码,4.1.0的管理员账号和密码是: guest guest 2.添加账号 consumer consumer 添加成功后: 角色…...
大语言模型的评估指标
目录 一、混淆矩阵 1. 混淆矩阵的结构(二分类为例) 2.从混淆矩阵衍生的核心指标 3.多分类任务的扩展 4. 混淆矩阵的实战应用 二、分类任务核心指标 1. Accuracy(准确率) 2. Precision(精确率) 3. …...
