jdbc java dababase connectivity marco antonio, arquiteto de software – tjdf ma@marcoreis.net...

Post on 17-Apr-2015

109 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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.

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.

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.

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

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

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

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.

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.

Tutorial de SQL

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

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.

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.

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.

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”);

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

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”);

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

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') ”);

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.

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

}

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();

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;

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();

}

}

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;

}

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();

}

}

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;

}

}

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");

}

}

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");

}

}

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");

;

}

}

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.

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();

}

}

}

Dúvidas?

top related