记一次Mybatis驼峰命名导致的线上BUG及处理方案

前言

方向从一开始就错了,还是执着的去寻找问题的解决方案,简直就是一场重大灾难,但这也是每个修行者的必由之路。这个线上问题,差点让我的心里防线崩溃,苦寻无门,最终得以解决也多亏了身边的各路大佬的群策群力,当然也少不了同事的一番苦情调侃。"一个bug解一天",还要我怎样,奥力给吧。开始我们的正文吧。

正文

  • 问题是这样的,我的springboot项目默认开启了驼峰模式,所以下划线的数据库字段会自动给我转为驼峰的模式,好巧不巧的是我们的第三方客户提供给我们的接口所有字段都是下划线分割的,我创建了这些下划线分割的属性对象实体,在我使用mybatis插入一条数据后,然后使用该下划线的实体属性对象去接收刚刚插入的数据,结果一直报对象为null的错误。说起来也是蛮心酸的,一直以为问题出现在了mybatis事务控制上,前面插入数据之后由于事务还没有提交所以后面会查不到数据,咨询了各位大佬,也说是这个问题导致的,可是使用默认的实体是能查出数据的,很神奇的发现系统出了鬼。简直是欲哭无泪,终于经过一整天的各种摸索,才发现是因为设置了驼峰,但是我的接收实体是下划线声明的属性,所以导致查询到的数据无法映射到我的实体里面,一直报null的问题,悲剧往往就出现在了这些小细节里面,顿时一万句草泥马从脑海中飘过。哎,真的是想死的心都有了。后面直接用了很low的方案补救。
  • 补救方案:

方案一:此放案是我处理这个紧急问题想到的临时方案,虽然方案是low了一点,但总算及时解决了线上问题,用户可以正常使用,也留出了足够的时间让我排查遇到的这个鬼畜一般的问题。那么就说下这个临时的解决方案,我们可以先用驼峰的实体去查询出所有的数据,然后再将驼峰中的属性值一个个赋值到下划线的属性实体中,这样就能取到对象中的值,返回给我的第三方调用,话说我的第三方也是够恶心的,给我的接口中的传参都是下划线分割,着实够恶心的吗,不知道我一直是一个规规矩矩的java小白吗,也是够了。哈哈。

方案二:相对来说就高大上了,这里的主要问题其实就是屏蔽全局的驼峰设置对于我们个别特殊的mapper实体映射的问题,这些下划线属性的命名的实体不能直接接收数据库的字段,相必我们都知道mybatis有俩种方式接收查询结果的数据,resultType和resultMap,解决这个问题,我们可以使用resultMap的方式接收数据,这样就可以屏蔽掉驼峰的影响,接收的数据会按照resultMap中的映射去接收数据,无论你是下划线字段还是驼峰字段还是其它乱七八糟的命名方式,其都可以映射,是不是很强大呢。哈哈,也怪小编自己比较懒,手动配置这些映射觉得特别麻烦,总是使用别名加resultType的方式接收数据,几乎不用resultMap,今天才体会到了其异乎强大的功能,存在即是合理的,真的是这个样子。感叹这些设计的精妙之处之时,也被这些作者的才华深深的折服了。

结语

好了,今天就码到这里了,虽然是比较水的一篇文章,但是也是希望那些初学者不要再犯和我一样的错误,别被身边的同事调侃,一个bug解一天,真的很扎心啊。

相关推荐
韩师学子--小倪6 小时前
fastjson与gson的toString差异
java·json
Drawing stars6 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
nbsaas-boot7 小时前
SQL Server 存储过程开发规范(公司内部模板)
java·服务器·数据库
行百里er7 小时前
用 ThreadLocal + Deque 打造一个“线程专属的调用栈” —— Spring Insight 的上下文管理术
java·后端·架构
玄〤7 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot
J_liaty7 小时前
Spring Boot拦截器与过滤器深度解析
java·spring boot·后端·interceptor·filter
亲爱的非洲野猪8 小时前
Java锁机制八股文
java·开发语言
rgeshfgreh8 小时前
C++字符串处理:STL string终极指南
java·jvm·算法
Zoey的笔记本8 小时前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
lpfasd1239 小时前
Spring Boot 4.0.1 时变更清单
java·spring boot·后端