Utiliser efficacement JDBC pour faire fonctionner Java java.time
Les objets interagissent avec les bases de données PostgreSQL ou H2
Cet article explique comment utiliser efficacement JDBC pour insérer et récupérer des objets Java java.time
, tels que LocalDate
, dans une base de données PostgreSQL ou H2.
Méthode traditionnelle : utiliser PreparedStatement::setDate
et ResultSet::getDate
L'approche traditionnelle s'appuie sur le type obsolète java.sql.Date
, en utilisant PreparedStatement::setDate
et ResultSet::getDate
pour les opérations. Toutefois, pour éviter ces problèmes, des méthodes modernes sont recommandées.
Approche moderne : manipulation directe des java.time
types
Pilote compatible avec JDBC 4.2 et supérieur
La méthode la plus efficace consiste à utiliser un pilote compatible avec JDBC 4.2 et supérieur. Ces pilotes prennent en charge les objets java.time
directement, sans conversion de type.
Insérer des données : utilisez PreparedStatement::setObject(1, myLocalDate)
, où myLocalDate
est une instance d'objet LocalDate
. Le pilote détecte et convertit automatiquement vers le type SQL approprié.
Récupérer des données : utilisez ResultSet::getObject("my_date_column_", LocalDate.class)
pour récupérer LocalDate
objets. La spécification de la classe attendue garantit la sécurité du type.
Pilote hérité (en dessous de JDBC 4.2)
Pour les pilotes qui ne sont pas compatibles avec JDBC 4.2 et supérieur, il est nécessaire de convertir temporairement les java.time
objets en java.sql
types équivalents et vice versa.
Utilisez java.sql.Date.valueOf(myLocalDate)
pour convertir LocalDate
en java.sql.Date
.
Insérer des données : utilisez preparedStatement.setDate(1, java.sql.Date.valueOf(myLocalDate))
.
Récupérer des données : utilisez rs.getDate(1)
pour obtenir un objet java.sql.Date
, puis utilisez sqlDate.toLocalDate()
pour le convertir en LocalDate
.
Exemple de code utilisant un pilote compatible JDBC 4.2
<code class="language-java">import java.sql.*; import java.time.LocalDate; import java.time.ZoneId; import java.util.UUID; public class App { public static void main(String[] args) { 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 + " (" + "id_ UUID DEFAULT random_uuid() PRIMARY KEY ," + "date_ DATE NOT NULL" + ");"; stmt.execute(sql); 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)); preparedStatement.executeUpdate(); preparedStatement.setObject(1, today); preparedStatement.executeUpdate(); preparedStatement.setObject(1, today.plusDays(1)); preparedStatement.executeUpdate(); } sql = "SELECT * FROM test_"; try (ResultSet rs = stmt.executeQuery(sql);) { while (rs.next()) { UUID id = rs.getObject("id_", UUID.class); LocalDate localDate = rs.getObject("date_", LocalDate.class); System.out.println("id_: " + id + " | date_: " + localDate); } } } catch (SQLException e) { e.printStackTrace(); } } }</code>
Le résultat en cours d'exécution est similaire à :
<code>id_: e856a305-41a1-45fa-ab69-cfa676285461 | date_: 2017-03-26 id_: a4474e79-3e1f-4395-bbba-044423b37b9f | date_: 2017-03-27 id_: 5d47bc3d-ebfa-43ab-bbc2-7bb2313b33b0 | date_: 2017-03-28</code>
Exemple de code utilisant l'ancienne version du pilote (Identique au code original et ne sera pas répété ici)
En choisissant le bon pilote JDBC et en utilisant les méthodes appropriées, vous pouvez garantir une interaction efficace et sécurisée avec votre base de données. N'oubliez pas de prioriser l'utilisation de pilotes compatibles avec JDBC 4.2 et supérieur pour simplifier le code et améliorer l'efficacité.
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!