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:
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.
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);
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" ) );
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!