localdate_在Java 8中在LocalDate和SQL日期之间进行转换

这篇教程介绍了如何在Java 8中将`LocalDate`转换为`java.sql.Date`,反之亦然,特别是在使用JPA框架时。通过实现`AttributeConverter`接口解决了JPA中LocalDate作为列类型时的映射问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

localdate

localdate

在Java 8中使用示例在LocalDate和java.sql.Date对象之间进行转换的快速指南。

1.概述

在本教程中,我们将学习如何在Java 8中将java.time.LocalDate转换为java.sql Date,反之亦然。

这很简单,但是在使用jpa框架时,处理表列类型有些不同。

首先来看一下Java中LocalDate和sql Date对象之间的简单转换。 接下来,查看JPA问题

2. LocalDate和SQL日期之间的方向转换

2.1将LocalDate转换为SQL日期

使用来自SQL Date.valueOf()方法的直接方法,该方法采用LocalDate对象。 因此,我们可以传递LocalDate.now()的对象或LocalDate.of()方法。

看下面的例子。

package com.javaprogramto.java8.dates.conversion.sql;

import java.sql.Date;
import java.time.LocalDate;

public class LocalDateToSQLDateExample {

	public static void main(String[] args) {

		// creating current local date using now() method and which will return the
		// curren date.
		LocalDate currentDate = LocalDate.now();

		// LocalDate to SQL date using valueOf() method.
		Date sqlDate = Date.valueOf(currentDate);

		// printing
		System.out.println("With current local date");
		System.out.println("LocalDate : " + currentDate);
		System.out.println("SQL Date : " + sqlDate);
		
		// working with different dates.
		LocalDate pastDate = LocalDate.of(1990, 01, 01);
		LocalDate futureDate = LocalDate.of(2050, 01, 01);
		
		// converting Local dates to sql dates
		Date pastSqlDate = Date.valueOf(pastDate);
		Date futureSqlDate = Date.valueOf(futureDate);
		
		System.out.println("\nWith different local dates");
		System.out.println("Past LocalDate : " + pastDate);
		System.out.println("Past SQL Date : " + pastSqlDate);
		
		System.out.println("Future LocalDate : " + futureDate);
		System.out.println("Future SQL Date : " + futureSqlDate);
	}
}

输出:

With current local date
LocalDate : 2020-12-04
SQL Date : 2020-12-04

With different local dates
Past LocalDate : 1990-01-01
Past SQL Date : 1990-01-01
Future LocalDate : 2050-01-01
Future SQL Date : 2050-01-01

如果将null值传递给Date.valueOf()方法,它将抛出NullPointerException

LocalDate nullLocalDate = null;
Date nullDate = Date.valueOf(nullLocalDate);

输出:

Exception in thread "main" java.lang.NullPointerException
	at java.sql/java.sql.Date.valueOf(Date.java:291)
	at com.javaprogramto.java8.dates.conversion.sql.LocalDateToSQLDateExample.main(LocalDateToSQLDateExample.java:38)

2.2将SQL日期转换为LocalDate

使用toLocalDate()方法将sql日期转换为Java 8中的LocalDate时间

package com.javaprogramto.java8.dates.conversion.sql;

import java.sql.Date;
import java.time.LocalDate;

public class SQLDateToLocalDateExample {

	public static void main(String[] args) {

		// Creating sql date
		Date sqlDate = Date.valueOf("2020-12-31");
		
		// converting sql date to localdate using toLocalDate() method.
		LocalDate localDate1 = sqlDate.toLocalDate();

		// printing the local date.
		System.out.println("Local Date 1 : "+localDate1);
	}
}

输出:

Local Date 1 : 2020-12-31

3. JPA问题解决AttributeConverter

如果您在JPA实体中使用LocalDate作为列类型,并且应该与数据库列类型进行某些映射。 对于这种类型,我们假设sql Date是列类型的正确选择。 但是,数据库无法识别类型LocalDate,并且JPA会将其映射为blob类型而不是java sql Date对象。

现在是问题所在。 为了解决这个问题,我们应该告诉JPA,如果有任何具有LocalDate类型的列,则在插入数据库时​​将其转换为java.sql.Date,而在从数据库中检索记录时将sql日期转换为LocalDate。

Java持久性api在jdk 1.7中添加了AttributeConverter接口。

我们需要实现AttributeConverter接口,并且需要指定输入对象类型转换结果对象类型

该接口有两个抽象方法convertToDatabaseColumn()convertToEntityAttribute()。

convertToDatabaseColumn()用于将LocalDate转换为sql日期并保存到数据库中。

从数据库中获取记录并转换为LocalDate时,将执行convertToEntityAttribute()方法。

我们在这两种方法中使用了Optional来更好地处理空引用,以避免空指针异常。

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.sql.Date;
import java.time.LocalDate;
import java.util.Optional;

@Converter(autoApply = true)
public class LocalDateConverterExample implements AttributeConverter<LocalDate, Date> {


	// converts LocalDate to sql date using valueOf() method
    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return Optional.ofNullable(localDate)
          .map(Date::valueOf)
          .orElse(null);
    }

	// converts sql date to LocalDate using toLocalDate() method
    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return Optional.ofNullable(date)
          .map(Date::toLocalDate)
          .orElse(null);
    }
}

观察上面的代码,我们已经将@Converter注释与元素autoApply一起使用了,它为true 。 这意味着应用此转换将由持久性提供程序应用于所有目标类型。

但是默认情况下,此属性autoApply设置为false

如果为同一目标类型定义了多个转换器,则应使用Convert注释显式指定要使用的转换器

4。结论

在本文中,我们已经看到了如何使用示例程序在Java中的LocalDate和SQL Date之间进行转换

并且还展示了如何使用AttributeConverter接口和@Converter注释解决JPA框架中的LocalDate类型问题

的GitHub

本地日期

Java 8 DateTime API

翻译自: https://www.javacodegeeks.com/2020/12/converting-between-localdate-and-sql-date-in-java-8.html

localdate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值