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.

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...