问题
最近在用 Spring Boot 重写 LightBlog,查询到的博客的 Date 属性的日期正常,但是时间始终为 00:00:00
。
resultMap
映射如下:
1
2
3
4
5
6
7
8
9
10
|
<resultMap id="blogMap" type="Blog">
<id property="blogId" column="blog_id"/>
<result property="blogUid" column="blog_uid"/>
<result property="blogTagId" column="blog_tag_id"/>
<result property="blogContent" column="blog_content"/>
<result property="blogTime" column="blog_time" javaType="Date" jdbcType="DATE"/>
<result property="blogLike" column="blog_like"/>
<result property="blogUnLike" column="blog_unlike"/>
<result property="blogComment" column="blog_comment"/>
</resultMap>
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Blog {
// only provide getter
private Long blogId;
private Long blogUid;
private Long blogTagId;
public String blogContent;
public Date blogTime;
public Integer blogLike;
public Integer blogUnLike;
public Integer blogComment;
}
|
既然日期是正常的,那么mapper映射应该是正常的。问题应该出在映射blogTime
的语句:
1
|
<result property="blogTime" column="blog_time" javaType="Date" jdbcType="DATE"/>
|
在数据库中 blog_time
的类型为 DateTime
,但是查 MyBatis 的官方文档, jdbcType 中没有 DateTime
。
解决方法
MyBatis 中没有DateTime
的 jdbcType
,但是有 TIMESTAMP
。把 jdbcType
从 DATE
改成 TIMESTAMP
或者不设置。
那么MyBatis会把 Date 自动映射成TIMESTAMP
。
正确写法:
1
2
3
|
<result property="blogTime" column="blog_time" javaType="Date"/>
<!-- 或者 -->
<result property="blogTime" column="blog_time" javaType="Date" jdbcType="TIMESTAMP"/>
|
至于一开始为啥把 jdbcType
设置成 DATE,大概就是想当然的以为 javaType
的 Date
就是映射 数据库的 DATE
吧。MySQL 中的 DATE
是没有 time的,而 TIME
是没有 date 的,DATETIME
则是两者的整合,既有 date 又有 time。同时 TIMESTAMP
和 DATETIME
类似,但是范围更小,精度更大。