web-dev-qa-db-fra.com

Obtention de la date d'un ResultSet pour une utilisation avec les classes Java.time

Existe-t-il de toute façon une classe horaire compatible Java.time (new in Java 8)) à partir d'un ResultSet?

Je sais que vous pouvez utiliser ResultSetgetDate ou getTimestamp mais ces méthodes renvoient Java.sql.Date/Java.sql.Timestamp objets qui sont maintenant obsolètes, il semble donc de mauvaise pratique de les utiliser afin de créer un ZonedDateTime ou similaire.

20
Thomas Paulin

La plupart des fournisseurs de bases de données ne prennent pas encore en charge JDBC 4.2 . Cette spécification indique que les nouveaux Java.time - types comme LocalDate seront/devraient être pris en charge en utilisant les méthodes existantes setObject(...) et getObject(). Aucune conversion explicite n'est requise et offerte (pas de changement d'API).

Une solution de contournement pour le support manquant peut être une conversion manuelle comme décrit sur la liste de diffusion Derby .

Quelque chose comme:

LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();

Comme vous pouvez le voir, ces conversions utilisent les types non obsolètes Java.sql.Date Etc., voir aussi javadoc .

20
Meno Hochschild

Nouvelles méthodes sur Timestamp

Java 8 inclut de nouvelles méthodes sur le Java.sql.Timestamp classe pour convertir vers et depuis les objets Java.time. Ces méthodes pratiques sont une mesure provisoire jusqu'à ce que les pilotes JDBC puissent être mis à jour pour les nouveaux types de données.

Idem pour Date & Time

Le Java.sql.Date et Java.sql.Time les classes ont des méthodes de conversion Java.time similaires ajoutées dans Java 8 également.

17
Basil Bourque

Aujourd'hui, la plupart d'entre nous utilisent des pilotes compatibles JDBC 4.2, ce qui améliore sensiblement la situation par rapport aux réponses de 2015.

Pour obtenir un LocalDate de votre jeu de résultats:

    LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);

ou

    LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);

Aucune nouvelle méthode n'a été ajoutée à ResultSet pour que cela fonctionne. La méthode getObject était là tout le temps. La nouveauté est que depuis JDBC 4.2, il accepte LocalDate.class comme deuxième argument et renvoie un LocalDate. Ce qui précède fonctionne lorsque la requête renvoie une colonne avec le type de données SQL date (vraiment le type JDBC compte, mais ils ont tendance à être d'accord).

Vous pouvez également transmettre des classes d'autres types Java.time. Et récupérez le type correspondant. Par exemple:

    OffsetDateTime dateTimeFromDatabase
            = yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);

Les types Java.time à utiliser sont:

SQL datatype            | Java.time type
------------------------+-----------------------------------------------------------
date                    | LocalDate
time                    | LocalTime
timestamp               | LocalDateTime
timestamp with timezone | Officially OffsetDateTime; many drivers accept Instant too
time with timezone      | OffsetTime

Pour passer dans l'autre sens, de Java à votre base de données (à utiliser comme paramètres de requête ou pour le stockage) PreparedStatement.setObject accepte désormais également les objets des types Java.time ci-dessus. Puisque vous passez un objet d'un type, il n'est pas nécessaire d'avoir un paramètre de type distinct lorsque vous procédez de cette façon.

4
Ole V.V.