Maison >Java >javaDidacticiel >Comment utiliser efficacement les types java.time avec JDBC pour les interactions avec les bases de données ?

Comment utiliser efficacement les types java.time avec JDBC pour les interactions avec les bases de données ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-24 19:06:14908parcourir

How to Effectively Use java.time Types with JDBC for Database Interactions?

Comment insérer et récupérer des types java.time tels que LocalDate vers/depuis une base de données SQL telle que H2

L'ancienne façon d'utiliser PreparedStatement::setDate et ResultSet ::getDate fonctionne pour l'ancien type java.sql.Date. Cependant, il est préférable d’éviter d’utiliser ces anciennes classes date-heure gênantes. Utilisez plutôt les types java.time modernes.

Il existe deux manières d'échanger des objets java.time via JDBC :

Pilotes compatibles JDBC 4.2

Si votre pilote JDBC est conforme avec la spécification JDBC 4.2 ou ultérieure, vous pouvez gérer directement les objets java.time. Les pilotes conformes connaissent les types java.time et ont ajouté les méthodes setObject/getObject pour les gérer.

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 LocalDate est converti en un type SQL DATE.

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, nous pouvons transmettre un argument supplémentaire, la classe du type de données que nous espérons recevoir. En spécifiant la classe attendue, nous obtenons une sécurité de type vérifiée par votre IDE et votre compilateur.

Pilotes plus anciens, avant JDBC 4.2

Si votre pilote JDBC n'est pas encore conforme à JDBC 4.2 ou plus tard, vous devrez alors convertir brièvement vos objets java.time en leur type java.sql équivalent ou vice versa. Recherchez les nouvelles méthodes de conversion ajoutées aux anciennes classes.

Voici un exemple d'application complet montrant comment insérer et sélectionner 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" ) );
                preparedStatement.setObject ( 1 , today.minusDays ( 1 ) );  // Yesterday.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today );                  // Today.
                preparedStatement.executeUpdate ( );
                preparedStatement.setObject ( 1, today.plusDays ( 1 ) );   // Tomorrow.
                preparedStatement.executeUpdate ( );
            }
            // Query all.
            sql = "SELECT * FROM test_";
            try ( ResultSet rs = stmt.executeQuery ( sql ) ; ) {
                while ( rs.next ( ) ) {
                    UUID id = rs.getObject ( "id_" , UUID.class );  // Pass the class to be type-safe.
                    LocalDate localDate = rs.getObject ( "date_", LocalDate.class );  // Pass class for type-safety.
                    System.out.println ( "id_: " + id + " | date_: " + localDate );
                }
            }
        } catch ( SQLException e ) {
            e.printStackTrace ( );
        }
    }
}

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