• Nenhum resultado encontrado

Inserindo registros

No documento Desenvolvimento Web com JSF2 e JPA2 (páginas 38-44)

Estabelecida a conexão com o banco de dados, já podemos executar comandos. Como primeiro exemplo, iremos inserir registros em uma tabela. O primeiro passo para executar um comando é defini-lo em linguagem SQL.

1 string textoDoComando = "INSERT INTO Editora (nome, email)" + 2 "VALUES (’K19’, ’[email protected]’);";

Em seguida, devemos “pedir” para uma conexão JDBC através do métodoPREPARESTATE- MENT() criar o comando que queremos executar. Este método devolve um objeto da interface

PREPAREDSTATEMENT. O comando não é executado na chamada do método PREPARESTA- TEMENT() e sim posteriormente quando o métodoEXECUTE() for utilizado.

1 // criando comando

2 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 3 // executando o comando

4 comando.execute(); 5 comando.close();

Podemos utilizar a mesma conexão para executar diversos comandos. Quando não deseja- mos executar mais comandos, devemos fechar a conexão através do método CLOSE(). Fechar

as conexões que não são mais necessárias é importante pois os SGBD’s possuem um número limitado de conexões abertas.

1 close.close();

2.6

Exercícios

1. Crie um projeto java no eclipse chamado JDBC.

2. Crie uma pasta chamada lib no projeto JDBC.

3. Entre na pasta K19-Arquivos/MySQL-Connector-JDBC da Área de Trabalho e copie o arquivoMYSQL-CONNECTOR-JAVA-5.1.13-BIN.JAR para pasta lib do projeto JDBC.

5. Crie uma nova classe, com o nome InsereEditora, e adicione o seguinte conteúdo ao arquivo:

1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.util.Scanner;

5

6 public class InsereEditora { 7

8 public static void main(String[] args) {

9 String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; 10 String usuario = "root";

11 String senha = "root"; 12

13 Scanner entrada = new Scanner(System.in); 14

15 try {

16 System.out.println("Abrindo conexao..."); 17 Connection conexao =

18 DriverManager.getConnection(stringDeConexao, usuario, senha); 19

20 System.out.println("Digite o nome da editora: "); 21 String nome = entrada.nextLine();

22

23 System.out.println("Digite o email da editora: "); 24 String email = entrada.nextLine();

25

26 String textoDoComando = "INSERT INTO Editora (nome, email) " + 27 "VALUES (’" + nome + "’, ’" + email + "’)";

28

29 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 30

31 System.out.println("Executando comando..."); 32 comando.execute();

33

34 System.out.println("Fechando conexao..."); 35 conexao.close(); 36 } 37 catch (Exception e) { 38 e.printStackTrace(); 39 } 40 } 41 }

Rode e veja se o registro foi inserido com sucesso na base de dados.

6. (Opcional) Analogamente, ao exercício anterior crie um programa para inserir livros.

2.7

SQL Injection

Apesar de funcional, a implementação da inserção de registros feita anteriormente apresenta uma falha grave. Os dados obtidos do usuário através do teclado não são tratados antes de serem enviados para o banco de dados.

Esses dados podem conter algum carácter especial que altere o comportamento desejado da consulta impedindo que algum registro seja inserido corretamente ou até abrindo uma brecha para que um usuário mal intencionado execute alguma consulta SQL para utilizar de maneira inadequada os dados da nossa aplicação.

O problema de SQL Injection pode ser resolvido manualmente. Basta fazer “escape” dos caracteres especiais, por exemplo: ponto-e-vírgula e apóstrofo. No MySQL Server, os carac- teres especiais devem ser precedidos pelo carácter “\”. Então seria necessário acrescentar \ em todas as ocorrências de caracteres especiais nos valores passados pelo usuário.

A desvantagem desse processo é que, além de trabalhoso, é diferente para cada banco de dados, pois o “\” não é padronizado e cada banco tem o seu próprio método de escape de caracteres especiais.

Para tornar mais prática a comunicação com o banco de dados, o próprio driver faz o trata- mento das sentenças SQL. Esse processo é denominado sanitize.

1 // lendo a entrada feita pelo usuario

2 System.out.println("Digite o nome da editora: "); 3 String nome = entrada.nextLine();

4

5 System.out.println("Digite o email da editora: "); 6 String email = entrada.nextLine();

7

8 // texto do comando inclui parâmetros

9 String textoDoComando = "INSERT INTO Editora (nome, email) " + 10 "VALUES (?, ?)";

11

12 // criação e adição de parâmetros ao comando

13 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 14 comando.setString(1, nome);

15 comando.setString(2, email);

Observe que a sentença SQL foi definida com parâmetros através do carácter “?”. Antes de executar o comando, é necessário atribuir valores aos parâmetros. Isso é feito com o método

SETSTRING, que recebe o índice (posição) do parâmetro na consulta e o valor correspondente.

De maneira similar, temos os métodos SETINT, SETDOUBLE, SETDATE, etc, variando con-

forme o tipo do campo que foi definido no banco.

Os métodos acima mostrados, realizam a tarefa de “sanitizar”(limpar) os valores enviados pelo usuário.

2.8

Exercícios

7. Tente causar um erro de SQL Injection na classe feita no exercício de inserir editoras. (Dica: tente entradas com aspas simples)

8. Altere o código para eliminar o problema do SQL Injection. Você deve deixar a classe com o código abaixo:

1 public class InsereEditora {

2 public static void main(String[] args) { 3

4 String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; 5 String usuario = "root";

6 String senha = "root"; 7

8 Scanner entrada = new Scanner(System.in); 9

10 try {

11 System.out.println("Abrindo conexao...");

12 Connection conexao = DriverManager.getConnection(stringDeConexao, usuario, ←֓ senha);

13

14 System.out.println("Digite o nome da editora: "); 15 String nome = entrada.nextLine();

16

17 System.out.println("Digite o email da editora: "); 18 String email = entrada.nextLine();

19

20 String textoDoComando = "INSERT INTO Editora (nome, email) " + 21 "VALUES (?, ?)";

22

23 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 24 comando.setString(1, nome);

25 comando.setString(2, email); 26

27 System.out.println("Executando comando..."); 28 comando.execute();

29

30 System.out.println("Fechando conexao..."); 31 conexao.close(); 32 } 33 catch (Exception e) { 34 e.printStackTrace(); 35 } 36 } 37 }

9. Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras.

2.9

Listando registros

O processo para executar um comando de consulta é bem parecido com o processo de inserir registros.

1 String textoDoComando = "SELECT * FROM Editora;"; 2

3 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 4

5 System.out.println("Executando comando..."); 6 ResultSet resultado = comando.executeQuery();

A diferença é que para executar um comando de consulta é necessário utilizar o método

EXECUTEQUERY() ao invés do EXECUTE(). Esse método devolve um objeto da interface JAVA.SQL.RESULTSET, que é responsável por armazenar os resultados da consulta.

Os dados contidos no RESULTSETpodem ser acessados através de métodos, como oGETS- TRING, GETINT, GETDOUBLE, etc, de acordo com o tipo do campo. Esses métodos recebem

como parâmetro uma string referente ao nome da coluna correspondente.

1 int id = resultado.getInt("id"),

2 String nome = resultado.getString("nome"), 3 String email = resultado.getString("email");

O código acima mostra como os campos do primeiro registro da consulta são recuperados. Agora, para recuperar os outros registros é necessário avançar o RESULTSETatravés do método NEXT.

1 int id1 = resultado.getInt("id"),

2 String nome1 = resultado.getString("nome"), 3 String email1 = resultado.getString("email"); 4

5 resultado.next(); 6

7 int id2 = resultado.getInt("id"),

8 String nome2 = resultado.getString("nome"), 9 String email2 = resultado.getString("email");

O próprio método NEXTdevolve um valor booleano para indicar se o RESULTSET conse-

guiu avançar para o próximo registro. Quando esse método devolverFALSE significa que não

há mais registros para serem consultados.

1 while(resultado.next()) {

2 int id = resultado.getInt("id"),

3 String nome = resultado.getString("nome"), 4 String email = resultado.getString("email"); 5 }

2.10

Exercícios

10. Insira algumas editoras utilizando a classe INSEREEDITORA que você criou nos exercí-

cios acima.

11. Adicione uma nova classe ao projeto chamada ListaEditoras. O objetivo é listar as editoras que foram salvas no banco. Adicione o seguinte código à esta classe.

1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet;

5

6 public class ListaEditoras { 7

8 public static void main(String[] args) {

9 String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; 10 String usuario = "root";

11 String senha = "root"; 12

13 try {

14 System.out.println("Abrindo conexao..."); 15 Connection conexao =

16 DriverManager.getConnection(stringDeConexao, usuario, senha); 17

18 String textoDoComando = "SELECT * FROM Editora;"; 19

20 PreparedStatement comando = conexao.prepareStatement(textoDoComando); 21

22 System.out.println("Executando comando..."); 23 ResultSet resultado = comando.executeQuery(); 24

25 System.out.println("Resultados encontrados: \n"); 26 while (resultado.next()) { 27 System.out.printf("%d : %s - %s\n", 28 resultado.getInt("id"), 29 resultado.getString("nome"), 30 resultado.getString("email")); 31 } 32

33 System.out.println("\nFechando conexao..."); 34 conexao.close(); 35 } 36 catch (Exception e) { 37 e.printStackTrace(); 38 } 39 } 40 }

No documento Desenvolvimento Web com JSF2 e JPA2 (páginas 38-44)

Documentos relacionados