Die alte Art der Verwendung von PreparedStatement::setDate und ResultSet ::getDate funktioniert für den alten Typ java.sql.Date. Es ist jedoch besser, die Verwendung dieser problematischen alten Datums-/Uhrzeitklassen zu vermeiden. Verwenden Sie stattdessen die modernen java.time-Typen.
Es gibt zwei Wege zum Austausch von java.time-Objekten über JDBC:
Wenn Ihr JDBC-Treiber kompatibel ist Mit der JDBC 4.2-Spezifikation oder höher können Sie direkt mit den java.time-Objekten umgehen. Kompatible Treiber kennen die java.time-Typen und haben setObject/getObject-Methoden hinzugefügt, um sie zu verarbeiten.
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 LocalDate wird in einen SQL DATE-Typ konvertiert.
Um Daten aus der Datenbank abzurufen, rufen Sie ResultSet::getObject auf. Anstatt das resultierende Object-Objekt umzuwandeln, können wir ein zusätzliches Argument übergeben, die Klasse des Datentyps, den wir erwarten. Durch die Angabe der erwarteten Klasse erhalten wir eine von Ihrer IDE und Ihrem Compiler überprüfte und verifizierte Typsicherheit.
Wenn Ihr JDBC-Treiber noch nicht JDBC 4.2 oder entspricht Später müssen Sie dann Ihre java.time-Objekte kurz in den entsprechenden java.sql-Typ konvertieren oder umgekehrt. Achten Sie auf neue Konvertierungsmethoden, die zu den alten Klassen hinzugefügt wurden.
Hier ist eine vollständig funktionierende Beispiel-App, die zeigt, wie man 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" ) ); preparedStatement.setObject ( 1 , today.minusDays ( 1 ) ); // Yesterday. preparedStatement.executeUpdate ( ); preparedStatement.setObject ( 1, today ); // Today. preparedStatement.executeUpdate ( ); preparedStatement.setObject ( 1, today.plusDays ( 1 ) ); // Tomorrow. preparedStatement.executeUpdate ( ); } // Query all. sql = "SELECT * FROM test_"; try ( ResultSet rs = stmt.executeQuery ( sql ) ; ) { while ( rs.next ( ) ) { UUID id = rs.getObject ( "id_" , UUID.class ); // Pass the class to be type-safe. LocalDate localDate = rs.getObject ( "date_", LocalDate.class ); // Pass class for type-safety. System.out.println ( "id_: " + id + " | date_: " + localDate ); } } } catch ( SQLException e ) { e.printStackTrace ( ); } } }
Das obige ist der detaillierte Inhalt vonWie nutzt man java.time-Typen effektiv mit JDBC für Datenbankinteraktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!