java与mysql中的日期类型及二者的对应关系和使用场景

3,957 阅读2分钟

java和mysql各自的几个日期类型、orm框架(mybatis)下二者的对应关系,经常是傻傻分不清楚。

今天就来总结一拨。

java中的日期类型

  • java.util.Date 支持日期和时间,通用;
  • java.sql.Date 只支持日期,对应SQL的 date类型,格式:年月日;
  • java.sql.Time 只支持时间,对应SQL的 time类型,格式:时分秒 ;
  • java.sql.Timestamp 支持日期和时间,对应于SQL的 timestamp、datetime类型,格式:年月日时分秒毫秒;
  • java.time.Year 只支持年份,格式:整数。

可以看到,sql包下的日期类型还是蛮多的== 它们都是java.util.Date的子类;

需要注意:当实体中的类型是 java.sql.Date、java.sql.Time时,如果前端传回的日期字符串格式不符合要求,会转换异常。

mysql中的日期类型

数据类型格式占用字节最小值最大值零值表示
date年/月/日41000-01-019999-12-310000-00-00
time时:分:秒3-838:59:59838:59:5900:00:00
datetime年/月/日 时:分:秒81000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00: 00
timestamp年/月/日 时:分:秒4197001010800012038年的某个时刻0000000000000000
year整数1190121550000

mysql数据类型是datetime、timestamp的话,java类型为java.sql.Date、java.sql.Timestamp都是可以的。二者的存储方式、范围和大小都不同,感兴趣的看看 文档

实证

建个表来试试,里面包含了mysql的各种日期类型

列名数据类型
idint
dtdate
dtdatetime
ttime
tstimestamp
yyear

用navicat插入一行看看

idddtttsy
12023/1/142023-01-14 13:37:1513:37:192023-01-14 13:37:232023

mybatis测试下

image-20230114162611323.png

image-20230114162628626.png

总结

  • 实体与mysql中的日期类型可用的对照关系(mysql 5.7.29、mybatis 2.0):
实体mysql
java.util.Date、java.sql.Datedate
java.util.Date、java.sql.Timetime
java.util.Date、java.sql.Timestampdatetime
java.util.Date、java.sql.Timestamptimestamp
intyear
  • java.util.Date 通吃;
  • 实体中的各种日期类型其实都可以用java.util.Date或java.sql.Date,最终插入的格式由mysql来决定;
  • 我这里碰到个问题:@JsonFormat 失效了,java.util.Date到后台时没有格式化,奇怪。。。但是并不影响mysql数据插入。

总结得比较简单,只是测试验证,并没有翻源码。有对这一块儿了解得深的朋友希望能指导下,大家互相交流,感谢~~