Spring Boot JPA 实体类存储数据库日期类型的最优方案是什么
Spring Boot实体类存储数据库日期类型的最优方案
核心选型推荐
优先使用Java 8+ 内置的java.time.LocalDateTime类型,对应数据库的DATETIME(MySQL等关系型数据库)类型,完全匹配你需要存储的2021-02-19 17:00格式的无时区本地时间需求,是目前工业界的通用最优实践。
选型优势
- 线程安全,
java.time包下的所有时间类都是不可变类,不存在旧java.util.Date的线程安全问题 - 原生支持
yyyy-MM-dd HH:mm格式的映射,不需要额外做类型转换 - Spring Boot 2.x+ 版本默认支持该类型的持久化、序列化反序列化,不需要额外引入依赖
- 后续构建时间范围查询时语法更简洁,出错概率低
代码示例
1. 实体类配置
如果需要接口返回时固定时间格式,可以加@JsonFormat注解指定序列化规则:
import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDateTime; @TableName("event") public class Event { private Long id; private String eventName; // pattern指定要存储/返回的时间格式,timezone和应用、数据库的时区保持一致即可 @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private LocalDateTime happenTime; // 省略getter、setter }
2. 时间查询示例
Spring Data JPA 场景
直接通过方法名规则即可构造时间范围查询:
public interface EventRepository extends JpaRepository<Event, Long> { // 查询发生时间在指定区间内的事件 List<Event> findByHappenTimeBetween(LocalDateTime start, LocalDateTime end); // 查询2021年2月19日17点之后发生的事件 List<Event> findByHappenTimeAfter(LocalDateTime time); }
MyBatis/MyBatis-Plus 场景
直接传入LocalDateTime类型参数即可,框架会自动完成类型映射:
// 构造查询时间边界 LocalDateTime startTime = LocalDateTime.of(2021, 2, 19, 0, 0); LocalDateTime endTime = LocalDateTime.of(2021, 2, 19, 23, 59); // MyBatis-Plus Lambda查询示例 List<Event> events = eventMapper.selectList(Wrappers.<Event>lambdaQuery() .between(Event::getHappenTime, startTime, endTime) );
注意事项
- JDBC连接串需要配置正确的时区参数,比如MySQL的URL后缀加上
&serverTimezone=Asia/Shanghai,避免存取时出现8小时时间偏差 - 如果你的业务需要存储带时区的时间,可以选择
OffsetDateTime类型替换LocalDateTime,普通无时区的本地时间场景LocalDateTime完全够用,性能更好
内容的提问来源于stack exchange,提问作者Dmitriy
相关产品推荐
相关产品推荐

