CodeGym/Cursos Java/All lectures for PT purposes/Trabalhando com PreparedStatement

Trabalhando com PreparedStatement

Disponível

Tipos de declarações

Já vimos a interface Statement mais simples . E embora seja bastante adequado para o trabalho, não é tão adequado para consultas complexas. Em algumas fontes, é expressa a opinião de que não é necessário usar o Statement - interfaces mais complexas e funcionalmente ricas são adequadas.

  • Declaração preparada
  • CallableStatement

Uma questão bastante razoável surge - por que essas interfaces são necessárias? Vamos descobrir.

Primeiro, veremos a interface PreparedStatement e outros recursos do JDBC. Voltaremos para a interface CallableStatement posteriormente - seu uso, em primeiro lugar, não é tão comum e, em segundo lugar, depois de tudo considerado sobre ela, a conversa já pode ser bastante curta.

Além disso, PreparedStatement é uma grande ajuda da abordagem popular para hacking de banco de dados chamada SQL Injection.

Mas mais sobre isso um pouco mais tarde.

Declaração preparada

Se você tentar traduzir o nome PreparedStatement , poderá obter algo como “instrução preparada”. A palavra mais importante aqui é “preparado”. O que é "preparação"?

Antes de considerarmos essa questão, proponho ver um ponto bastante importante do ponto de vista da conveniência, que ocorre com muita frequência. Então, em alguma aplicação, precisamos inserir dados de contato na tabela CONTACT. Para fazer isso, precisamos preparar uma consulta como esta:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

À primeira vista, parece que nem tudo é tão difícil e assustador. Precisamos escrever um código que colete a string de que precisamos dos parâmetros: nome, sobrenome, endereço e número de telefone. Você só precisa lembrar que todos os dados de string devem estar entre aspas simples.

Se fizermos isso em uma função separada, obteremos algo assim:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Passamos o nome, sobrenome, número de telefone e endereço para a função de parâmetro no formulário e, a partir deles, compomos uma string de consulta SQL. As citações estragam um pouco a imagem, mas até agora não são assustadoras.

Ok, e os números? Eles não precisam estar entre aspas. Obviamente, em um caso você precisa de citações, no outro não. A situação está ficando mais complicada.

Agora vamos adicionar mais um problema - e se houver uma citação comum (e nem mesmo uma) dentro da string? Você deve primeiro procurar essas citações e processá-las. Mdaaa. De alguma forma, começamos a nos sentir desconfortáveis.

Se adicionarmos agora o processamento de datas, a tarefa se tornará completamente enfadonha - você terá que fazer uma grande quantidade de trabalho. As datas geralmente são desagradáveis ​​- diferentes servidores SQL aceitam formatos diferentes para datas.

Então, o que vemos? Se precisarmos usar parâmetros dentro da consulta, construir a consulta manualmente se torna muito desagradável. E não apenas desagradável - eu diria até chato. Há um grande número de casos a considerar, e este é um trabalho terrivelmente chato. Basicamente, é para esses casos que a interface PreparedStatement foi proposta .

Essa solicitação permite que você faça duas coisas:

  • Prepare um pedido com antecedência indicando os locais onde os parâmetros serão substituídos
  • Definir parâmetros de um determinado tipo e, em seguida, executar uma consulta com os parâmetros já definidos

Exemplo de Declaração Preparada

A estrutura de PreparedStatement para nossa opção de configuração de parâmetros ficará assim:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Como você pode ver, tudo é bastante simples.

Em primeiro lugar, ao escrever uma consulta SQL, os locais onde os parâmetros precisarão ser substituídos são escritos com pontos de interrogação - “?”.

Em segundo lugar, a solicitação é criada chamando con.prepareStatement() .

Em terceiro lugar, a configuração dos parâmetros passa pela indicação do número e valor. Observe que o número de parâmetros começa em 1, não em 0, como estamos acostumados ao trabalhar com arrays e coleções.

A interface PreparedStatement contém métodos para definir strings — setString() , para definir números — setInt() , setLong() , setDouble() , para definir datas — setDate() . E tipos mais complexos - isso pode ser visto na documentação.

Quarto, a chamada para stmt.executeUpdate() já foi executada sem especificar a string de consulta.

Eu recomendo fortemente fazer amizade com o PreparedStatement - esta é uma ferramenta muito eficaz.

Comentários
  • Populares
  • Novas
  • Antigas
Você precisa acessar para deixar um comentário
Esta página ainda não tem nenhum comentário