Dica de java.sql.PreparedStatement

Quando temos uma instrução SQL muito grande, cheia de parâmetros para configurar,  apesar da classe do java (java.sql.PreparedStatement) ajudar bastante, é muito chato ficar identificando que tipo de parâmetro vai em cada campo e a posição numérica do mesmo. Exemplo abaixo:

...
 pst.setBigDecimal(7, d.getPercindex());
 pst.setBigDecimal(8, d.getOuttax());
 pst.setString(9, d.getIndexador());
...

setBigDecimal … setString …. setInt … setDate …

Para facilitar ainda mais a vida eu fiz essa classe, que se chama PreparedStatementHelper que apenas possui um método set, deixando a critério do tipo de parâmetro que está sendo passado para o mesmo para definir qual método do original PreparedStatement que vai ser usado. Além do que ela possui um contador interno que exime da necessidade de ter que ficar numerando os parâmetros.

package dao.staff;

import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import dao.DAOFactory;
import dao.access.AccessDAOFactory;
import dao.staff.ConnectionPool;
import dao.staff.Scoping;
public class PreparedStatementHelper {
 private int counter = 0;
 private PreparedStatement pst;

 public PreparedStatementHelper(PreparedStatement pst){
 this.pst = pst;
 }

 public void resetCounter(){
 this.counter = 0;
 }
 public int getCounter(){
 return this.counter;
 }

 public void set(Object val) throws SQLException{
 if (val.getClass().getSimpleName().equals("String")){
 pst.setString(++this.counter, (String)val);
 return;
 }

 if (val.getClass().getSimpleName().equals("Integer")){
 pst.setInt(++this.counter, (Integer) val);
 return;
 }

 if (val.getClass().getSimpleName().equals("BigDecimal")){
 pst.setBigDecimal(++this.counter, (BigDecimal)val);
 return;
 }

 if (val.getClass().getSimpleName().equals("Double")){
 pst.setDouble(++this.counter, (Double)val);
 return;
 }

 if (val.getClass().getSimpleName().equals("Long")){
 pst.setDouble(++this.counter, (Long)val);
 return;
 }

 if (val.getClass().getName().equals("java.sql.Date")){
 pst.setDate(++this.counter, (java.sql.Date)val);
 return;
 }

 throw new SQLException("Não sei o tipo de valor " + val.getClass().getSimpleName());
 }

}

Como resultado do uso desse helper, o código ficará assim:

String sql ="insert into imovel_type(logradouro, numero, complemento, cidade, estado, cep, nomecomercial, " +
 "percpart, valorcontabil, justificativa, valoravaliacao, dtavaliacao, tpavaliador, cnpjcpfavaliador, aluguelcontratado, " +
 "aluguelatrasado, opcaorecompra, tipoimovel, questjur, motivoqestjur, tipouso, matricula, cnpjemp, " +
 "Fundo_typeKey19, Carteira_typeKey19 "+
 "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

 PreparedStatement pst = fact.getConnection().prepareStatement(sql);

 PreparedStatementHelper p = new PreparedStatementHelper(pst);
 p.set("pedro");
 p.set(111.46);
 p.set(111);
 p.set(23L);
...
Esta entrada foi publicada em Java com as etiquetas , , , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s