Java >> Java tutorial >  >> Tag >> SQL

Konvertering mellem LocalDate og SQL Date

1. Oversigt

I dette hurtige selvstudie lærer vi hvordan du konverterer mellem java.time.LocalDate og java.sql.Date .

2. Direkte konvertering

For at konvertere fra LocalDate til java.sql.Date , kan vi blot bruge valueOf() metode tilgængelig i java.sql.Date . Ligeledes kan vi bruge:

til at konvertere den aktuelle dato
Date date = Date.valueOf(LocalDate.now());

Eller enhver anden specifik dato:

Date date = Date.valueOf(LocalDate.of(2019, 01, 10));

Desuden valueOf() kaster NullPointerException i tilfælde af en nul argument.

Lad os nu konvertere fra java.sql.Date  til LocalDate . Til det kan vi bruge toLocalDate() metode:

LocalDate localDate = Date.valueOf("2019-01-10").toLocalDate();

3. Brug af en AttributConverter

Lad os først forstå problemet.

Java 8 har masser af nyttige funktioner, herunder Date/Time API.

Men at bruge det med nogle databaser eller persistensrammer kræver lidt mere arbejde end forventet. For eksempel vil JPA kortlægge LocalDate egenskab til en klat i stedet for java.sql.Date objekt. Som følge heraf genkender databasen ikke LocalDate ejendom som en Dato type.

Generelt ønsker vi ikke at udføre en eksplicit konvertering mellem LocalDate og Dato .

Antag for eksempel, at vi har et objektobjekt med en LocalDate Mark. Når vi fortsætter denne enhed, skal vi fortælle persistenskonteksten, hvordan vi kortlægger LocalDate ind i  java.sql.Date .

Lad os anvende en simpel løsning ved at oprette en AttributConverter klasse:

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

    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return Optional.ofNullable(localDate)
          .map(Date::valueOf)
          .orElse(null);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return Optional.ofNullable(date)
          .map(Date::toLocalDate)
          .orElse(null);
    }
}

Som vi kan se, er AttributConverter grænsefladen accepterer to typer:LocalDate og Dato i vores tilfælde.

Kort sagt, convertToDatabaseColumn() og convertToEntityAttribute()  metoder vil tage sig af konverteringsprocessen. Inde i implementeringerne bruger vi Valgfri for nemt at håndtere mulige nul referencer.

Desuden bruger vi også @Converter anmærkning. Med autoApply=true egenskab, vil konverteren blive anvendt på alle tilknyttede attributter af entitetens type.

4. Konklusion

I dette hurtige selvstudie viste vi to måder at konvertere mellem java.time.LocalDate og java.sql.Date. Desuden præsenterede vi eksempler på brug af direkte konvertering og brug af en tilpasset AttributConverter klasse.

Som sædvanlig er den komplette kode til denne artikel tilgængelig over GitHub.


Java tag