mybatisPlus查询Oracle Date类型只精确到年月日问题用LocalDateTime解决

前言

mybatis/mybatisPlus查询oracle数据库时,如果字段类型和实体类属性都是Date类型,那么即使表里面的日期精确到时分秒,查出来的数据也只能精确到年月日,后面时分秒都为0,就算用@JsonFormat格式化也不起作用。这是因为oracle中date类型的字段,mybatis默认的jdbcType=“DATE” ,而当jdbcType="DATE"时,是只有年月日的。解决方法也很简单,在mapper.xml的resultMap中指定该字段的jdbcType=“TIMESTAMP” 即可。但是。。。mybatisPlus是不用写sql语句的啊,mapper.xml也是不需要的,难不成要为了在resultMap中指定jdbcType将所有的查询都改写为mapper.xml中的sql语句?这个时候就轮到LocalDateTime上场了

LocalDateTime介绍

LocalDateTime是JDK8新特性里的时间类,除了LocalDateTime以外,还有LocalDate 和LocalTime 。LocalDate是日期处理类 ,LocalTime是时间处理类 ,LocalDateTime可以设置年月日时分秒,相当于LocalDate + LocalTime 。它们的出现解决了Date类型需要进行格式化,否则可读性差的问题。就比如我们日常进行项目开发的时候,如果Date类型的属性不使用

@JsonFormat格式化的话,传到前台显示出来的结果就会像Tue Sep 10 09:34:04 CST 2019这样,可读性很差。但是如果将Date类型改为LocalDateTime类型,即使不进行格式化处理,也能显示出2020-03-04 16:56:40 这样的效果。可以说LocalDateTime能完美的替代Date

mybatisPlus+LocalDateTime遇到的问题及解决方法

介绍完LocalDateTime之后我们能发现,前言中查询Oracle Date只能精确到年月日的问题能用LocalDateTime完美解决。于是我便将所有Date类型的属性替换成LocalDateTime类型,并且因为LocalDateTime这种新日期类型的标准当mybatisPlus版本3.4之后才会自己识别 ,之前的版本需要引入JSR310 标准相关依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.2</version>
</dependency>

依赖引入之后重启项目查询时却报错:

org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'create_time' from result set.  Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException

搜索了这个报错之后发现了问题所在:我的项目的mybatis-plus版本为3.1.1,需要将版本降至3.1.0或以下,将版本更换至3.1.0之后重启项目不再报错:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>

至此,mybatisPlus查询Oracle Date类型只精确到年月日的问题使用LocalDateTime非常简单的解决了