记一次Mybatis驼峰命名导致的线上BUG及处理方案
前言
方向从一开始就错了,还是执着的去寻找问题的解决方案,简直就是一场重大灾难,但这也是每个修行者的必由之路。这个线上问题,差点让我的心里防线崩溃,苦寻无门,最终得以解决也多亏了身边的各路大佬的群策群力,当然也少不了同事的一番苦情调侃。“一个bug解一天”,还要我怎样,奥力给吧。开始我们的正文吧。
正文
- 问题是这样的,我的springboot项目默认开启了驼峰模式,所以下划线的数据库字段会自动给我转为驼峰的模式,好巧不巧的是我们的第三方客户提供给我们的接口所有字段都是下划线分割的,我创建了这些下划线分割的属性对象实体,在我使用mybatis插入一条数据后,然后使用该下划线的实体属性对象去接收刚刚插入的数据,结果一直报对象为null的错误。说起来也是蛮心酸的,一直以为问题出现在了mybatis事务控制上,前面插入数据之后由于事务还没有提交所以后面会查不到数据,咨询了各位大佬,也说是这个问题导致的,可是使用默认的实体是能查出数据的,很神奇的发现系统出了鬼。简直是欲哭无泪,终于经过一整天的各种摸索,才发现是因为设置了驼峰,但是我的接收实体是下划线声明的属性,所以导致查询到的数据无法映射到我的实体里面,一直报null的问题,悲剧往往就出现在了这些小细节里面,顿时一万句草泥马从脑海中飘过。哎,真的是想死的心都有了。后面直接用了很low的方案补救。
- 补救方案:
方案一:此放案是我处理这个紧急问题想到的临时方案,虽然方案是low了一点,但总算及时解决了线上问题,用户可以正常使用,也留出了足够的时间让我排查遇到的这个鬼畜一般的问题。那么就说下这个临时的解决方案,我们可以先用驼峰的实体去查询出所有的数据,然后再将驼峰中的属性值一个个赋值到下划线的属性实体中,这样就能取到对象中的值,返回给我的第三方调用,话说我的第三方也是够恶心的,给我的接口中的传参都是下划线分割,着实够恶心的吗,不知道我一直是一个规规矩矩的java小白吗,也是够了。哈哈。
方案二:相对来说就高大上了,这里的主要问题其实就是屏蔽全局的驼峰设置对于我们个别特殊的mapper实体映射的问题,这些下划线属性的命名的实体不能直接接收数据库的字段,相必我们都知道mybatis有俩种方式接收查询结果的数据,resultType和resultMap,解决这个问题,我们可以使用resultMap的方式接收数据,这样就可以屏蔽掉驼峰的影响,接收的数据会按照resultMap中的映射去接收数据,无论你是下划线字段还是驼峰字段还是其它乱七八糟的命名方式,其都可以映射,是不是很强大呢。哈哈,也怪小编自己比较懒,手动配置这些映射觉得特别麻烦,总是使用别名加resultType的方式接收数据,几乎不用resultMap,今天才体会到了其异乎强大的功能,存在即是合理的,真的是这个样子。感叹这些设计的精妙之处之时,也被这些作者的才华深深的折服了。
结语
好了,今天就码到这里了,虽然是比较水的一篇文章,但是也是希望那些初学者不要再犯和我一样的错误,别被身边的同事调侃,一个bug解一天,真的很扎心啊。
相关文章:
记一次Mybatis驼峰命名导致的线上BUG及处理方案
前言 方向从一开始就错了,还是执着的去寻找问题的解决方案,简直就是一场重大灾难,但这也是每个修行者的必由之路。这个线上问题,差点让我的心里防线崩溃,苦寻无门,最终得以解决也多亏了身边的各路大佬的群…...
在MyBatisPlus中添加分页插件
开发过程中,数据量大的时候,查询效率会有所下降,这时,我们往往会使用分页。 具体操作入下: 1、添加分页插件: package com.zhang.config;import com.baomidou.mybatisplus.extension.plugins.Pagination…...
算法题系列8·买卖股票的最佳时机
目录 题目描述 实现 提交结果 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 设计一个算法来计算你所能获取的最大利润。…...
DC电源模块关于宽电压输入和输出的范围
BOSHIDA DC电源模块关于宽电压输入和输出的范围 DC电源模块是一种电子设备,能够将输入的直流电源转换成所需的输出电源,用于供电各种电子设备。其中,关于宽电压输入和输出的范围,是DC电源模块常见的设计要求之一。本文将详细介绍…...
【Docker】docker拉取镜像错误 missing signature key
问题 当我使用docker拉取一个特定的镜像时,提示错误: 错误 missing signature key 但是拉取其他镜像又可以访问,,,,于是,我怀疑是否是docker版本问题。 docker --version结果确实࿰…...
C- 静态链接
静态链接意味着在编译时将所有库函数直接嵌入到最终的可执行文件中,而不是在运行时通过共享库来动态链接这些函数。静态链接的结果是一个更大的可执行文件,因为它包含了所有必要的代码,但它可以在没有外部依赖的情况下独立运行。 下面是一个…...
微信公众号开发(BUG集)
1.微信公众平台接口错误:不合法的自定义菜单使用用户 地址:解决地址 2.微信公众平台接口错误:invalid ip 180.101.72.196 ipv6 ::ffff:180.101.72.196, not in whitelist rid: 6511420b-60c59249-01084d02 白名单离开放服务器IP...
AI项目十三:PaddleOCR训练自定义数据集
若该文为原创文章,转载请注明原文出处。 续上一篇,PaddleOCR环境搭建好了,并测试通过,接下来训练自己的检测模型和识别模型。 paddleocr检测模型训练 1、准备数据集 在PaddleOCR目录下新建文件夹:train_data, 这个…...
你熟悉Docker吗?
你熟悉Docker吗? 文章目录 你熟悉Docker吗?快速入门Docker安装1.卸载旧版2.配置Docker的yum库3.安装Docker4.启动和校验5.配置镜像加速5.1.注册阿里云账号5.2.开通镜像服务5.3.配置镜像加速 部署MySQL镜像和容器命令解读 Docker基础常用命令数据卷数据卷…...
Nodejs错误处理详细指南
Nodejs错误处理详细指南 学习 Node.js 中的高级错误处理技术,以增强应用程序的可靠性和稳定性。 在 Node.js 中,我们可以使用各种技术和方法来处理错误,可以查看这篇文章。错误处理是任何 Node.js 应用程序的一个重要方面。正确管理错误可以…...
软考 系统架构设计师系列知识点之软件架构风格
这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格(水平)考试,11月4号就要考试,因此8天长假绝不能荒废,必须要好好利用起来。现在将各个核心知识点一一进行提炼并做记录。 所…...
一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案
前言 如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记&…...
[unity]对象的序列化
序 抽象的图纸叫类,包含具体数据的叫对象。 类的序列化和反序列化 using System.Collections; using System.Collections.Generic; using UnityEngine;using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializabl…...
java开发岗位面试
java开发岗位面试 技术栈:springboot框架+redis 个人笔试/技术面问题整理 1、SpringBoot有什么组件? 举例说几个: ①auto-configuration组件:核心特征。其约定大于配置思想,赋予了SpringBoot开箱即用的强…...
坠落防护 挂点装置
声明 本文是学习GB 30862-2014 坠落防护 挂点装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高处坠落防护挂点装置的技术要求、检验方法、检验规则及标识。 本标准适用于防护高处坠落的挂点装置。 本标准不适用于体育及消…...
关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理
概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置; 采用注解的方式可以让我们 固化配置,降低代码编写复杂度、减少配置错误情况的发生,提升编码调试的效率、提高业务的可用性。 为什么说“降低…...
uniapp快速入门系列(1)- 概述与基础知识
章节三:抖音小程序页面开发 第1章:概述与基础知识1.1 uniapp简介1.1.1 什么是uniapp?1.1.2 为什么选择uniapp?1.1.3 uniapp与微信小程序的关系 1.2 HBuilderX介绍与安装1.2.1 什么是HBuilderX?1.2.2 HBuilderX的安装1.…...
国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求
近年来,为了摆脱对国外技术和产品的依赖,建设安全的网络环境,以及加强我国对网络信息的安全可控能力,我国推出了国密算法。同时,为保护网络通信信息安全,更高级别的安全加密数字证书—国密SSL证书应运而生。…...
LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统
LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础,具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力,培养学生解决实际问题的工程实践能力,激发学生创新意识&…...
机器学习之单层神经网络的训练:增量规则(Delta Rule)
文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径,因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 (…...
Perplexity无法解析Springer LaTeX公式?2024.06最新MathJax兼容补丁+3类数学文献精准摘要生成术
更多请点击: https://intelliparadigm.com 第一章:Perplexity解析Springer文献的底层机制与失效归因 Perplexity 作为衡量语言模型预测能力的关键指标,在学术文献解析场景中常被误用为“质量代理”,尤其在处理 Springer 出版集团…...
从ENVI SARscape到SNAP:手把手教你迁移哨兵1 GRD数据预处理流程(含避坑指南)
从ENVI SARscape到SNAP:哨兵1 GRD数据预处理全流程迁移实战 当雷达遥感领域的工具生态逐渐向开源化倾斜,许多长期依赖ENVI SARscape的研究者开始面临工具迁移的挑战。本文将聚焦哨兵1号GRD数据的预处理流程,为需要从商业软件转向开源工具的用…...
利用ODX实现整车诊断数据库管理
一:背景与挑战| 背景:在全球汽车行业快速发展的背景下,对车辆诊断技术的要求也在不断提升。ODX(Open Diagnostic data eXchange)作为行业标准的诊断数据库,已被各大汽车制造商广泛采用,并贯穿于ECU的整个生…...
开关电源EMC设计:从原理到实践的关键技术
1. 开关电源EMC设计基础 开关电源因其高效率和小型化优势,在现代电子设备中广泛应用。然而,高频开关动作带来的电磁干扰(EMI)问题不容忽视。作为一名电源工程师,我经常需要面对各种EMC挑战。记得有一次,我们团队设计的工业电源模块…...
ARM动态内存控制器与SDRAM地址映射技术详解
1. ARM动态内存控制器基础解析动态内存控制器(Dynamic Memory Controller,简称DMC)是现代嵌入式系统中管理SDRAM等易失性存储器的核心组件。作为处理器与存储设备之间的桥梁,DMC通过高效的地址映射技术实现两者间的数据通信。在AR…...
用PLC控制Labview自动运行
博图软件设置注意数据位正确下图为Labview读取CSV文件的位置测试数据如下图所示实现方法:在1分支内创建好条件,当PLC心跳为True那么就去跑True里面的流程(CSM框架)...
AI时代Clean Code新标准(DeepSeek R1实测验证版):92.7%可维护性提升背后的11个关键断点
更多请点击: https://intelliparadigm.com 第一章:AI时代Clean Code范式迁移的必然性 当大语言模型能自动生成函数、修复漏洞、甚至重构整包逻辑时,“可读性优先”的传统Clean Code原则正遭遇结构性挑战。人类开发者编写的代码不再唯一面向…...
鸿蒙系统安装
一、下载 DevEco Studio 打开华为开发者官网,找到 DevEco Studio 6.1.0 Release 下载页面。 DevEco Studio for Windows 6.1.0.830(2.8GB) 下载。 Mac 用户可以选择对应版本(x86/ARM)。 等待下载完成,得到 .exe 安装文件。二、安装…...
可编程逻辑器件(PLD/CPLD/FPGA)核心原理、选型指南与EDA设计实战
1. 项目概述:从怀旧到硬核,聊聊可编程逻辑的“前世今生”那天在网上闲逛,本想找点微马赛克艺术(Micromosaic)的制作视频,结果算法一个拐弯,把我带回了上世纪七八十年代的《大青蛙布偶秀》&#…...
BetaClaw:开源AI代理运行时,统一多模型调用与智能成本控制
1. 项目概述:一个为开发者打造的“瑞士军刀”级AI代理运行时如果你和我一样,每天都在和不同的AI模型打交道,那你一定也经历过这种痛苦:想用Claude写点创意文案,得去Anthropic的API;想用GPT-4o分析代码&…...
