JDBC com Java Date and Time
A partir do lançamento do Java 8, passamos a ter o pacote java.time
com classes voltas para a manipulação de datas. Entre estas classes temos a LocalDate
, para manipular um objeto apenas contendo data; e a LocalDateTime
, para manipular objetos que contem data e hora. Assim, tempos atrás resolvi adicionar atributos do tipo LocalDate
em uma aplicação que estava trabalhando. Esta aplicação tinha acesso JDBC com um banco dados, sem o uso de JPA ou qualquer framework ORM.
Deparei-me então, com as operações de inserção e consultas na aplicação Java. No banco de dados o campo DATE
era utilizado para armazenar datas. E um campo TIMESTAMP
para armazenar data e hora. No Java eu procurei como converter os tipos, já que a API JDBC, trabalha com a classe java.sql.Date
e java.sql.Timestamp
para a inserção de dados no tipo data ou data hora.
As classes LocalDate
e LocalDateTime
não possuem nenhum método para esta conversão, assim, resolvi procurar por isso na própria API JDBC, a qual já disponibiliza tal recurso, conforme vou demonstrar na Listagem 1 o processo necessário para um método de insert.
Listagem 1. Inserindo valores
LocalDate data = LocalDate.now();
LocalDateTime dataHora = LocalDateTime.now();
...
try {
pstm = conn.prepareStatement(sql);
pstm.setDate(1, Date.valueOf( c.getData() ));
pstm.setTimestamp(2, Timestamp.valueOf( c.getDataHora() ));
...
}
...
Na Listagem 1, temos duas variáveis que são: data
do tipo LocalDate
e dataHora
do tipo LocalDateTime
. Suponha que no banco de dados, os tipos são, respectivamente, um DATE
e um TIMESTAMP
. Os métodos setDate()
e setTimestamp()
da interface java.sql.PreparedStatement
esperam por valores do tipo java.sql.Date
e java.sql.Timestamp
, respectivamente. O método now()
, usado em LocalDate
e LocalDateTime
, recupera a data/hora do sistema operacional.
Então a classe java.sql.Date
fornece o método estático valueOf()
que converte um java.time.LocalDate
em um java.sql.Date
. Um método de mesmo nome existe na classe java.sql.Timestamp
, o qual vai converter um java.time.LocalDateTime
em um java.sql.Timestamp
.
Por fim, imagine que em um método de consulta, você deseja recuperar os valores do banco de dados e converte-los em objetos Java do tipo LocalDate
e LocalDateTime
, conforme Listagem 2.
Listagem 2. Recuperando valores
LocalDate data;
LocalDateTime dataHora;
...
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
data = rs.getDate("data").toLocalDate();
dataHora = rs.getTimestamp("data_hora").toLocalDateTime();
}
...
Quando realizamos uma consulta ao banco de dados, a interface ResultSet
possui métodos do tipo get()
para que possamos adicionar o nome da coluna que queremos recuperar o valor. Entre estes métodos, temos o getDate()
que retorna um objeto java.sql.Date
e o getTimestamp()
que retorna um objeto java.sql.Timestamp
. As classes Date
e Timestamp
, do pacote java.sql
, possuem respectivamente os métodos toLocalDate()
e toLocalDateTime()
para converter os objetos Date
em um LocalDate
e Timestamp
em um LocalDateTime
.
Assim, podemos facilmente converter os valores devolvidos pelo ResultSet
em tipos LocalDate
ou LocalDateTime
.