Olá senhores,
estou fazendo os exercícios da apostila fj21 da caelum. Só que dessa vez resolvi implentar todos os códigos com o bd Oracle no lugar no MySQL. para variar um pouquinho.
Lembrando que os exercícios de teste de conexão e inserção de dados no Oracle, estão funcionando.
Mas para recuperar os dados tenho erro quando tento recuperar campos Date e convertê-los em Calendar. Com instruções sql recupero todos os outros campos.
Com o MySQL todos os códigos funcionam, então não sei o q fazer.
a estrutura da tabela no mysql e no oracle é:
create table contatos (
id number NOT NULL,
nome VARCHAR(20),
email VARCHAR(20),
endereco VARCHAR(20),
dataNascimento DATE,
primary key (id)
);
e tenho o seguinte método:
public List<Contato> getLista() {
try {
List<Contato> contatos = new ArrayList<Contato>();
PreparedStatement stmt = this.conn.prepareStatement("select * from contatos");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
// criando o objeto Contato
Contato contato = new Contato();
contato.setId(rs.getLong("id"));
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setEndereco(rs.getString("endereco"));
// montando a data através do Calendar
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate("dataNascimento"));
contato.setDataNascimento(data);
// adicionando o objeto à lista
contatos.add(contato);
}
rs.close();
stmt.close();
return contatos;
} catch (SQLException e) {
throw new DAOException(e);
}
}
Aqui eu tenh o erro:
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate(“dataNascimento”));
contato.setDataNascimento(data);
buscar como string foi só a forma que eu achei mais fácil, pois, inclusive usando date eu transformava em string.
hoje eu uso string tanto para buscar quanto para adicionar, porem no meu banco esta classificado como date.
(em termos de processo da na mesma string e date na requisição)
Não sei se está tão ultrapassado, pois é as apostilas da caelum sempre são bem atualizadas.
Mas de qualquer forma eu agradeço.
Só não entendi porque no MySQL funciona e no Oracle não.
Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Time.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getTime(CharCommonAccessor.java:435)
at oracle.jdbc.driver.OracleResultSetImpl.getTime(OracleResultSetImpl.java:772)
at oracle.jdbc.driver.OracleResultSet.getTime(OracleResultSet.java:1649)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:58)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)
sempre tenho esse erro
Calendar data = Calendar.getInstance();
String get = rs.getString(“dataNascimento”);
long date = Date.parse(get);
data.setTimeInMillis(date);
contato.setDataNascimento(data);
Minha gambiarra convertendo pra String primeiro ficou assim, mas não acho que isso seja uma boa prática. por favor, façam algo mais resumido.
primeiro gostaria de dizer que a classe calendar ainda pode ser usada, eu só me confundi com uma outra antiga, segunda coisa é que essa é a forma mais “eficaz” que eu conheço e terceiro, você pode usar a classe date do próprio jdbc para não fazer essa transição toda.
Não posso mecher nos atributos(mudar de Calendar para Date), tem que ficar Calendar mesmo, porque podera comprometer outros exercícios. Como ficaria usando a propria classe date? Não entendi.
é a classe do objeto retornado por: rs.getDate(“dataNascimento”), mas como disse, você teria que mudar o projeto. E talvez esse deva ser o erro, o método rs.getDate() do mysql deve retornar calendar enquanto o Oracle retorna um Date!
Não é não.
quando executo getDate(“dataNascimento”) sem atribuir a variavel alguma ou usar no Calendar.setTime, o erro ocorre. só funciona o método getString. Aí converto para date e depois seto no Calendar. Ou seja tenho que converter pra String primeiro, porque getDate da erro.
No mySQL eu uso o getDate e depois Calendar data … data.setTime(o resultado de getDate. Ele devolve Date mesmo.
Independente de qual SGBD você está usando, o que vai contar é como a API do JDBC foi implementada pelo driver especificado para a conexão.
Assim sendo, você vai, para campos do tipo DATE, usar o método getDate da interface ResultSet. Este método devolve um objeto de java.sql.Date.
Esta classe estende a classe java.util.Date, logo, ela herda todos os métodos públicos desta classe, incluindo, o método getTime(), que devolve um long representando a data especificada.
Uma dessas opções pode resolver.
Porém, seria mais indicado tentar usar as novas opções oferecidas pela API de datas do java, nas versões 8 e superiores.
Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getDate(CharCommonAccessor.java:410)
at oracle.jdbc.driver.OracleResultSetImpl.getDate(OracleResultSetImpl.java:743)
at oracle.jdbc.driver.OracleResultSet.getDate(OracleResultSet.java:1637)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:62)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)
Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getDate(CharCommonAccessor.java:410)
at oracle.jdbc.driver.OracleResultSetImpl.getDate(OracleResultSetImpl.java:743)
at oracle.jdbc.driver.OracleResultSet.getDate(OracleResultSet.java:1637)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:62)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)
mesmo erro.
já tinha tentato isso, por enquanto só convertendo pra String:
Calendar data = Calendar.getInstance();
String get = rs.getString("dataNascimento");
long date = Date.parse(get);
data.setTimeInMillis(date);
contato.setDataNascimento(data);
Estou muito animado com a comunidade, me sinto em casa agora. Obrigado por ajudarem!