jdbc java dababase connectivity marco antonio, arquiteto de software – tjdf [email protected]...

34
JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF [email protected] Atualizado em Novembro/2008

Upload: internet

Post on 17-Apr-2015

109 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

JDBC

Java Dababase Connectivity

Marco Antonio,

Arquiteto de Software – TJDF

[email protected]

Atualizado em Novembro/2008

Page 2: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

JDBC

Java Database Connectivity.

Tecnologia da Sun para acesso a dados.

Acessa qualquer banco de dados.

JDBC é uma API, ou seja, apenas especificação.

Implementado através de um driver fornecido pelo fabricante.

Pacote base: java.sql

Page 3: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

JDBC API

JDBC API é um conjunto de interfaces que são implementados pelos drivers dos fornecedores de banco de dados.O fato de utilizar interfaces garante a independência da aplicação em relação aos bancos de dados, garantindo a portabilidade.Você pode conferir uma lista dos drivers disponíveis no site: http://developers.sun.com/product/jdbc/drivers

Page 4: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Principais elementos da API

Driver: fornecido pelo fabricando do banco de dados, é específico para cada SGBD.

DriverManager: responsável pela criação da conexão.

Connection: representa uma conexão física com o SGBD.

Statement/PreparedStatement: comando executado no SGBD (insert, delete, update).

ResultSet: resultado da consulta a um banco de dados.

Page 5: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Driver JDBC

Cada banco de dados tem sua implementação para a API JDBC. Chamamos essa implementação de driver.

O nome do Driver do MySQL é connectorJBaixe o driver do site http://dev.mysql.com/downloads/connector/

Abra o arquivo compactado e procure pelo arquivo “mysql-connector-versão_atual.jar”.

Salve esse arquivo no diretório lib da sua aplicação.

Page 6: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

lib

• Botão direito na lib, Build Path -> Add to Build Path.

• A partir de agora, essa biblioteca está registrada para esse (e somente para esse) projeto.

Page 7: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Tabela de exemplo

Crie o schema CursoDeJava, onde estarão nossas tabelas.

Para nosso exemplo, precisamos da tabela Pessoa com as colunas:

Id: int auto-numerado (primary key, chave-primária, pk).Nome: varchar(50).Endereco: varchar(50).Telefone: varchar(50).Cpf: varchar(11)

Existem quatro operações em banco de dados: select, insert, update, delete. Em alguns livros podemos encontrar o termo CRUD (create, recover, update, delete).

Page 8: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Insert

• Comando para inclusão de dados em uma tabela.

• Veja o exemplo:– Insert into Pessoa (nome, endereco, telefone, cpf)

values (‘Marco’, ‘QE4’, ‘81108989’, ‘8328579238’)– Insert into Pessoa (nome, cpf) values (‘Diego

Lucas’, ‘090990099090’)

• Informe corretamente o nome das colunas e em seguida os seus valores (na sequência correta).

Page 9: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Update

• Comando SQL para atualização de dados.

• Exemplo:– Update Pessoa set nome = ‘Marco Antonio’ where id

= 10– Update Pessoa set nome = ‘Marco Antonio’,

endereco = ‘Novo Endereço’ where id = 22

Page 10: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Delete

• Apaga o registro, geralmente baseando-se na chave primária.

• Exemplo:– Delete from Pessoa where id = 100– Delete from Pessoa where id in (10, 12, 14)– Delete from Pessoa

• Comando não muito recomendado. Apaga sua tabela inteira.

Page 11: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Select

• Chave do sucesso do SQL, o comando select recupera dados das tabelas de uma forma eficiente.

• Sua sintaxe é bastante flexível, possibilitando toda e qualquer forma de consulta para mostrar dados para os usuários.

• Exemplo:– Select * from Pessoa– Select nome, endereco from Pessoa– Select * from Pessoa where id = 10– Select * from Pessoa where nome like ‘%Ma%’

• Recupera todos os registros onde o campo nome tenha a ocorrência ‘Ma’. O caracter % indica que ‘Ma’ pode estar em qualquer lugar dentro da coluna nome.

Page 12: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Tutorial de SQL

• http://www.w3schools.com/sql/default.asp

Page 13: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

O que é importante

Para criar uma conexão com um SGBD qualquer precisamos seguir diversos passos que não precisam ser decorados!!!

Quando nosso sistema começa a crescer e se sofisticar (JEE, Hibernate, Servlet, JSP, etc), você não irá mais ter contato com esse mecanismo, pois tudo será feito de forma automática pelos servidores.

Apesar de haver diversos frameworks que facilitam o acesso a dados, o JDBC ainda é um dos mais usados.

Page 14: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Parâmetros da conexão

Para acessar um SGBD na rede, você deve informar a localização do mesmo.

Alguns parâmetros são obrigatórios. Veja a lista:Url: protocolo e endereço do SGBD na rede.

Driver: nome do driver que você vai usar para acessar o banco.

User: nome do usuário.

Password: senha do usuário.

Page 15: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

URL

• Usada para criar a conexão com a base de dados.

• Geralmente contém nome do servidor, porta, protocolo, subprotocolo, database.

• É específico para cada banco de dados, sendo assim, você deve verificar a documentação.

Page 16: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Driver

A interface Driver é utilizada pelo mecanismo interno do JDBC (suas implementações).

É obrigatório carregá-lo, pois só assim sua aplicação saberá como interpretar os comandos SQL.

Veja um exemplo:Class.forName(“com.mysql.jdbc.Driver”);

Page 17: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Connection

Representa uma conexão física com o SGBD.

A sintaxe é fornecida pelo fabricante, mas todas são similares.

Veja alguns exemplos:jdbc:odbc:anuncios

jdbc:oracle:thin:@200.206.192.216:1521:exemplo

jdbc:mysql://alnitak.orion.org/clientes

jdbc:cloudscape:rmi://host:1098/MyDB;create=true

Page 18: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

DriverManager

O DriverMaganer manipula os Drivers informados anteriormente.

Possui métodos para registrar um driver, remover ou listar todos.

É utilizado para recuperar uma conexão baseando-se em parâmetros.

Veja um exemplo:Connection con = DriverManager.getConnection(“jdbc:mysql://nome_do_servidor/nome_do_database, “root”, “senha”);

Page 19: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Statement

Oferece meios para passar comandos ao SGBD.

Statement stmt = con.createStatement();

Com o stmt podemos usar os métodos execute(), executeQuery(), executeBatch() e executeUpdate() para enviar instruções ao SGBD.

Subinterfaces:PreparedStatement (instruções SQL pré-compiladas) e CallableStatement (StoredProcedures).

Page 20: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Enviando instruções

stmt.execute(“CREATE TABLE Pessoa “

+ “ (id MEDIUMINT NOT NULL AUTO_INCREMENT “

+ “, nome varchar(50) “

+ “, endereco varchar(50) “

+ “, telefone varchar(20) ”

+ “, cpf varchar(20) “

+ “, PRIMARY KEY(id) ) ”);

int quantidadeDeRegistros = stmt.executeUpdate(“INSERT INTO “

+ “ PESSOA (nome, endereco, telefone, cpf) “

+ “ VALUES “

+ “ ('Marco Antonio', 'CNB 14 LOTE 10', '33521134', '832869') ”);

Page 21: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

ResultSet

O ResultSet encapsula o resultado de uma consulta a uma tabela na forma de um cursor.

Métodos de navegação:next(), previous(), first() e last().

Métodos para obter dados de uma coluna:getInt(), getString(), getDate(), getObject(), etc.

Page 22: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Obtenção de dadosResultSet rs = stmt.executeQuery(“SELECT * FROM Pessoa “);

while (rs.next()) {

int idPessoa = rs.getInt(“id”);

String nomeDaPessoa = rs.getString(“nome”);

String enderecoDaPessoa = rs.getString(“endereco”);

//Continua para todas as colunas

//Depois, faça algo com os valores obtidos.

//Mostrar numa tela por exemplo

}

Page 23: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

PreparedStatement

É um Statemente pré-compilado que é mais eficiente quando temos o mesmo comando repetido várias vezes, mudando apenas os parâmetros. Veja o exemplo:

String sql = “INSERT INTO Pessoa (nome, endereco, telefone, cpf) values (?, ?, ?, ?)”;

PreparedStatement stmt = con.prepareStatement(sql);

stmt.setString(1, “Marco Antonio”);

stmt.setString(2, “CNB 14 LOTE 10”);

stmt.setString(3, “33521134”);

stmt.setString(4, “832869”);

stmt.executeUpdate();

Page 24: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Feche tudo

Lembre-se de fechar todos os recursos que você abriu para que outras pessoas possa utilizá-los.

Veja alguns exemplos:

con.close;

stmt.close;

rs.close;

Page 25: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

GerenteDeConexaopackage com.livraria.persistencia;

import java.sql.*;

public class GerenteDeConexao {

private Connection conexao;

private String driver = "com.mysql.jdbc.Driver";

private String url = "jdbc:mysql://localhost:3306/CursoDeJava";

private String usuario = "root";

private String senha = "";

/**

* Conecta a aplicação no banco de dados usando os parâmetros informados

*/

private void conectar() {

try {

Class.forName(driver);

conexao = DriverManager.getConnection(url, usuario, senha);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

}

Page 26: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

GerenteDeConexao

/**

* Recupera uma conexão válida

* Conecta caso a conexão ainda não tenha sido feita

* @return uma conexão válida com o banco de dados

*/

private Connection getConexao() {

if (conexao == null) {

conectar();

}

return conexao;

}

Page 27: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

GerenteDeConexao

/**

* Executa comandos SQL de inclusão, alteração e exclusão

* @param comando Comando SQL a ser executado no banco de dados

* @param valores Lista de valores passados para o banco de dados (utiliza argumentos variáveis)

*/

public void executarComando(String comando, String... valores) {

try {

PreparedStatement stmt = getConexao().prepareStatement(comando);

int indice = 1;

for (String valor : valores) {

stmt.setString(indice, valor);

indice++;

}

} catch (SQLException e) {

e.printStackTrace();

}

}

Page 28: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

GerenteDeConexao

/**

* Executa uma consulta no banco de dados

* @param consulta Consulta SQL (SELECT)

* @return Um ResultSet contendo o resultado da consulta

*/

public ResultSet executarConsulta(String consulta) {

try {

PreparedStatement stmt = getConexao().prepareStatement(consulta);

return stmt.executeQuery();

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

}

Page 29: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

InsereDadospackage com.livraria.persistencia;

public class InsereDados {

public static void main(String[] args) {

GerenteDeConexao gerente = new GerenteDeConexao();

StringBuilder sql = new StringBuilder("INSERT INTO PESSOA ");

sql.append("(NOME, ENDERECO TELEFONE, CPF)");

sql.append("VALUES(?, ?, ?, ?)");

gerente.executarComando(sql.toString(), "MARCO", "GUARÁ", "7777-8888", "898.423.342.77");

}

}

Page 30: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

AtualizaDados

package com.livraria.persistencia;

public class AtualizaDados {

public static void main(String[] args) {

GerenteDeConexao gerente = new GerenteDeConexao();

StringBuilder sql = new StringBuilder("UPDATE PESSOA ");

sql.append("SET NOME = ?, ENDERECO = ? ");

sql.append("WHERE ID = ? ");

gerente.executarComando(sql.toString(), "NOVO NOME", "NOVO ENDEREÇO", “1");

}

}

Page 31: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

ExcluiDados

package com.livraria.persistencia;

public class ExcluiDados {

public static void main(String[] args) {

GerenteDeConexao gerente = new GerenteDeConexao();

StringBuilder sql = new StringBuilder("DELETE FROM PESSOA WHERE ID = ?");

gerente.executarComando(sql.toString(), "1");

;

}

}

Page 32: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Algumas considerações

resultnome do ResultSet (resultado da consulta).

result.getString(“id")Recupera o valor da coluna codigo.

result.getString("nome")Recupera o valor da coluna nome.

Page 33: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

ConsultaDadospackage com.livraria.persistencia;

import java.sql.*;

public class ConsultaDados {

public static void main(String[] args) {

GerenteDeConexao gerente = new GerenteDeConexao();

StringBuilder sql = new StringBuilder("SELECT * FROM PESSOA");

ResultSet result = gerente.executarConsulta(sql.toString());

try {

while (result.next()) {

System.out.println("ID: " + result.getString("ID"));

System.out.println("NOME: " + result.getString("NOME"));

System.out.println("ENDEREÇO: " + result.getString("ENDERECO"));

System.out.println("TELEFONE: " + result.getString("TELEFONE"));

System.out.println("CPF: " + result.getString("CPF"));

System.out.println("______________________________");

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

Page 34: JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008

Dúvidas?