Problème
Comment peut-on vous insérez et récupérez des types java.time tels que LocalDate dans une base de données SQL comme H2 en utilisant JDBC ? L'ancienne méthode d'utilisation de PreparedStatement::setDate et ResultSet::getDate fonctionne pour l'ancien type java.sql.Date, mais vous souhaitez éviter d'utiliser ces anciennes classes date-heure gênantes. Quelle est la manière moderne d'envoyer des types java.time via un pilote JDBC ?
Solution
Il existe deux façons d'échanger des objets java.time via JDBC :
Les anciennes classes date-heure telles que java.util.Date, java.util.Calendar et leurs homologues java.sql associés tels que java. sql.Date est notoirement problématique, ayant été conçu avec une approche imparfaite et piratée. Ils sont sujets aux erreurs, gênants et déroutants. Évitez-les autant que possible, car ils ont désormais été remplacés par les classes java.time.
Utilisation de pilotes compatibles JDBC 4.2
Le pilote JDBC H2 intégré (à partir de 2017-03) semble être conforme à JDBC 4.2. Les pilotes conformes connaissent les types java.time. Au lieu d'ajouter les méthodes setLocalDate/getLocalDate, le comité JDBC a ajouté les méthodes setObject/getObject.
Pour envoyer des données à la base de données, transmettez simplement votre objet java.time à PreparedStatement::setObject. Le type Java de votre argument transmis est détecté par le pilote et converti en type SQL approprié. Un java.time.LocalDate est converti en un type SQL DATE. Voir la section 22 du document PDF JDBC Maintenance Release 4.2 pour une liste de ces mappages.
myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.
Pour récupérer des données de la base de données, appelez ResultSet::getObject. Plutôt que de convertir l'objet Object résultant, vous pouvez fournir un argument supplémentaire spécifiant la classe du type de données que vous prévoyez de recevoir. En spécifiant explicitement la classe attendue, vous bénéficiez de la sécurité de type, qui est vérifiée et vérifiée par votre IDE et votre compilateur.
LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);
Exemple de code :
Voici un exemple fonctionnel complet d'une application qui insère et sélectionne des valeurs LocalDate dans une base de données H2 :
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" ) );
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!