SpringBoot,Mybatis 使用Java8(JSR310)时间日期规范

2023-09-15 09:26:18


一. 依赖

⏹若使用的是SpringBoot

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.0.0</version>
</dependency>
  • 2.0.0以上的版本就支持JSR310时间规范。

⏹若使用的是Spring

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>2.0.5</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.5</version>
</dependency>
  • Mybatis在3.4.5版本(2017.8月份发布)之后,就内置了对jsr310的支持。

二. 前台

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSR310日期测试</title>
</head>
<body>
    <button id="btn1">点击发送请求</button>
</body>
<script th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
<script th:inline="javascript">
	$("#btn1").click(function() {
		
		// 各种时间格式
		const data = {
			date1: "2020/03/07 12:10:01",
			date2: "2020-03-06",
			date3: "12:10",
			date5: "202003",
			dateA: "2020/03/07",
			dateB: "2020年03月07日",
			dateC: "20200307",
		}
		
	    $.ajax({
	        url: "/test03/jsr310date",
	        type: 'POST',
	        data: JSON.stringify(data),
	        contentType: 'application/json;charset=utf-8',
	        success: function (data, status, xhr) {
	            console.log(data);
	        }
	    });
	});
</script>
</html>

三. Controller,Form,Service

⏹Controller

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/test03")
public class Test03Controller {
	
	@Resource
	private Test03Service service;

	@GetMapping("/init")
	public ModelAndView init() {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("test03");
		return modelAndView;
	}
	
	@PostMapping("/jsr310date")
	@ResponseBody
	public Test03Entity jsr310date(@RequestBody Test03Form form) throws Exception {
		
		return service.jsr310date(form);
	}
}

⏹Form

  • 后台使用LocalDate等时间类型接收前台数据时,需要使用@JsonFormat注解来指定数据格式。
  • @JsonFormat注解能指定前台向后台传入的数据类型,同时后台向前台返回的数据格式也会受其影响。
  • 若不想在每个字段上都添加@JsonFormat注解来指定格式,可以使用全局日期格式转换器,
    详情请参考这篇博客:SpringBoot Java8日期全局日期格式转换器
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;

import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.Data;

@Data
public class Test03Form {
	
	@JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
	private LocalDateTime date1;
	
	// yyyy-MM-dd 格式的日期字符串,可自动封装到LocalDate中
	private LocalDate date2;
	
	@JsonFormat(pattern = "HH:mm")
	private LocalTime date3;
	
	private Instant date4;
	
	// 年月时间格式也可直接封装
	@JsonFormat(pattern = "yyyyMM")
	private YearMonth date5;
	
	// yyyy-MM-dd 格式之外的日期字符串,需要通过@JsonFormat注解指定格式
	@JsonFormat(pattern = "yyyy/MM/dd")
	private LocalDate dateA;
	
	// 约束前端和后端的数据格式
	@JsonFormat(pattern = "yyyy年MM月dd日") 
	private LocalDate dateB;
	
	@JsonFormat(pattern = "yyyyMMdd")
	private LocalDate dateC;	
}

⏹Service

  • 向数据库中插入数据后,再查询插入的数据,返回前台查看效果。
import java.time.Instant;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class Test03Service {
	
	@Autowired
	private TestMapper03 mapper;

	@Transactional(rollbackFor = Exception.class)
	public Test03Entity jsr310date(Test03Form form) {
		
		form.setDate4(Instant.now());
		mapper.insertData(form);

		// 查询插入数据库中的数据
		return mapper.selectData();
	}
}

四. 数据库类型

⏹使用的是Mysql数据库,其中实体类属性和DB字段类型的对应关系如下

实体类属性DB字段类型
LocalDateTimedatetime
LocalDatedate
LocalTimetime
Instanttimestamp

在这里插入图片描述


五. 效果

  • 因为date4是时间戳类型,所以返回到前台的数据格式为: "2023-09-15T01:22:18Z"
  • 在前台时间戳可以通过new Date("2023-09-15T01:22:18Z")来转换为Date类型。
    在这里插入图片描述
更多推荐

功能测试如何编写测试用例

测试用例的编写需要按照一定的思路进行,而不是想到哪写到哪,一般测试机制成熟的公司都会有公司自己自定义的测试用例模板,以及一整套的测试流程关注点,当然我们自己在测试生涯中也应当积累一套自己的测试框架,所有功能性的测试都可以依据框架的思路来进行,达到事半功倍的效果。功能测试框架可以包括:界面友好性测试、功能测试、链接测试、

【Web3】创作者经济

这里写目录标题创作者经济是什么?创作者从Web1.0到Web3.0的演进Web1.0企业1985Web2.0平台的创作者2004Web3.0创造者/所有者2021粉丝经济的转变&四个阶段创作者经济的四个阶段创作者经济Web3.0工具创作者经济生态全景图OpenSeaFoundationPleasrDAONiftyPix

从 Hackathon 战队到创业公司,和开发者们聊聊真实世界 AI Apps 的基础设施丨活动预告

在不久前结束的TiDBFutureAppHackathon2023上,来自全球88个国家的1492名参赛者们借助AI和TiDBServerless的能力,构建了许多令人印象深刻的项目。打造Hackathon的项目是一个从0-1的过程,真实世界中也涌现出了一批创业公司正在围绕AI打造创新应用,并实现了规模化,取得了商业成

西门子S7协议及报文格式详解

一、简介S7Comm(S7Communication)是西门子专有的协议,是西门子S7通讯协议簇里的一种。S7通信协议是西门子S7系列PLC内部集成的一种通信协议,是S7系列PLC的精髓所在。它是一种运行在传输层之上的(会话层/表示层/应用层)、经过特殊优化的通信协议,其信息传输可以基于MPI网络、PROFIBUS网络

【pdf密码】打开PDF文件之后发现不能编辑,什么原因?

打开PDF文件的时候,没有提示带有密码,但是打开文件之后发现没有办法编辑PDF文件,这个是因为PDF文件设置了限制编辑,我们需要将限制取消才能够编辑文件。那么,我们应该如何取消密码,编辑文件呢?方法如下:打开PDF编辑器,点击工具栏中的文件,选择属性按钮,进入到熟悉感界面之后,点击安全,然后我们点击权限下拉框,选择无保

vue前后端分离单点登录,结合长token和短token进行登录

单点登录背景在公司发展初期,公司拥有的系统不多,通常一个两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登陆,很方便,但是,随着企业的发展,用到的系统随之增加,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说很不方便,也是就想到是不是可以在一个系统登陆,其它系统就不用登

无人车参考车辆与硬件平台

参考视频:Apollo自动驾驶入门课程参考车辆和硬件平台打造一个无人车,首先要开发一款可通过电子控制的基础车辆,而不仅仅是通过实体方向盘、油门踏板和刹车踏板来控制。这种类型的车辆具有特殊的名称:线控驾驶车辆该车有多种不同的传感器,参数由参考硬件规格定义。控制区域网络(CAN)车辆的内部通信网络,计算机系统通过CAN卡连

Java中的错误和异常

在Java中,错误(Error)和异常(Exception)是两种不同的情况。错误(Error)错误(Error)是指在程序运行过程中发生的严重问题,通常是由于系统资源不足或者虚拟机出现故障等原因引起的。错误是无法通过代码来处理或者捕获的,一旦发生错误,程序将无法继续执行。常见的错误包括OutOfMemoryError

Oracle SQL操作和查询

文章目录一、SQL简介二、数据类型讲解三、创建表和约束1.表结构2.更新表结构3.约束四、DML语句1.INSERT2.序列号3.UPDATE4.删除语句5.多行插入五、DQL语句1.简单查询语句1.1知识点讲解1.2案例讲解2.聚合函数3.分组查询4.多表查询一、SQL简介SQL是结构化查询语言(Structured

计算机竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录1前言2实现效果3CNN卷积神经网络4Yolov56数据集处理及模型训练5最后1前言🔥优质竞赛项目系列,今天要分享的是🚩**基于深度学习YOLOv5车辆颜色识别检测**该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:4分🧿

Java之Stream流及方法引用的详细解析二

2.6Stream流综合练习【应用】案例需求现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作男演员只要名字为3个字的前三人女演员只要姓林的,并且不要第一个把过滤后的男演员姓名和女演员姓名合并到一起把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据演员类Actor已经

热文推荐