• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

SQL – Named Parameters for PreparedStatement – Exemplo de Utilização

September 19, 2016 by Mauda Leave a Comment

Conteúdo do Post:
  1. Exemplo do Método de Busca com Filtro
  2. Substituindo todos os ? por labels
  3. Mudando o Nome dos Parametros
  4. Mudando de PreparedStatement para NamedParameterStatement
  5. finnaly{

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.

Java
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:

Java
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:

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

Java
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!

Filed Under: Java, JDBC Tagged With: Java, JDBC, PreparedStatement, SQL

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in