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

Diferença entre datas no JAVA

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

Bom galera, estava a um longo período de tempo sem postar aqui no blog, e pra falar a verdade desde que postei a última vez aqui muita coisa em minha vida mudou. Mudei de emprego, estou quase me formando, e hoje em dia deixei de trabalhar com ASP e PHP, e estou trabalhando com JAVA. Agora vamos ao que interessa, o tema do post…
Há algum tempo atrás tive que fazer um método para calcular a diferença de dias entre duas datas no JAVA, caçei no google alguns tutorias, e o que mais me agradou e me pareceu mais coerente, peguei fiz alguns ajustes e coloquei pra funcionar. Estranho, pois esse tipo de coisa é algo muito útil mas você só se dá conta disso quando precisa utilizar, e percebe que na web fica difícil achar algo semelhante, por isso resolvi postar aqui no blog minha solução.
Na verdade, o grande motivo pra mim estar aqui postando, é que um amigo aqui do trabalho outro dia precisou da mesma coisa, e fez uma solução genial pra resolver isso. A baixo colocarei minha versão do código, e a versão desse amigo, que com apenas 3 linhas de código (ele levou a sério o conceito do “KISS”), conseguiu fazer de meu código bricadeirinha, portanto, o crédito é todo seu paulista.

Minha versão:

public String calculaDiferencaDias(String data, String codProduto) {

DateFormat df = null;
Date d1 = null;
Date today = null;
long diff = 0;
String numDias = “”;
String retorno = “”;

try {
df = new SimpleDateFormat(”dd/MM/yyyy”);
d1 = (Date) df.parse(data);
} catch (ParseException ex) {
Logger.getLogger(ImportacaoComposicao.class.getName()).log(Level.SEVERE, null, ex);
}

today = new Date();
diff = d1.getTime() - today.getTime();
diff = diff / (1000 * 60 * 60 * 24);
numDias = String.valueOf(diff);
retorno = this.CarregarDados(numDias, codProduto);

return retorno;
}

A versão do meu amigo(Paulista):

public static int diferencaEmDias(Calendar data1, Calendar data2) {
long m1 = data1.getTimeInMillis();
long m2 = data2.getTimeInMillis();
return (int) ((m1 - m2) / (24*60*60*1000));
}