Maison >Java >javaDidacticiel >Comment insérer et récupérer des objets java.time.LocalDate à partir d'une base de données H2 à l'aide de JDBC ?

Comment insérer et récupérer des objets java.time.LocalDate à partir d'une base de données H2 à l'aide de JDBC ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-20 06:24:09800parcourir

How to Insert and Retrieve java.time.LocalDate Objects from an H2 Database using JDBC?

Comment insérer et récupérer des objets java.time.LocalDate à partir d'une base de données SQL comme H2

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 :

  • Pilotes compatibles JDBC 4.2 : Si votre pilote JDBC est conforme aux Spécification JDBC 4.2 ou version ultérieure, vous pouvez gérer directement les objets java.time.
  • Pilotes plus anciens, avant JDBC 4.2 : Si votre pilote JDBC n'est pas conforme à JDBC 4.2 ou version ultérieure, vous devez convertissez brièvement vos objets java.time en leur type java.sql équivalent ou vice versa. Recherchez de nouvelles méthodes de conversion ajoutées aux anciennes classes.

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!

Déclaration:
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