前言
环境
- java 11
- MySQL 5.7.32
- MySQL-jdbc 5.1.39
- MyBatis-plus 3.4.3(内嵌MyBatis 3.5.7)
- SpringBoot 2.5.7
- 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. 查找相关解决方案后,常见结论(个人通过以下方式未解决)
- 更新Druid数据源 到 1.1.13 (未尝试,原本版本就是1.26)
- 换掉Druid数据源 (尝试后无法解决)
- 把MyBatis换到3.5.0 (尝试后无法解决)
- 添加一个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解决的,框架虽好,但也是人写的,是人就一定会有错误。