源代码

<update id="updateDynamicTableData"><foreach collection="mapList" item="map" separator=";">UPDATE ${tableName} SET<foreach collection="map" item="value" index="key" separator=",">${key}=#{value}  <!-- 注意:${key}需防注入 --></foreach>WHERE ARCHIVAL_CODE = #{map.ARCHIVAL_CODE}</foreach>
</update>

报错:

从错误信息和代码来看,问题出在 处理 NULL 值时 MyBatis 无法确定 JDBC 类型。具体分析如下:

问题原因

  1. NULL 值处理问题

    • 当 map 中的值为 null 时,MyBatis 无法自动推断 JDBC 类型(错误信息:Error setting null for parameter

    • 批量更新时(2条数据),只要有一条记录包含 NULL 值就会触发此错误

  2. 批量更新差异

    • 单条数据能成功是因为:可能该条数据的所有字段值都非 NULL

    • 两条数据失败是因为:第二条数据包含 NULL 值字段

解决方案

方法 1:指定 NULL 值的 JDBC 类型(推荐)

修改动态 SQL,为每个参数添加 jdbcType 配置:

<update id="updateDynamicTableData"><foreach collection="mapList" item="map" separator=";">UPDATE ${tableName} SET<foreach collection="map" item="value" index="key" separator=",">${key}=#{value, jdbcType=VARCHAR}  <!-- 添加jdbcType --></foreach>WHERE ARCHIVAL_CODE = #{map.ARCHIVAL_CODE}</foreach>
</update>

说明

  • jdbcType=VARCHAR 是示例,实际需根据字段类型选择:

    • 数字字段:jdbcType=NUMERIC

    • 日期字段:jdbcType=TIMESTAMP

    • 通用类型:jdbcType=OTHER

方法 2:全局配置 NULL 值处理

在 MyBatis 配置文件中添加:

<settings><!-- 指定 NULL 值的默认 JDBC 类型 --><setting name="jdbcTypeForNull" value="NULL"/>
</settings>

这会为所有 NULL 值统一设置 jdbcType=NULL

方法 3:接口参数指定类型

修改 DAO 接口,明确字段类型:

void updateDynamicTableData(@Param("mapList") List<Map<String, Object>> mapList,@Param("tableName") String tableName
);
#虽然不能直接解决,但可配合其他方案使用。

为什么单条成功、多条失败?

  • 单条数据:可能所有字段值恰好都非 NULL,无需处理类型推断

  • 多条数据:只要有一条记录包含 NULL 值字段,MyBatis 就需要处理类型映射,此时:

// 示例数据
List<Map> mapList = Arrays.asList({ "NAME": "张三", "AGE": 25 },             // 无NULL{ "NAME": null, "ADDRESS": "北京" }       // 包含NULL
);

第二条的 NAME=null 触发了类型推断错误。

完整修正方案(推荐)

关键点

  1. 确保 separator=","(内层循环用逗号分隔)

  2. 所有 #{value} 必须指定 jdbcType

  3. 动态字段 ${key} 需防范 SQL 注入(确保来源可信)

实际开发中,建议创建字段类型映射表,根据 ${key} 动态设置对应的 jdbcType

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

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

相关文章

博图SCL中WHILE语句的使用详解及案例

在西门子TIA Portal的SCL&#xff08;结构化控制语言&#xff09;编程中&#xff0c;WHILE循环是处理条件迭代任务的核心工具。它根据布尔表达式动态控制循环执行&#xff0c;适用于不确定循环次数的场景。下面从语法、执行流程、注意事项到实际案例全面解析。 一、WHILE循环基…

简单聊聊JVM中的几种垃圾收集算法

3.4、分代收集算法 分代收集算法&#xff0c;可以看成以上内容的延伸。它的实现思路是根据对象的生命周期的不同&#xff0c;将内存划分为几块&#xff0c;比如把堆空间划分为新生代和老年代&#xff0c;然后根据各块的特点采用最适当的收集算法。 在新生代中&#xff0c;存在…

依赖已导入,已下载,无法使用问题

明明已经导入依赖&#xff0c;却无法使用相关注解 于是&#xff0c;我使用 mvn dependency:tree -Dverbose 来查看是否有依赖冲突 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project agileboot…

答题考试系统小程序ThinkPHP+UniApp

ThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署. 更新日志 V1.7.1修复一些问题 解决考场成绩列表重复问题&#xff1b; 解决后台材料题选择子…

DHCP服务管理

目录 DHCP协议 DHCP的优势 DHCP的分配方式 应用场景 注意 工作流程 何时更新租约 当客户端重启后 客户端类型 DCHP安装与配置 网络规划&#xff1a; 配置 DHCP 作用域 启动 DHCP 服务 配置路由器 配置路由器网卡 IP 开启 IP 转发&#xff08;确保跨网段通信&…

12.UDP客户端

准备工作 硬件准备&#xff1a;确保你的STM32板子已经正确连接了DP83848网络芯片。 软件设置&#xff1a; 安装好STM32CubeMX用于配置工程。 选择合适的STM32 HAL库版本。 如果可能的话&#xff0c;安装LwIP库支持TCP/IP协议栈。 步骤 1. 使用STM32CubeMX配置项目 打开…

希尔脚本简介及常用命令代码整理

一、Shell 脚本简介 1. 定义 Shell 是用户与操作系统内核交互的桥梁&#xff0c;常见类型有 Bash、Zsh、PowerShell 等。Shell 脚本则是一系列 Shell 命令的集合&#xff0c;通常保存为后缀为.sh 的文本文件。 2. 作用 类别描述自动化重复性任务例如定期备份数据、执行定时…

【人工智能下的智算网络】广域网优化

一、广域网络多路径I/O写的并行路径优化方案 1.1、数学建模 网络拓扑优化​ 1. ​拓扑抽象与路径发现​ ​邻接矩阵建模​&#xff1a; 将网络节点抽象为图顶点 G (V, E)&#xff0c;链路带宽与延迟定义为边权 w(e)。构造邻接矩阵 A&#xff0c;其中元素 A_{ij} 表示节点 …

AI测试开发工程师如何用大模型调用工具:从入门到实践

在软件测试领域&#xff0c;测试工程师常常面临测试用例设计复杂、数据生成繁琐、结果验证耗时等挑战。随着大语言模型&#xff08;LLM&#xff09;的迅速发展&#xff0c;Chat类大模型&#xff08;如GPT、LangChain支持的模型&#xff09;为测试开发提供了一种全新思路——工具…

迁移学习基础

知识的“跨界复用” 你是一位经验丰富的厨师&#xff08;源模型&#xff09;&#xff0c;尤其擅长做意大利菜&#xff08;源任务/源域&#xff09;。现在&#xff0c;老板让你去新开的一家融合餐厅工作&#xff0c;需要你做亚洲菜&#xff08;目标任务/目标域&#xff09;。你…

AI医生24小时在线:你的健康新‘算法监护人

2025年仲夏&#xff0c;中国医疗AI领域迎来爆发式突破&#xff1a;罗湖医院集团率先部署"DeepSeek-腾讯混元"双AI诊疗系统&#xff0c;实现患者15分钟极速就诊闭环&#xff1b;复旦大学研发的微量血液检测技术取得重大突破&#xff0c;仅需数滴血样即可筛查上千种疾病…

Java 中 DataSource-数据源 的基础介绍

Java 中 DataSource-数据源 的基础介绍 一、核心概念解析1.1 数据源&#xff08;Data Source&#xff09;1.2 数据库连接池&#xff08;Connection Pool&#xff09;1.3 二者关系1.4 DataSource 接口 二、DataSource 解决的问题与优势2.1 DataSource 的作用2.2 传统方式的局限性…

Vue + Vite 项目部署 Docker 全攻略:原理、路由机制、问题排查与开发代理解析

Vue Vite 项目部署 Docker 全攻略&#xff1a;原理、路由机制、问题排查与开发代理解析 本文面向希望将 Vue 3 Vite 项目部署到生产环境&#xff08;Docker NGINX&#xff09;并深入理解路由行为、构建机制与常见问题排查的开发者。 &#x1f4e6; 一、项目准备 以 Vue 3 …

Vue3 + TypeScript 使用 v-bind() 在 <style scoped> 中动态设置 CSS 样式值

使用要求&#xff1a; Vue 3.3 <style scoped>&#xff0c;Vue 的 v-bind() 在 CSS 中只支持在 scoped style 或 CSS Modules 中使用v-bind("cssVar") 双引号包裹响应式变量&#xff0c;变量 cssVar 必须是 Vue 的响应式数据&#xff08;如 ref 或 reactive&…

php列表头部增加批量操作按钮,多选订单数据批量微信退款(含微信支付SDK)

index_search.html data-table-id:表格id data-rule:需要传输的列表字段 data-action:控制器方法 <a class="layui-btn layui-btn-primary layui-btn-sm" style=

小程序还没有上线就提示小程序违规,支付失败

如果出现这种情况&#xff0c;一般情况下不是真正的违规&#xff0c;是因为在小程序后台&#xff0c;没有设置订单详情页面的path地址的原因 1.首先看一下&#xff0c;在站内信中是否有相关订单的通知&#xff1a;站内信&#xff08;小程序通知中心&#xff09;查看是否看到 关…

展开说说Android之Glide详解_源码解析

基于上一篇介绍了Glide的使用篇本文分析一下Glide的源码实现&#xff0c;看看我们简单几步就实现的图片展示功能在源码中是怎样完成的。 一、Glide中的核心文件 先逐个介绍一下个人以为的几个核心类&#xff1a;‌ 1、Glide Glide是必经的入口&#xff0c;通过Glide.get(con…

商品中心—6.商品考核系统的技术文档二

大纲 1.基于大数据系统的商品考核数据指标 2.基于商品考核数据指标的商品考核流程 3.商品考核失败后的处理 考核流程的设计 4.商品考核系统数据库模型设计 5.商品考核系统核心接口 6.商品生命周期系统的定时考核任务 6.商品生命周期系统的定时考核任务 (1)定时任务处理…

鸿蒙组件通用事件开发全攻略:从基础交互到工程实践

一、引言&#xff1a;事件系统 —— 构建交互体验的核心枢纽 在鸿蒙应用开发体系中&#xff0c;组件事件系统是连接用户操作与应用逻辑的关键桥梁。从基础的点击交互到复杂的多触点手势&#xff0c;通用事件覆盖了全场景设备的交互需求。本文将系统解构鸿蒙事件体系的核心机制…

老项目重构难题破解:飞算 JavaAI 如何实现技术升级突围

在企业数字化转型进程中&#xff0c;大量 Java 老项目因长期迭代积累的技术债务&#xff0c;陷入 "重构必要性与实施难度并存" 的困境。这些遗留系统普遍存在代码体系老化、架构模式滞后、维护成本高企等问题&#xff0c;成为企业技术升级的绊脚石。 传统 Java 老项…