Olá Pessoal, tudo bom?
O artigo de hoje é a criação de um exemplo que utiliza a classe NamedParameterStatement criada em uma série de artigos a partir de uma adaptação do artigo de Adam Crume criado em 03 de abril de 2007 para o site Java World (link).
Os links para os artigos dessa classe estão abaixo:
- Parte 1 – http://mauda.com.br/?p=776
- Parte 2 – http://mauda.com.br/?p=780
- Parte 3 – http://mauda.com.br/?p=799
- Parte 4 – http://mauda.com.br/?p=822
- Parte 5 – http://mauda.com.br/?p=827
Assim nós criaremos um método que utiliza a classe NamedParametersStatement criada nos artigos. Esse método é baseado no artigo sobre filtros para métodos de busca, confira no artigo abaixo.
Exemplo do Método de Busca com Filtro
Vamos relembrar como era o método de busca com o filtro. Repare que o método recebe uma classe EnderecoDTO e possui todo o sql para realizar a execução da busca.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
public List<Endereco> findAll(EnderecoDTO endereco){ //definicao do SQL inicial StringBuffer sb = new StringBuffer(“SELECT * FROM TB_ENDERECO as end WHERE “); if(endereco.getRua() == null && endereco.getNumero() == null && endereco.getComplemento() == null && endereco.getBairro() == null && endereco.getCidade() == null && endereco.getEstado() == null && endereco.getPais() == null){ throw new Exception("Favor preencher ao menos um campo do filtro de pesquisa!"); } Connection c = null; PreparedStatement ps = null; ResultSet rs = null; try { Map<Integer, Object> parameters = new HashMap<Integer, Object>(); Integer pos = 0; //Campo rua if(endereco.getRua() != null){ sb.append(" end.rua like ? AND "); parameters.put(pos++, "%" + endereco.getRua() + "%"); }//fim do campo rua //Campo numero if(endereco.getNumero() != null){ sb.append(" end.numero = ? AND "); parameters.put(pos++, endereco.getNumero()); }//fim do campo numero //Campo complemento if(endereco.getComplemento() != null){ sb.append(" end.complemento like ? AND "); parameters.put(pos++, "%" + endereco.getComplemento() + "%"); }//fim do campo complemento //Campo bairro if(endereco.getBairro() != null){ sb.append(" end.bairro like ? AND "); parameters.put(pos++, "%" + endereco.getBairro() + "%"); }//fim do campo bairro //Campo cidade if(endereco.getCidade() != null){ sb.append(" end.cidade like ? AND "); parameters.put(pos++, "%" + endereco.getCidade() + "%"); }//fim do campo cidade //Campo estado if(endereco.getEstado() != null){ sb.append(" end.estado like ? AND "); parameters.put(pos++, "%" + endereco.getEstado() + "%"); }//fim do campo estado //Campo pais if(endereco.getPais() != null){ sb.append(" end.pais like ? AND "); parameters.put(pos++, "%" + endereco.getPais() + "%"); }//fim do campo pais //obtem a instancia da classe Connection c = Conexao.getConnection(); String sql = sb.toString(); ps = c.prepareStatement(sql.substring(0, sql.size() - 5)); for(Entry<String, Object> entry : parameters.entrySet()){ ps.setObject(entry.getKey(), entry.getValue()); } rs = ps.executeQuery(); List<Endereco> enderecos = new ArrayList<Endereco>(); while(rs.next()){ Endereco e = new Endereco(); e.setBairro(rs.getString("BAIRRO")); e.setCidade(rs.getString("CIDADE")); e.setComplemento(rs.getString("COMPLEMENTO")); e.setEstado(rs.getString("ESTADO")); e.setId(rs.getLong("ID")); e.setNumero(rs.getInt("NUMERO")); e.setPais(rs.getString("PAIS")); e.setRua(rs.getString("RUA")); enderecos.add(e); } return enderecos; } catch (SQLException e) { e.printStackTrace(); throw new Exception("Problemas no sistema, por favor tente mais tarde"); } finally { //Fecha a conexao de todos os recursos do JDBC Conexao.close(rs, ps, c); } } |
Agora nós iremos substituir todos os pontos pela chamada aos métodos da nova classe NamedStatementParameter.
Substituindo todos os ? por labels
O primeiro trabalho a ser feito é realizar a substituição de todos os ? da query sql por labels com dois pontos. Iremos adotar os nomes do campos utilizando camelCase, ok? Confira nas linhas destacadas abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
public List<Endereco> findAll(EnderecoDTO endereco){ //definicao do SQL inicial StringBuffer sb = new StringBuffer(“SELECT * FROM TB_ENDERECO as end WHERE“); if( endereco.getRua() == null && endereco.getNumero() == null && endereco.getComplemento() == null && endereco.getBairro() == null && endereco.getCidade() == null && endereco.getEstado() == null && endereco.getPais() == null){ throw new Exception("Favor preencher ao menos um campo do filtro de pesquisa!"); } try { Map<Integer, Object> parameters = new HashMap<Integer, Object>(); Integer pos = 0; //Campo rua if(endereco.getRua() != null){ sb.append(" end.rua like :rua AND "); parameters.put(pos++, "%" + endereco.getRua() + "%"); }//fim do campo rua //Campo numero if(endereco.getNumero() != null){ sb.append(" end.numero = :numero AND "); parameters.put(pos++, endereco.getNumero()); }//fim do campo numero //Campo complemento if(endereco.getComplemento() != null){ sb.append(" end.complemento like :complemento AND "); parameters.put(pos++, "%" + endereco.getComplemento() + "%"); }//fim do campo complemento //Campo bairro if(endereco.getBairro() != null){ sb.append(" end.bairro like :bairro AND "); parameters.put(pos++, "%" + endereco.getBairro() + "%"); }//fim do campo bairro //Campo cidade if(endereco.getCidade() != null){ sb.append(" end.cidade like :cidade AND "); parameters.put(pos++, "%" + endereco.getCidade() + "%"); }//fim do campo cidade //Campo estado if(endereco.getEstado() != null){ sb.append(" end.estado like :estado AND "); parameters.put(pos++, "%" + endereco.getEstado() + "%"); }//fim do campo estado //Campo pais if(endereco.getPais() != null){ sb.append(" end.pais like :pais AND "); parameters.put(pos++, "%" + endereco.getPais() + "%"); }//fim do campo pais //obtem a instancia da classe Connection Connection c = Conexao.getConnection(); String sql = sb.toString(); PreparedStatement ps = c.prepareStatement(sql.substring(0, sql.size() - 5)); for(Entry<String, Object> entry : parameters.entrySet()){ ps.setObject(entry.getKey(), entry.getValue()); } ResultSet rs = ps.executeQuery(); List<Endereco> enderecos = new ArrayList<Endereco>(); while(rs.next()){ Endereco e = new Endereco(); e.setBairro(rs.getString("BAIRRO")); e.setCidade(rs.getString("CIDADE")); e.setComplemento(rs.getString("COMPLEMENTO")); e.setEstado(rs.getString("ESTADO")); e.setId(rs.getLong("ID")); e.setNumero(rs.getInt("NUMERO")); e.setPais(rs.getString("PAIS")); e.setRua(rs.getString("RUA")); enderecos.add(e); } return enderecos; } catch (SQLException e) { e.printStackTrace(); throw new Exception("Problemas no sistema, por favor tente mais tarde"); } finally { //Fecha a conexao de todos os recursos do JDBC Conexao.close(rs, ps, connection); } } |
Mudando o Nome dos Parametros
Agora é necessário mudar o pos++ dos parametros pelos nomes dos labels informados, sem os dois pontos, além de remover a variável inteira pos. Confira abaixo nas linhas destacadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
public List<Endereco> findAll(EnderecoDTO endereco){ //definicao do SQL inicial StringBuffer sb = new StringBuffer(“SELECT * FROM TB_ENDERECO as end “); if( endereco.getRua() == null && endereco.getNumero() == null && endereco.getComplemento() == null && endereco.getBairro() == null && endereco.getCidade() == null && endereco.getEstado() == null && endereco.getPais() == null){ throw new Exception("Favor preencher ao menos um campo do filtro de pesquisa!"); } Connection c = null; PreparedStatement ps = null; ResultSet rs = null; try { Map<Integer, Object> parameters = new HashMap<Integer, Object>(); //Campo rua if(endereco.getRua() != null){ sb.append(" end.rua like :rua AND "); parameters.put("rua", "%" + endereco.getRua() + "%"); }//fim do campo rua //Campo numero if(endereco.getNumero() != null){ sb.append(" end.numero = :numero AND "); parameters.put("numero", endereco.getNumero()); }//fim do campo numero //Campo complemento if(endereco.getComplemento() != null){ sb.append(" end.complemento like :complemento AND "); parameters.put("complemento", "%" + endereco.getComplemento() + "%"); }//fim do campo complemento //Campo bairro if(endereco.getBairro() != null){ sb.append(" end.bairro like :bairro AND "); parameters.put("bairro", "%" + endereco.getBairro() + "%"); }//fim do campo bairro //Campo cidade if(endereco.getCidade() != null){ sb.append(" end.cidade like :cidade AND "); parameters.put("cidade", "%" + endereco.getCidade() + "%"); }//fim do campo cidade //Campo estado if(endereco.getEstado() != null){ sb.append(" end.estado like :estado AND "); parameters.put("estado", "%" + endereco.getEstado() + "%"); }//fim do campo estado //Campo pais if(endereco.getPais() != null){ sb.append(" end.pais like :pais AND "); parameters.put("pais", "%" + endereco.getPais() + "%"); }//fim do campo pais //obtem a instancia da classe Connection c = Conexao.getConnection(); String sql = sb.toString(); ps = c.prepareStatement(sql.substring(0, sql.size() - 5)); for(Entry<String, Object> entry : parameters.entrySet()){ ps.setObject(entry.getKey(), entry.getValue()); } rs = ps.executeQuery(); List<Endereco> enderecos = new ArrayList<Endereco>(); while(rs.next()){ Endereco e = new Endereco(); e.setBairro(rs.getString("BAIRRO")); e.setCidade(rs.getString("CIDADE")); e.setComplemento(rs.getString("COMPLEMENTO")); e.setEstado(rs.getString("ESTADO")); e.setId(rs.getLong("ID")); e.setNumero(rs.getInt("NUMERO")); e.setPais(rs.getString("PAIS")); e.setRua(rs.getString("RUA")); enderecos.add(e); } return enderecos; } catch (SQLException e) { e.printStackTrace(); throw new Exception("Problemas no sistema, por favor tente mais tarde"); } finally { //Fecha a conexao de todos os recursos do JDBC Conexao.close(rs, ps, connection); } } |
Mudando de PreparedStatement para NamedParameterStatement
Agora vamos mudar o código para usar a classe NamedParameterStatement ao invés da classe PreparedStatement, mudando assim o nome da variável de ps para nps.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
public List<Endereco> findAll(EnderecoDTO endereco){ //definicao do SQL inicial StringBuffer sb = new StringBuffer(“SELECT * FROM TB_ENDERECO as end WHERE“); if( endereco.getRua() == null && endereco.getNumero() == null && endereco.getComplemento() == null && endereco.getBairro() == null && endereco.getCidade() == null && endereco.getEstado() == null && endereco.getPais() == null){ throw new Exception("Favor preencher ao menos um campo do filtro de pesquisa!"); } Connection c = null; NamedParameterStatement nps = null; ResultSet rs = null; try { Map<Integer, Object> parameters = new HashMap<Integer, Object>(); //Campo rua if(endereco.getRua() != null){ sb.append(" end.rua like :rua AND "); parameters.put("rua", "%" + endereco.getRua() + "%"); }//fim do campo rua //Campo numero if(endereco.getNumero() != null){ sb.append(" end.numero = :numero AND "); parameters.put("numero", endereco.getNumero()); }//fim do campo numero //Campo complemento if(endereco.getComplemento() != null){ sb.append(" end.complemento like :complemento AND "); parameters.put("complemento", "%" + endereco.getComplemento() + "%"); }//fim do campo complemento //Campo bairro if(endereco.getBairro() != null){ sb.append(" end.bairro like :bairro AND "); parameters.put("bairro", "%" + endereco.getBairro() + "%"); }//fim do campo bairro //Campo cidade if(endereco.getCidade() != null){ sb.append(" end.cidade like :cidade AND "); parameters.put("cidade", "%" + endereco.getCidade() + "%"); }//fim do campo cidade //Campo estado if(endereco.getEstado() != null){ sb.append(" end.estado like :estado AND "); parameters.put("estado", "%" + endereco.getEstado() + "%"); }//fim do campo estado //Campo pais if(endereco.getPais() != null){ sb.append(" end.pais like :pais AND "); parameters.put("pais", "%" + endereco.getPais() + "%"); }//fim do campo pais //obtem a instancia da classe Connection c = Conexao.getConnection(); String sql = sb.toString(); nps = new NamedParameterStatement(c, sql.substring(0, sql.size() - 5)); for(Entry<String, Object> entry : parameters.entrySet()){ nps.setObject(entry.getKey(), entry.getValue()); } rs = nps.executeQuery(); List<Endereco> enderecos = new ArrayList<Endereco>(); while(rs.next()){ Endereco e = new Endereco(); e.setBairro(rs.getString("BAIRRO")); e.setCidade(rs.getString("CIDADE")); e.setComplemento(rs.getString("COMPLEMENTO")); e.setEstado(rs.getString("ESTADO")); e.setId(rs.getLong("ID")); e.setNumero(rs.getInt("NUMERO")); e.setPais(rs.getString("PAIS")); e.setRua(rs.getString("RUA")); enderecos.add(e); } return enderecos; } catch (SQLException e) { e.printStackTrace(); throw new Exception("Problemas no sistema, por favor tente mais tarde"); } finally { //Fecha a conexao de todos os recursos do JDBC Conexao.close(rs, nps, connection); } } |
Dessa forma nós realizamos a transformação de um método que utilizava PreparedStatement para um método que agora utiliza a NamedParameterStatement. Muito mais claro na hora de entender quais parâmetros são informados para o SQL.
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply