Heim > Java > javaLernprogramm > Wie füge ich mit JDBC java.time.LocalDate-Objekte aus einer H2-Datenbank ein und rufe sie ab?

Wie füge ich mit JDBC java.time.LocalDate-Objekte aus einer H2-Datenbank ein und rufe sie ab?

Barbara Streisand
Freigeben: 2024-12-20 06:24:09
Original
844 Leute haben es durchsucht

How to Insert and Retrieve java.time.LocalDate Objects from an H2 Database using JDBC?

So fügen Sie java.time.LocalDate-Objekte aus einer SQL-Datenbank wie H2 ein und rufen sie ab

Problem

Wie kann Sie fügen java.time-Typen wie LocalDate mithilfe von JDBC in eine SQL-Datenbank wie H2 ein und rufen sie ab? Die alte Methode zur Verwendung von PreparedStatement::setDate und ResultSet::getDate funktioniert für den alten Typ java.sql.Date, Sie möchten jedoch die Verwendung dieser problematischen alten Datums-/Uhrzeitklassen vermeiden. Was ist die moderne Möglichkeit, Java.time-Typen über einen JDBC-Treiber zu senden?

Lösung

Es gibt zwei Möglichkeiten, Java.time-Objekte über JDBC auszutauschen:

  • JDBC 4.2-kompatible Treiber: Wenn Ihr JDBC-Treiber kompatibel ist Mit der JDBC 4.2-Spezifikation oder höher können Sie direkt mit java.time-Objekten umgehen.
  • Ältere Treiber, vor JDBC 4.2: Wenn Ihr JDBC-Treiber nicht mit JDBC 4.2 oder höher kompatibel ist, müssen Sie Sie müssen Ihre java.time-Objekte kurzzeitig in den entsprechenden java.sql-Typ konvertieren oder umgekehrt. Suchen Sie nach neuen Konvertierungsmethoden, die den alten Klassen hinzugefügt wurden.

Die alten Datums-/Uhrzeitklassen wie java.util.Date, java.util.Calendar und ihre zugehörigen java.sql-Gegenstücke wie java. sql.Date sind bekanntermaßen problematisch, da sie mit einem fehlerhaften, gehackten Ansatz entwickelt wurden. Sie sind fehleranfällig, problematisch und verwirrend. Vermeiden Sie sie nach Möglichkeit, da sie jetzt durch java.time-Klassen ersetzt wurden.

Verwendung von JDBC 4.2-kompatiblen Treibern

Der integrierte H2-JDBC-Treiber (ab 2017-03) scheint JDBC 4.2 zu entsprechen. Kompatible Treiber kennen java.time-Typen. Anstatt setLocalDate/getLocalDate-Methoden hinzuzufügen, hat das JDBC-Komitee setObject/getObject-Methoden hinzugefügt.

Um Daten an die Datenbank zu senden, übergeben Sie einfach Ihr java.time-Objekt an PreparedStatement::setObject. Der Java-Typ Ihres übergebenen Arguments wird vom Treiber erkannt und in den entsprechenden SQL-Typ konvertiert. Ein java.time.LocalDate wird in einen SQL-DATE-Typ konvertiert. Eine Liste dieser Zuordnungen finden Sie in Abschnitt 22 des PDF-Dokuments JDBC Maintenance Release 4.2.

myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.
Nach dem Login kopieren

Um Daten aus der Datenbank abzurufen, rufen Sie ResultSet::getObject auf. Anstatt das resultierende Object-Objekt umzuwandeln, können Sie ein zusätzliches Argument bereitstellen, das die Klasse des Datentyps angibt, den Sie erwarten. Durch die explizite Angabe der erwarteten Klasse erhalten Sie Typsicherheit, die von Ihrer IDE und Ihrem Compiler überprüft und verifiziert wird.

LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);
Nach dem Login kopieren

Codebeispiel:

Hier ist ein vollständiges Arbeitsbeispiel einer App, die LocalDate-Werte in eine H2-Datenbank einfügt und auswählt:

import java.sql.*;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.UUID;

public class App {
    public static void main ( String[] args ) {
        App app = new App ( );
        app.doIt ( );
    }

    private void doIt ( ) {
        try {
            Class.forName ( "org.h2.Driver" );
        } catch ( ClassNotFoundException e ) {
            e.printStackTrace ( );
        }

        try (
                Connection conn = DriverManager.getConnection ( "jdbc:h2:mem:trash_me_db_" ) ;
                Statement stmt = conn.createStatement ( ) ;
        ) {
            String tableName = "test_";
            String sql = "CREATE TABLE " + tableName + " (\n" +
                    "  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
                    "  date_ DATE NOT NULL\n" +
                    ");";
            stmt.execute ( sql );

            // Insert row.
            sql = "INSERT INTO test_ ( date_ ) " + "VALUES (?) ;";
            try ( PreparedStatement preparedStatement = conn.prepareStatement ( sql ) ; ) {
                LocalDate today = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie füge ich mit JDBC java.time.LocalDate-Objekte aus einer H2-Datenbank ein und rufe sie ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage