责编:乐乐 | 来源:青石路
链接:cnblogs.com/youzhibing/p/18019399
编程技术圈(ID:study_tech)第 3035 期推文
往日回顾:ChatGPT 4o 国内直接用!
正文
大家好,我是小乐。
MyBatis 替换成 MyBatis-Plus
背景介绍
一个老项目,数据库用的是 MySQL 5.7.36 , ORM 框架用的 MyBatis 3.5.0 , mysql-connector-java 版本是 5.1.26
新来了一个干练的小伙,精力充沛,看着就是一个喜欢折腾的主
他就觉得 MyBatis 使用起来不够简单,要写的代码还比较多,觉得有必要替换成 MyBatis-Plus
Mybatis-Plus 替换 Mybatis
先准备一张表 tbl_order ,然后初始化 2 条数据
只是用 MyBatis-Plus 替换 MyBatis ,其他组件的版本暂不动
Mybatis-Plus 版本就用 "小伙" 引用的版本:3.1.1 , mysql-connector-java 版本保持不变还是 5.1.26
示例代码:play_it_safe
此时运行 com.qsl.OrderTest#orderListAllTest ,会报错,异常信息如下
注意看 Caused by
不支持的转换类型:java.time.LocalDateTime
谁不支持?mysql-connector-java 不支持!
那 mysql-connector-java 哪个版本支持了,答案是:5.1.37
升级mysql-connector-java
将 mysql-connector-java 升级到 5.1.37 ,再执行下 com.qsl.OrderTest#orderListAllTest
不再报异常,查询结果也正确
MyBatis-Plus 替换 Mybatis 似乎就完成了
顺的让人有点怀疑
Conversion not supported for type java.time.LocalDateTime
我们再回过头去看看前面说到的异常:Conversion not supported for type java.time.LocalDateTime
Mybatis-Plus 替换 MyBatis 之前没这个异常,替换之后就有了这个异常,这不是 Mybatis-Plus 的问题?
如何找这个异常的根因了?
很简单,直接从异常堆栈入手
点了之后,你会发现方法很简单
这么简单的代码能有什么问题?
大家注意看图中左上角 MyBatis 的版本,是 3.5.1,并不是最初的 3.5.0
有小伙伴可能会问了:不是用 MyBatis-Plus 替换了 MyBatis 吗,怎么还有 Mybatis ?
这个问题问的真的好,我只想给你个大嘴巴子
你看下 MyBatis-Plus 的官方说明
既然基于 Mybatis 3.5.0 没有抛异常,而基于 3.5.1 抛了异常, LocalDateTimeTypeHandler 在 3.5.1 肯定做了调整
我们来看下调整了什么?
看出什么了?
MyBatis 3.5.0 会处理 LocalDateTime 类型的转换(将 java.sql.Timestamp 转换成 java.time.LocalDateTime )
然而,注意了,然而来了!!!
然而从 MyBatis 3.5.1 开始,不再处理 LocalDateTime (还包括:LocalDate 、 LocalTime )类型的转换
而是交由 JDBC 组件,也就是 mysql-connector-java 来实现
而巧的是, mysql-connector-java 5.1.26 不支持类型 LocalDateTime
那它支持哪些类型了?
我们同样从异常堆栈入手
点了之后,可以看到下图
往上滑动鼠标,就可以看到支持的类型了
确实没有 LocalDateTime 、 LocalDate 和 LocalTime
mysql-connector-java 5.1.37 开始支持 LocalDateTime 、 LocalDate 和 LocalTime ,前面已经介绍过了,不再过多赘述
总结下异常根因:MyBatis 3.5.1 开始不再处理 LocalDateTime 、 LocalDate 和 LocalTime 的转换,而 mysql-connector-java 5.1.37 之前都不支持这些类型
弄清楚这个异常的来龙去脉之后,顺的是不是又理所当然一些了?
暴风雨的来临
版本上线没 2 天,该来的终究还是来了
我们往表 tbl_order 中插入一条记录:INSERT INTO tbl_order
VALUES (3, 'asdfgh', NULL, '2024-02-21 20:01:31.111', '2024-02-21 20:02:56.764');
再执行 com.qsl.OrderTest#orderListAllTest
此刻我就想问 "小伙" :刺不刺激?
碰到了异常,那就找原因
同样从异常堆栈入手
看出什么了?
如果 getTimestamp(columnIndex) 得到的是 NULL ,不就 NullPointerException ?严谨性了?
修复问题要紧,我们先看哪个版本进行修复了?
将 mysql-connector-java 升级到 5.1.42
问题得以修复
经此一役, "小伙" 似乎成长了很多,但眼里的光却暗淡了不少
mybatis-plus-issues-1114
无意中看到了这个issue-1114,跟我们前面分析的 Conversion not supported for type java.time.LocalDateTime 是不是同一个问题?
只是我们用到的数据库连接池是默认的 HikariCP 而非 Druid
结合druid/issues/3302来看,如果使用 Druid 作为数据库连接池,出现的异常可能跟我们前面分析的确实不一样
所以大家需要根据自己的实际情况来分析,但针对异常的分析方法是通用的
修了“不该修的Bug”
这是我亲身经历的一次事故,到现在都觉得这锅背的有点冤
背景介绍
文件分为主文件和附属文件,主文件生成之后再生成附属文件
附属文件生成的时候,会校验其依赖的主文件是否都生成了,如果有任意一个主文件未生成,依赖文件不能生成并抛出异常
这个业务还是比较简单吧
但在附属文件校验的优化上,我背上了生产事故
优化前的校验
listFileGenerateLog 作用是根据参数查询文件生成记录,具体实现不用关注
这个校验逻辑是什么?只要有任意一个主文件生成,校验就算通过了,与业务要求(主文件全部生成,才算校验通过)不匹配呀
这不是妥妥的 Bug ?
优化后的校验
碰到 Bug 你能忍?我是忍不了一点,反手就是一个优化
这是不是就符合业务要求了?
生产异常
中午升级之后,稳定运行了一段时间,期间文件正常生成,没出现任何问题
晚上 19 点,有个附属文件生成失败,异常提示:依赖的资源[abc_{yyyyMMdd}.txt]未生成
当时看到这个异常的第一眼,觉得既熟悉又陌生,熟悉的是这个异常信息的结构,陌生的是 abc_{yyyyMMdd}.txt ,这不是文件名吗?
正常来讲应该是 fileId ,是一个自增的正整数呀,怎么会是文件名了?
脑中瞬间闪过一个念头:数据库数据有问题?
一查吓一跳,这个附属文件关联主文件的字段值是:4356,abc_{yyyyMMdd}.txt ,看最终修改时间是:2021-08-21 15:22:12.652
4356 文件的文件名就是 abc_{yyyyMMdd}.txt ,正常来讲,这个关联字段的值应该是:4356
敢情这个 校验Bug 完美的兼容了这个脏数据 ,所以几年了,一直没出现异常
是不是有这味了?
这可倒好,我把 Bug 修好,还出现问题了,你说我是不是手贱?
经此一役,我眼里的光又暗淡了些许
总结
关于对组件的升级,或者对旧代码的调整,都有可能牵一发动全身,影响甚大
我的观点是:能不动就不要动,改好没绩效,改出问题要背锅,吃力不讨好,又不是不能跑
如果到了不得不改的地步了,那就需要全面的测试
你还有什么想要补充的吗?
最后给大家推荐一个ChatGPT 4.0国内网站,是我们团队一直在使用的,我们对接是OpenAI官网的账号,给大家打造了一个一模一样ChatGPT,很多粉丝朋友现在也都通过我拿这种号,价格不贵,关键还有售后。
一句话说明:用官方一半价格的钱,一句话说明:用跟官方 ChatGPT4.0 一模一样功能,无需魔法,无视封号,不必担心次数不够。
最大优势:可实现会话隔离!突破限制:官方限制每个账号三小时可使用40次4.0本网站可实现次数上限之后,手动切换下一个未使用的账号【相当于一个4.0帐号,同享受一百个账号轮换使用权限】
为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:ChartGPT与副业。想带着大家一起探索ChatGPT和新的AI时代。
有很多小伙伴搞不定ChatGPT账号,于是我们决定,凡是这三天之内加入ChatPGT的小伙伴,我们直接送一个正常可用的永久ChatGPT独立账户。
不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了8个专栏、18个副业项目:
简单说下这个星球能给大家提供什么:
1、不断分享如何使用ChatGPT来完成各种任务,让你更高效地使用ChatGPT,以及副业思考、变现思路、创业案例、落地案例分享。
2、分享ChatGPT的使用方法、最新资讯、商业价值。
3、探讨未来关于ChatGPT的机遇,共同成长。
4、帮助大家解决ChatGPT遇到的问题。
5、提供一整年的售后服务,一起搞副业
星球福利:
1、加入星球4天后,就送ChatGPT独立账号。
2、邀请你加入ChatGPT会员交流群。
3、赠送一份完整的ChatGPT手册和66个ChatGPT副业赚钱手册。
其它福利还在筹划中... 不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !
本星球第一期原价399,目前属于试运营,早鸟价149,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以更高价格加入了。。
早就是优势。建议大家尽早以便宜的价格加入!
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最简单的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了
猜你还想看
牛逼啊!接私活必备的 400 多个开源项目!赶快收藏吧(附源码合集)!
用雪花 id 和 uuid 做 MySQL 主键,被领导怼了
项目从 MySQL 切换 PostgreSQL,踩了太多的坑!!!
嘿,你在看吗?