栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

【springboot】实体类承载数据库datetime字段遇到的问题及解决方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【springboot】实体类承载数据库datetime字段遇到的问题及解决方案

前言:本文主要用于我的个人学习与记录,内容如有谬误欢迎各位大佬斧正。同时,如果您想要快速获取问题的解决方案,请移步至文章底部“解决方案”栏,希望我的经验能对大家有所帮助。


问题描述

如题,由于项目需求中涉及到数据更新时间的记录,于是我在Mysql中设计了一个datetime类型的字段用于存放该时间,数据库内容如下:

本来最开始我们是相安无事的,但当我在entity层用hutool工具类提供的日期时间对象Datetime承载从数据库获取到的datetime数据时,控制台报错:

2022-08-09 15:04:04.469 ERROR 60464 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'time' of 'class com.ruocheng.springboot.entity.Housing' with value 'Tue Aug 09 16:21:51 CST 2022' Cause: java.lang.IllegalArgumentException: argument type mismatch] with root cause

同时前端表格内容显示为:


原因及思路

观察控制台报错内容,基本可以确定是Hutool提供的Datetime对象和Mysql的datetime类型不匹配造成的问题,但我查了好久的资料也没找到不匹配的根本原因,如果有知道的小伙伴可以评论或者私信告诉我。言归正传,于是我尝试用java.sql里的Date对象承载此数据,这次没有报错,前端表格内容也可以正常显示,但日期格式丢失了分秒时:

在这里我犯的是一个低级错误: java.sql的Date对象仅精确到yyyy-MM-dd也就是年月日,用它来承载datetime类型的数据会丢失后面的时分秒根本不足为奇,这时如果用 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解强行保持时间格式一致性,也只会显示00:00:00。

于是我又在大佬的建议下尝试用java.sql里的Timestamp对象承载该数据,成功在前端表格正确显示内容:

在这里有一个值得注意的点——在用各种方式保持时间格式一致性时,需要注意时区问题(系统默认的是GMT格林威治时间,而数据库储存的是GMT+8北京时间),如果不注意时区配置的话会出现显示时间与实际时间相差8小时的情况。此处我选择的是@JsonFormat注解,代码如下:

@Data
public class Housing {
    private String type;
    private String distract;
    private String table;
    private String sql;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Timestamp time;
}

 后来经过我的搜索,发现可以使用java.time里面的LocalDateTime对象,该对象能够匹配Mysql的datetime类型,并且由于LocalDateTime与datetime一样是表示的没有时区的日期时间,可以在保持时间格式一致性时无需注意时区配置。最终显示结果与上图一样,我就不额外贴图了。


解决方案

综上,该问题我总结出了两种解决方案:

  1. 使用java.sql.Timestamp对象承载datetime类型数据,需要注意时区转换
  2. 使用java.time.LocalDateTime对象承载datetime类型数据,无需注意时区

代码如下:

import java.sql.Timestamp;

@Data
public class Housing {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Timestamp time;
}

或者:

import java.time.LocalDateTime;

@Data
public class Housing {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Timestamp time;
}

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1040175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号