JDBC for MySQL LocalDateTimeTypeHandler的一个版本的坑

前言

环境

  1. java 11
  2. MySQL 5.7.32
  3. MySQL-jdbc 5.1.39
  4. MyBatis-plus 3.4.3(内嵌MyBatis 3.5.7)
  5. SpringBoot 2.5.7
  6. Druid 1.2.6

1. 错误信息

Error attempting to get column 'update_time' from result set.  
Cause: java.sql.SQLException: Error<LF>; uncategorized SQLException; 
SQL state [null]; error code [0];

底层根本原因还是空指针异常

2. 查找相关解决方案后,常见结论(个人通过以下方式未解决)

  1. 更新Druid数据源 到 1.1.13 (未尝试,原本版本就是1.26)
  2. 换掉Druid数据源 (尝试后无法解决)
  3. 把MyBatis换到3.5.0 (尝试后无法解决)
  4. 添加一个Spring Bean继承LocalDateTimeTypeHandler 重写方法后,注入到容器中(尝试后无法解决,甚至无法进入断点)

个人认为非常接近了,因为我Debug到发生异常的地方就是 getData 后的值为null,调用toLocalDateTime就报空指针错误了,然后最外层的try catch 捕获到异常,就打印了最上面的错误信息

3. 后来找到一篇博客说 升级MySQL JDBC版本到5.1.47

5.x 最新版本已经到5.1.49,但还是说有3个漏洞

思路打开地址 https://www.cnblogs.com/cfas/p/16002017.html
博客作者解决了2个小时,我弄了4个小时QAQ

在这里插入图片描述

5.1.47 JDBC42ResultSet 中转换LocalDateTime,这里做了空值判断,为空返回null,不为空转换为LocalDateTime

4. 错误跟踪

1.org.apache.ibatis.type.LocalDateTimeTypeHandler#getNullableResult(java.sql.ResultSet, java.lang.String)

2.com.mysql.jdbc.ResultSetImpl#getObject(java.lang.String, java.lang.Class<T>)
//findColumn(String) 这里会把 Column转为列下标 

//这里就到这个有缺陷的方法了
3.com.mysql.jdbc.JDBC42ResultSet#getObject

在这里插入图片描述

这种版本问题太坑了,开始想着重写TypeHandler,因为用的MyBatis-plus自动映射,本来MyBatis可以自定义 TypeHandler解决的,框架虽好,但也是人写的,是人就一定会有错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值