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 | 年/月/日 | 4 | 1000-01-01 | 9999-12-31 | 0000-00-00 |
| time | 时:分:秒 | 3 | -838:59:59 | 838:59:59 | 00:00:00 |
| datetime | 年/月/日 时:分:秒 | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00: 00 |
| timestamp | 年/月/日 时:分:秒 | 4 | 19700101080001 | 2038年的某个时刻 | 0000000000000000 |
| year | 整数 | 1 | 1901 | 2155 | 0000 |
mysql数据类型是datetime、timestamp的话,java类型为java.sql.Date、java.sql.Timestamp都是可以的。二者的存储方式、范围和大小都不同,感兴趣的看看 文档。
实证
建个表来试试,里面包含了mysql的各种日期类型
| 列名 | 数据类型 |
|---|---|
| id | int |
| dt | date |
| dt | datetime |
| t | time |
| ts | timestamp |
| y | year |
用navicat插入一行看看
| id | d | dt | t | ts | y |
|---|---|---|---|---|---|
| 1 | 2023/1/14 | 2023-01-14 13:37:15 | 13:37:19 | 2023-01-14 13:37:23 | 2023 |
mybatis测试下
总结
- 实体与mysql中的日期类型可用的对照关系(mysql 5.7.29、mybatis 2.0):
| 实体 | mysql |
|---|---|
| java.util.Date、java.sql.Date | date |
| java.util.Date、java.sql.Time | time |
| java.util.Date、java.sql.Timestamp | datetime |
| java.util.Date、java.sql.Timestamp | timestamp |
| int | year |
- java.util.Date 通吃;
- 实体中的各种日期类型其实都可以用java.util.Date或java.sql.Date,最终插入的格式由mysql来决定;
- 我这里碰到个问题:@JsonFormat 失效了,java.util.Date到后台时没有格式化,奇怪。。。但是并不影响mysql数据插入。
总结得比较简单,只是测试验证,并没有翻源码。有对这一块儿了解得深的朋友希望能指导下,大家互相交流,感谢~~