首页 > 其他分享 >JdbcTemplate.queryForList()查询结果如何对Date等日期类型进行格式化?

JdbcTemplate.queryForList()查询结果如何对Date等日期类型进行格式化?

时间:2024-01-31 16:14:54浏览次数:26  
标签:java queryForList yyyy HH JdbcTemplate new Date import 序列化

1.情景展示

在实际开发中,我们往往会遇到这样的需求:

需要对多个数据库进行操作,这用mybatis等框架来进行操作显然不合理,也无法满足多样化的需求。

通过java来进行JDBC操作无疑是最好的选择。

如下图所示,通过org.springframework.jdbc.core.JdbcTemplate.queryForList()方法查询到的数据,含有日期类型。

最终返回给前端的时候日期类在进行序列化时,被转成了这个样子,如何对日期类型数据进行格式化?

2.具体分析

有两种思路:

一种是不使用queryForList方法,而采用其它方法,在拿到数据时进行转换。

另一种是仍然使用queryForList()获取数据,在返回给前端的时候手动进行序列化操作,而不是依赖spring的自动序列化功能。

3.解决方案

我这里推荐大家使用第二种方式:对queryForList()的返回结果进行二次处理。

其实,日期类型被转换成数组形式,本质上是JSON对象序列化的默认序列策略,我们只需要指定日期类型的序列化格式,这个问题就迎刃而解了。

实际上,是解决JSON序列化过程中对于日期类型的处理模式问题。

原本的操作方式是:

让spring自动序列化返回的数据

由于spring自动序列化的方式并不符合我们的实际需求,所以,序列化这一步骤就不让spring类处理了。

直接返回序列化后的字符串,也就是String类型。

第一步:响应前端的数据直接指定为String类型

第二步:对queryForList()的查询结果进行序列化

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
 * 将日期类型进行格式化(转成时间字符串)
 * java.time.LocalDateTime-->yyyy-MM-dd HH:mm:ss
 * java.time.LocalDate-->yyyy-MM-dd
 * java.time.LocalTime-->HH:mm:ss
 * java.util.Date-->yyyy-MM-dd HH:mm:ss
 * java.sql.Timestamp-->yyyy-MM-dd HH:mm:ss
 * @description: 通过Jackson实现
 * @attention: 如果自定义key名称的话,通过添加注解@JsonProperty来实现
 * @date: 2024/1/31 10:58
 * @param: bean java类对象
 * @return: java.lang.String json字符串
 */
public static String convertDateToStr(Object bean) {
    if (null == bean) return "";

    String jsonStr;
    try {
        ObjectMapper mapper = new ObjectMapper();
        // 初始化JavaTimeModule
        JavaTimeModule timeModule = new JavaTimeModule();
        // 设置LocalDateTime的序列化格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
        // 设置LocalDate的序列化格式
        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateTimeFormatter));
        // 设置LocalTime的序列化格式
        dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        timeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(dateTimeFormatter));
        // 设置Date的序列化格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        timeModule.addSerializer(Date.class, new DateSerializer(true, sdf));
        // 设置Timestamp的序列化格式
        timeModule.addSerializer(Timestamp.class, new DateSerializer(true, sdf));

        mapper.registerModule(timeModule);
        jsonStr = mapper.writeValueAsString(bean);
    } catch (JsonProcessingException e) {
        log.error("JavaBean-->json字符串转换失败:" + e.getMessage());
        return "";
    }

    return jsonStr;
}

将查询结果进行序列化并返回。

 

4.效果展示 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

标签:java,queryForList,yyyy,HH,JdbcTemplate,new,Date,import,序列化
From: https://www.cnblogs.com/Marydon20170307/p/17999474

相关文章

  • 对比Spring Boot中的JdbcClient与JdbcTemplate
    本文我们一起看看SpringBoot中JdbcClient和JdbcTemplate之间的差异。以下内容使用的Java和SpringBoot版本为:Java21SpringBoot3.2.1假设我们有一个ICustomerService接口:publicinterfaceICustomerService{List<Customer>getAllCustomer();Option......
  • presto、hive使用year、month、date函数使用注意事项
    经过尝试,presto查询速度更快,于是使用presto引擎查询,直接将在hive中使用的sql拷贝到presto执行,遇到各种问题。遇到问题以下sql在hive中执行成功,变量日期是2024-01-02这样的格式但在presto中执行报错,如下:解决方法通过观察报错信息最后两行,推测很可能是因为数据类型不正确,所以......
  • "command failed" err="failed to run Kubelet: validate service connection: valida
    场景:更换版本1.18.0为1.26.0启动kubelet报错,""commandfailed"err="failedtorunKubelet:validateserviceconnection:validateCRIv1runtimeAPIforendpoint\"unix:///run/containerd/containerd.sock\":rpcerror:code=Unimplement......
  • [office] EDATE函数计算合同到期日
    每个公司都会有合同管理,做为HR管理人员,做一个自己一目了然的合同到期模板,是非常有必要的。今天一下合同到期模板的制作。包括:根据合同签订日期与合同期限用EDATE函数计算合同到期日;DATEDIF计算距离到期日的天数,并设置“交通三色灯”提醒。关键操作根据合同签订日期与期限计算到期日......
  • SpringBoot中使用LocalDateTime踩坑记录
    目录前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目基于Java21和SpringBoot3开发,序列化工具使用的是默认的Jackson,使用SpringDataRedis操作Redis缓......
  • Java中SimpleDateFormat时YYYY与yyyy以及HH和hh的区别注意踩坑
    场景Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131052335在使用SimpleDateFormat在获取当前日期时因使用了YYYY导致20231231这个日期被格式化为20241231这里推荐在日期处理时统一使用封装工具......
  • MySQL中,当update修改数据与原数据相同时会再次执行吗?
    一、背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?二、测试环境MySQL5.7.25Centos7.4三、binlog_format为ROW1、参数 2、测试步骤session1session2session13、总结在binlog_format=row和binlog_row_image......
  • js date时间设置
    //获取上个月最后一天vardate1=newDate();//console.log(date1);//当天date1.setDate(0);//setDate(day)方法用于设置一个月的某一天。day取1-31表示对应的天数,另外0为上一个月的最后一天,-1为上一个月最后一天之前的一天,32为下个月的第一天或者第二天//console.log(date1......
  • Spring的JdbcTemplate使用教程
    什么是JdbcTemplate?Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。准备工作引入jdbcTemplate的相关依赖:案例实操创建jdbc.properties文件,配置数据库信息jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/dbtest1?serv......
  • git pull : 提示 can't lock ref 'xxxx' ,some local refs could not be update
    在执行gitpull操作时可能会遇到can'tlockref'xxxx',somelocalrefscouldnotbeupdate;tryrunninggitremotepruneorigintoremoveanyold,conflictingbranches。出现以上的问题的原因是本地所追踪的远程分支,与本地对应分支不同,导致的gitpull失败。如有一......