Roteiro da Aula

advertisement
JDBC
CRIANDO O BANCO DE DADOS:
•
Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.
CRIANDO O PROJETO JAVA PARA DESKTOP:
•
Crie um projeto Java chamado Prograd
•
Crie um pacote chamado br.edu.ufabc.prograd.modelo
•
Dentro do pacote que você acabou de criar, crie uma classe chamada Aluno que deve ter o
seguinte código:
package br.edu.ufabc.prograd.modelo;
public class Aluno {
}
1
private
private
private
private
Long id;
String nome;
String email;
String endereco;
Observe que criamos o atributo id do tipo Long não do tipo long, porque Long inicia o
atributo com valor default null. Fazemos assim para não dar erro na inserção do banco
de dados.
2
Vamos transformar a classe Aluno em um javabean. Javabeans são classes que possuem
o construtor sem argumentos e métodos de acesso do tipo get e set. Para fazer isso de
forma automática no Eclipse, use o atalho ctrl + 3 e digite generate. Dentre as opções
trazidas, selecione Generate Getters and Setters. Na janela que abrir, selecione todos
os atributos.
3
Crie um pacote chamado br.edu.ufabc.prograd.testes
4
Dentro do pacote recém-criado, crie uma classe chamada CriaAluno que deve ter o
seguinte código:
package br.edu.ufabc.prograd.testes;
import br.edu.ufabc.prograd.modelo.Aluno;
public class CriaAluno
{
public static void main(String[] args) throws SQLException {
Aluno aluno = new Aluno();
aluno.setNome("Jack");
aluno.setEmail("[email protected]");
aluno.setEndereco("Av. dos Estados, 5001");
aluno.setId((long) 3); // se essa conversão de tipo (casting)
der erro no Java 1.8, modifique o comando para: aluno.setId(new Long(3));
System.out.println(aluno.getNome());
System.out.println(aluno.getEmail());
System.out.println(aluno.getEndereco());
}
System.out.println(aluno.getId());
}
CONECTANDO O BANCO DE DADOS AO PROJETO JAVA:
•
Crie um pacote que será responsável pelas conexões com o BD:
br.edu.ufabc.prograd.jdbc
•
JDBC (Java DataBase Connectivity): conjunto de interfaces bem definidas dentro do pacote
java.sql;
•
driver JDBC: classes concretas que fazem ponte entre API JDBC e o BD;
•
no pacote br.edu.ufabc.prograd.jdbc, crie uma classe chamada ConnectionFactory com o
código:
package br.edu.ufabc.prograd.jdbc;
public class ConnectionFactory {
public Connection getConnection(){
System.out.println("Conectando ao banco de dados");
try {
// a linha abaixo não é mais necessária a partir do JDBC 4 (Java 6)
//Class.forName("org.h2.Driver");
return
DriverManager.getConnection("jdbc:h2:tcp://localhost/~poo","admin","admin");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
• adicione os imports necessários (java.sql.Connection e java.sql.DriverManager);
•
adicione o driver do H2 (um arquivo JAR) contendo a implementação JDBC do H2 ao
classpath do projeto. O driver do H2 chama-se h2-1.4.182.jar e encontra-se dentro da pasta
h2, pasta bin. Para incluir o driver do banco de dados: clique direito sobre o projeto, opção
Build Path -> Configure Build Path -> Libraries -> Add External JARs
•
teste a conexão na classe CriaAluno com o código:
// testando conexão
Connection connection = new ConnectionFactory().getConnection();
System.out.println("Conexão estabelecida");
connection.close();
•
sempre tratar exceções e sempre lembrar de fechar conexões do BD;
•
importância de criar uma fábrica de conexões: um único lugar para mudar, caso
necessário; possibilidade de criar pooling de conexões; seguimos padrões de projeto a
respeito de encapsular construção de objetos complicados (livro Padrões de Projeto da Gang
of four);
ACESSANDO E MODIFICANDO OS DADOS DO BANCO DE DADOS (INSERIR):
•
Crie um pacote que será responsável por objetos de acessos aos dados (DAO - Data Access
Object): br.edu.ufabc.prograd.dao
•
nesse pacote, crie um Javabean AlunoDAO;
•
lembre-se de importar a classe java.sql (cuidado para não confundir com a classe
com.sql);
•
coloque a conexão com o banco de dados no construtor do AlunoDAO:
public class AlunoDAO {
private Connection connection;
public AlunoDAO() {
this.connection = new ConnectionFactory().getConnection();
}
•
Na classe AlunoDAO, implemente a inserção de registros:
public void insere(Aluno aluno) {
(?,?,?)";
String sql = "insert into alunos (nome,email,endereco) values
try { // prepared statement para inserção
PreparedStatement stmt = connection.prepareStatement(sql);
// seta valores
stmt.setString(1, aluno.getNome());
stmt.setString(2, aluno.getEmail());
stmt.setString(3, aluno.getEndereco());
//executa
stmt.execute();
}
•
// fecha statement
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
modifique a classe CriaAluno, acrescentando um código para testar o método de inserção:
// gravando registro
AlunoDAO dao = new AlunoDAO();
dao.insere(aluno);
System.out.println("Gravado!");
•
Quais são os problemas com a SQL abaixo?
String
sql
=
"insert
into
alunos
('"+nome+"','"+email+"'+'"+endereco+"')";
1. difícil de ler;
•
mais provável de ocorrer erros;
(nome,email,endereco)
values
•
preconceito contra Joana D'Arc;
•
SQL Injection: técnica usada para atacar aplicações orientadas a dados. Ilustração:
http://xkcd.com/327/
•
é necessário sanitizar as entradas do BD: tratar entradas (caracteres especiais, etc);
•
mais genérico e mais seguro:
String sql = "insert into alunos (nome,email,endereco) values (?,?,?)";
1. PreparedStatement: interface para executar as cláusulas, faz sanitização das entradas do BD;
ACESSANDO E MODIFICANDO OS DADOS DO BANCO DE DADOS (REMOVER,
ALTERAR E LISTAR):
•
Implemente a remoção de registros:
public void remove(Aluno aluno) {
try {
PreparedStatement stmt = connection.prepareStatement("delete
from alunos where id=?");
stmt.setLong(1, aluno.getId());
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
•
modifique a classe CriaAluno, acrescentando um código para testar o método de remoção
(não esqueça de setar o id do registro a ser modificado):
// removendo registro
AlunoDAO dao = new AlunoDAO();
dao.remove(aluno);
System.out.println("Removido!");
•
implemente a alteração de registros:
public void altera(Aluno aluno) {
id=?";
String sql = "update alunos set nome=?, email=?, endereco=? where
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, aluno.getNome());
stmt.setString(2, aluno.getEmail());
stmt.setString(3, aluno.getEndereco());
stmt.setLong(4, aluno.getId());
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
•
modifique a classe CriaAluno, acrescentando um código para testar o método de alteração
(não esqueça de setar o id do registro a ser modificado):
// alterando registro
AlunoDAO dao = new AlunoDAO();
dao.altera(aluno);
System.out.println("Alterado!");
•
implemente a listagem dos registros:
public List<Aluno> getLista() { // importar java.util
List<Aluno> alunos = new ArrayList<Aluno>();
PreparedStatement stmt;
try {
stmt = this.connection.prepareStatement("select * from alunos
order by nome");
ResultSet rs = stmt.executeQuery(); // importar java.sql
while (rs.next()) {
Aluno aluno = new Aluno();
aluno.setId(rs.getLong("id"));
aluno.setNome(rs.getString("nome"));
aluno.setEmail(rs.getString("email"));
aluno.setEndereco(rs.getString("endereco"));
alunos.add(aluno);
}
rs.close();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return alunos;
}
•
modifique a classe CriaAluno, acrescentando um código para testar o método de listagem:
// listando registros
AlunoDAO dao = new AlunoDAO();
List<Aluno> alunos = dao.getLista();
for (Aluno aluno1 : alunos){
System.out.println("Nome: "+aluno1.getNome()+" Email: "+aluno1
.getEmail()+" Endereço: "+ aluno1.getEndereco());
}
•
Use os métodos criados para inserir, remover, alterar e listar para fazer testes com o banco
de dados através da aplicação Java. Usando o comando SQL select, cheque no BD as
alterações realizadas.
Download