问题描述
我的项目中后台使用了
Springboot 2.2.1
Mybatis-Plus 3.2.0
Mysql5.7
Mysql驱动5.1.47
基本情况介绍
Mybatis-Plus默认会将数据库中的timestamp
字段生成为JAVA的LocalDateTime
类型属性,本于JAVA8的LocalDateTime
要比Date
要好上N个数量级,所以本文的基础是建立在我非要用LocalDateTime
这个类。
起先
我使用的Druid1.18做为的数据库连接池(大家如果有使用1.10版本的,问题肯定也同在)。
在查询数据库的时候会报错:
org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'create_time' from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException
原因其实是在Druid,他无法做这个转换。
解决办法
将druid的版本升级到1.1.21版本:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
结合文章开头的各个版本,会发现问题解决了。
其他问题
我的数据库User表有两个timestamp字段,只有一个可以设置默认curr_timestamp,另外一个默认变成了全0(0000-00-00 00:00:00),这样的字段在查询的时候会报一个错误:
com.mysql.cj.exceptions.DataReadException: Zero date value prohibited
这个问题的解决办法很简单,就是在url上添加上对null时间的转化处理:zeroDateTimeBehavior=convertToNull
?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull