Maison > base de données > tutoriel mysql > Comment puis-je insérer et récupérer efficacement des objets Java « java.time » dans et depuis une base de données Postgres ou H2 à l'aide de JDBC ?

Comment puis-je insérer et récupérer efficacement des objets Java « java.time » dans et depuis une base de données Postgres ou H2 à l'aide de JDBC ?

Susan Sarandon
Libérer: 2025-01-22 01:42:08
original
646 Les gens l'ont consulté

Utiliser efficacement JDBC pour faire fonctionner Java java.timeLes objets interagissent avec les bases de données PostgreSQL ou H2

How can I efficiently insert and retrieve Java `java.time` objects into and from a Postgres or H2 database using JDBC?

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.timetypes

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal