Setando data no PreparedStatement
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. ![]()

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.
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.
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.