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 ResultSet
getDate
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.
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 .
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.
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.
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.