MyBits 映射MySQL数据库YEAR类型Java实体类型选取
情景
最近在开发的时候遇到需要使用MySQL存储年份,发现MySQL有YEAR类型可以存储年份,YEAR有2位(最好使用4位)和4位格式的年。 默认是4位。如果实际应用只保存年份,那么用1bytes 保存 YEAR 类型完全可以。不但能够节约存储空间,还能提高表的操作效率。于是我也在数据库数据库添加了一个YEAR类型用来存取年份。
具体操作
数据库添加字段
alter table mytable ADD COLUMN `year` YEAR DEFAULT '0000' COMMENT '年份' AFTER `type`;
通过Maven插件之mybatis-generator(mybatis自动生成实体代码的插件)自动生成实体类,自动生成的java对象year字段的类型转化为Java的Date类型,通过java代码插入时报错,debug发现year字段插入的Date类型的数据为Sun Aug 11 12:05:36 CST 2019 ,而数据库只需要2019,导致插入报错。
找到原因了,那么我们修改下,把year 在java实体类的类型改为int,重新插入数据,这次不报错了,直接插入的时候不会选择year字段,这就更尴尬了,准备Google一下,看下广大网友有没有类似的情况,结果没找到一篇文章,无奈只能自己看了,看mapper文件发现,数据库其他要是使用int类型的数据,定了的实体类型为Integer,而我定义为int,会不会是这个问题,于是我修改为Integer,再次测试,终于成功,万幸!
拓展 MySQL时间所有的类型
类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 |
---|---|---|---|---|---|
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 | 2038-01-19 03:14:07 | 0000-00-00 00:00:00 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 bytes | HH:MM:SS | 00:00:00 | 23:59:59 | 00:00:00 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0 |