MySQL的datetime和Java的LocalDateTime转换失败

报错信息如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'time' from result set.  Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException

at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:96)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
at com.sun.proxy.$Proxy108.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:159)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:90)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy131.selectById(Unknown Source)

报错原因

网上查了下资料,是因为Druid线程池版本太低,不支持JDK8中的LocalDate、LocalTime、LocalDateTime等日期类型,所以解决方案就是升级druid依赖的版本

解决方法

Druid1.1.21版本后已经对这个问题进行了解决,所以我们引入版本为1.1.21或以上的Druid版本即可

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>

刷新maven重新运行即可

关于LocalDateTime的转换的坑

mybatis3.5.0之前会处理LocalDateTime类型,将java.sql.Timestamp 转换成 java.time.LocalDateTime

但是从mybatis3.5.1开始就不再处理LocakDateTime类型的转换,而是交给mysql-conector-java来实现

而 mysql-connector-java 5.1.37 之前都不支持这些类型

如果使用了3.5.1之后的mybatis和5.1.37的mysql-connector-java,那么就无法将正确转换LocalDateTime类型