Saltar al contenido

Obtener la fecha de un ResultSet para usar con clases java.time

Entiende el código de forma correcta previamente a aplicarlo a tu trabajo si tquieres aportar algo puedes decirlo en los comentarios.

Solución:

La mayoría de los proveedores de bases de datos aún no admiten JDBC 4.2. Esta especificación dice que el nuevo java.time-tipos como LocalDate será/debería ser apoyado utilizando los métodos existentes setObject(...) y getObject(). No se requiere ni se ofrece ninguna conversión explícita (sin cambio de API).

Una solución para el soporte que falta puede ser la conversión manual como se describe en la lista de correo de Derby.

Algo como:

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

Como puede ver, estas conversiones utilizan los tipos no obsoletos java.sql.Date etc., véase también el javadoc.

Nuevos métodos activados Timestamp

Java 8 incluye nuevos métodos en el java.sql.Timestamp clase para convertir hacia y desde objetos java.time. Estos métodos de conveniencia son una medida provisional hasta que los controladores JDBC puedan actualizarse para los nuevos tipos de datos.

  • toInstant
  • toLocalDateTime
  • valueOf
  • from

ídem para Date & Time

El java.sql.Date y java.sql.Time Las clases también tienen métodos de conversión java.time similares agregados en Java 8.

Hoy en día, la mayoría de nosotros usamos controladores compatibles con JDBC 4.2, lo que mejora bastante la situación en comparación con las respuestas de 2015.

Conseguir un LocalDate de su conjunto de resultados:

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

o

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

No se ha añadido ningún método nuevo a ResultSet para que esto funcione. El getObject El método estuvo ahí todo el tiempo. Lo nuevo es que desde JDBC 4.2 acepta LocalDate.class como segundo argumento y devuelve un LocalDate. Lo anterior funciona cuando la consulta devuelve una columna con tipo de datos SQL date (realmente el tipo JDBC cuenta, pero tienden a estar de acuerdo).

También puede pasar clases de otros tipos de java.time. Y recuperar el tipo correspondiente. Por ejemplo:

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

Los tipos de java.time a utilizar son:

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

Para pasar al revés, de Java a su base de datos (para usar como parámetros de consulta o para almacenar) PreparedStatement.setObject ahora también acepta objetos de los tipos java.time anteriores. Dado que está pasando un objeto de un tipo, no hay necesidad de un parámetro de tipo separado cuando se va de esta manera.

Reseñas y puntuaciones

Si conservas algún reparo o forma de refinar nuestro escrito puedes dejar un paráfrasis y con gusto lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *