
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类型问题。
翻译自: https://www.javacodegeeks.com/2020/12/converting-between-localdate-and-sql-date-in-java-8.html
localdate