logoLog da Selva


Setando data no PreparedStatement

Escrito em Java por Rodrigo Fournier em 26 de Agosto de 2008

Mais um post sobre Java, esse também sobre datas, e mais uma vez sobre algo que me gerou dúvida, que procurei na web e que não vi nada que me agradasse, ou servisse exatamente para o que eu queria, por isso quando acontece esse tipo de coisa, acho que é válido postar dicas aqui pois pode vir a ser dúvida de outras pessoas também. O projeto que estou escalado, está pra ir pro ar em pouco tempo, e a galera aqui deixou sobre minha tutela substituir algumas partes essências do projeto que estavam usando o objeto Statement para fazer Inserts, Uploads e Delets, pelo PreparedStatement, aliás me pediram isso com certa urgência. Por que da urgência? O PreparedStatement previne a famosa injeção de SQL, um mal que pode causar diversos problemas para o sistema, não entrarei em detalhes, coisa que o Statement não faz. Feito isso, um problema surgiu. A galera aqui desenvolveu um método para tratar datas diretamente para o Oracle usando o comando to_date. o que facilita muito em alguns casos, mas esse método gera uma string, e como pro PreparedStatement basta você colocar um interrogação(?) no lugar que você quer que entre o comando a ser passado para a query, e depois informar o tipo para ele que ele se encarrega do resto, quando era usado o setString para o retorno do método usado, ele colocava tudo entre aspas simples, mais ou menos assim ‘to_date(’26/08/08′, ‘dd/mm/yyyy’)', isso gerava um erro na hora de executar esse sql, foi ai que fiquei sem saber o que fazer. Depois de muito pesquisar e de consultar alguns amigos do trampo, conseguimos chegar a um denominador comum. Setamos direto no PreparedStatement o tipo data (SetDate), e usamoso new Date passando para este método a data em TimeInMillis. Complicou?? Mostrarei o código.

pstmt.setDate(posicao, new Date(data.getTimeInMillis()));

Esse código passa para o banco a data com o formato correto, e Graças a Deus resolveu meu problema. :)

3 Respostas para 'Setando data no PreparedStatement'

Saiba sobre novos comentários pelo RSS ou faça um TrackBack para 'Setando data no PreparedStatement'.

  1. Vinicius disse,

    em 06 de Outubro de 2008 às 10:00 pm

    Na correria dosprojetos aqui da empresa eu costumo passar uma string formatada usando um SimpleDateFormat, e dessa maneira o código fica muito menos propenso a erros (pois eu tenho que guardar uma constante com o pattern de data usado no banco). Ah, e o PreparedStatement NÃO previne SQL injection.

  2. Vinicius disse,

    em 06 de Outubro de 2008 às 10:21 pm

    Desculpe, na pressa formulei mal a minha frase.
    “Na correria dos projetos aqui na empresa, eu costumo passar uma string formatada usando um SimpleDateFormat, mas esse método é muito mais propenso a erros, pois tenho que armazenar uma constante com a formatação da data usada no banco (vários).” Com seu método eu resolvi o dilema de colocar GregorianCalendar, java.util.Date ou java.sql.Date no meus beans e ainda por cima não preciso mudar o pattern de data a cada vez que eu troco de banco. Parabéns pela solução! E continuando, o PreparedStatement NÃO previne SQL Injection.

  3. Rodrigo Fournier disse,

    em 06 de Outubro de 2008 às 11:09 pm

    Fico feliz em saber que ajudei, e pretendo sempre postar algumas coisas que me pareçam úteis e que eu conseguir solução, e que acima de tudo sejam difíceis encontrar na net. E sobre o SQL Injection, eu realmente não sabia que não havia prevenção utilizando o PreparedStatment, pois na minha empresa têm-se usado este recurso crendo nisso.

Deixe uma Resposta