问题

最近在用 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 中没有DateTimejdbcType,但是有 TIMESTAMP。把 jdbcTypeDATE 改成 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,大概就是想当然的以为 javaTypeDate 就是映射 数据库的 DATE 吧。MySQL 中的 DATE 是没有 time的,而 TIME 是没有 date 的,DATETIME 则是两者的整合,既有 date 又有 time。同时 TIMESTAMPDATETIME 类似,但是范围更小,精度更大。