ronaldo celso messias correia [email protected] conexão com bancos de dados via jdbc

23
unesp Ronaldo Celso Messias Correia [email protected] Conexão com Bancos de Dados via JDBC

Upload: internet

Post on 17-Apr-2015

107 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

Ronaldo Celso Messias [email protected]

Conexão com Bancos de Dados

via JDBC

Page 2: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespConexão com Bancos de Dados via JDBC

JDBC (Java Database Connectivity) é uma API para execução e JDBC (Java Database Connectivity) é uma API para execução e

manipulação de resultados a consultas SQL através de Java. manipulação de resultados a consultas SQL através de Java.

A conexão com o banco de dados vai JDBC utiliza um arquivo .jar que A conexão com o banco de dados vai JDBC utiliza um arquivo .jar que

constitui o elo de ligação da aplicação com o SGBD utilizado. Ele deve constitui o elo de ligação da aplicação com o SGBD utilizado. Ele deve

ser incluído nas Opções do Projeto.ser incluído nas Opções do Projeto.

Para desenvolver uma aplicação com Java e bancos de dados Para desenvolver uma aplicação com Java e bancos de dados

relacionais, é preciso ter disponível:relacionais, é preciso ter disponível:

O pacote JDBC (padrão na distribuição da plataforma de desenvolvimento O pacote JDBC (padrão na distribuição da plataforma de desenvolvimento

Java desde sua versão 1.1);Java desde sua versão 1.1);

Acesso a um servidor de banco de dados relacional, ou seja, um sistema Acesso a um servidor de banco de dados relacional, ou seja, um sistema

gerenciador de banco de dados que entende SQL (MySQL);gerenciador de banco de dados que entende SQL (MySQL);

Um driver JDBC adequado ao SGBD que será utilizado.Um driver JDBC adequado ao SGBD que será utilizado. mysql-connector-java-5.1.13-bin.jarmysql-connector-java-5.1.13-bin.jar

Page 3: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp Conexão JDBC:Conexão JDBC:

import java.sql.*;import java.sql.*;

......

Connection connect;Connection connect;

Statement stmt;Statement stmt;

……

try {try {

String url = "jdbc:mysql://" + host + "/" + banco_dados + "?user=" + login + String url = "jdbc:mysql://" + host + "/" + banco_dados + "?user=" + login + "&password=" + password;"&password=" + password;

Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver");

connect = DriverManager.getConnection(url);connect = DriverManager.getConnection(url);

stmt = connect.createStatement();}stmt = connect.createStatement();}

catch ( catch ( ClassNotFoundException cnfexClassNotFoundException cnfex ) )

{System.err.println("Falha ao ler o driver JDBC/ODBC");}{System.err.println("Falha ao ler o driver JDBC/ODBC");}

catch ( catch ( SQLException sqlexSQLException sqlex ) )

{System.out.println("Impossível conectar");}{System.out.println("Impossível conectar");}

catch ( catch ( Exception exException ex ) )

{System.out.println(“Outro erro");.}{System.out.println(“Outro erro");.}

Biblioteca SQL

Objeto para a Conexão

Caminho de conexão

Carrega o Driver

Três tipos possíveis de erro

Objeto para comandos SQL

Efetua a conexão

Cria objeto stmt para comandos SQL

Page 4: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespMétodo ConectaMétodo Conecta

public void conecta()public void conecta()

{{

trytry

{{

String url = "jdbc:mysql://" + host + "/" + banco_dados + "?user=" + login + String url = "jdbc:mysql://" + host + "/" + banco_dados + "?user=" + login + "&password=" + password;"&password=" + password;

Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver");

connect = DriverManager.getConnection(url);connect = DriverManager.getConnection(url);

stmt = connect.createStatement();stmt = connect.createStatement();

}}

catch (ClassNotFoundException ex1)catch (ClassNotFoundException ex1)

{{

System.out.println ("Erro de classe não existente: "+ex1.getMessage().toString()+"\System.out.println ("Erro de classe não existente: "+ex1.getMessage().toString()+"\n");n");

}}

catch (SQLException ex)catch (SQLException ex)

{{

System.out.println ("Erro de SQL: "+ex.getMessage().toString()+"\n");System.out.println ("Erro de SQL: "+ex.getMessage().toString()+"\n");

}}

catch (Exception e)catch (Exception e)

{{

System.out.println ("Outros Erros: "+e.getMessage().toString()+"\n");System.out.println ("Outros Erros: "+e.getMessage().toString()+"\n");

}}

System.out.println ("Conectado");System.out.println ("Conectado");

}}

Page 5: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespMétodo desconectaMétodo desconecta

/* Faz uma desconexão com o banco de dados *//* Faz uma desconexão com o banco de dados */

public void desconecta ()public void desconecta ()

{{

try try

{{

stmt.close ();stmt.close ();

connect.close ();connect.close ();

}}

catch (Exception e)catch (Exception e)

{{

System.out.println ("Error:"+e.getMessage().toString()+"\n");System.out.println ("Error:"+e.getMessage().toString()+"\n");

}}

}}

Page 6: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespClasse ConexãoClasse Conexão

public class Conexaopublic class Conexao

{{

public static Connection connect;public static Connection connect;

public static Statement stmt;public static Statement stmt;

String host="127.0.0.1";String host="127.0.0.1";

String banco_dados="teste";String banco_dados="teste";

String login="root";String login="root";

String password = "sql";String password = "sql";

String porta="3306";String porta="3306";

public Conexao(String host, String banco_dados, String login, String password)public Conexao(String host, String banco_dados, String login, String password)

{{

this.host=host;this.host=host;

this.banco_dados=banco_dados;this.banco_dados=banco_dados;

this.login = login;this.login = login;

this.password = password;this.password = password;

}}

Page 7: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

Insert / Update / Delete:Insert / Update / Delete:

import java.sql.*;import java.sql.*;

......

private Connection connect;private Connection connect;

……

try { Statement statement = connect.createStatement();try { Statement statement = connect.createStatement();

String query = "UPDATE pessoa SET nome = ‘Joaquim’ “+ String query = "UPDATE pessoa SET nome = ‘Joaquim’ “+

“ “ WHERE id = 1”;WHERE id = 1”;

int result = statement.executeUpdate( query );int result = statement.executeUpdate( query );

statement.close();statement.close();

}}

catch ( SQLException sqlex ) {...}catch ( SQLException sqlex ) {...}

Cria o objeto para executar um comando

SQL

Erro de SQL

Monta o SQL

Executa o SQL retornando o número de

registros afetados

Finaliza o objeto que executou o SQL

Page 8: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

Select:Select:import java.sql.*;import java.sql.*;

......

private Connection connect;private Connection connect;

……

try { try {

Statement statement = connect.createStatement( Statement statement = connect.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);ResultSet.CONCUR_READ_ONLY);

String query = “SELECT * FROM addresses”;String query = “SELECT * FROM addresses”;

ResultSet rs = statement.executeQuery( query );ResultSet rs = statement.executeQuery( query );

statement.close();statement.close();

}}

catch ( SQLException sqlex ) {...}catch ( SQLException sqlex ) {...}

Cria o objeto para executar um comando

SQL

Erro de SQL

Monta SQL

Executa o SQL retornando um

conjunto de dados

Finaliza o objeto que executou o SQL

Opcional

Page 9: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp Utilizando os dados retornados:Utilizando os dados retornados:

Posicionamento de registros:Posicionamento de registros:ResultSet rs;ResultSet rs;

...... rs.first();rs.first(); rs.last();rs.last();rs.next();rs.next(); rs.previous();rs.previous();

Escolhendo um campo:Escolhendo um campo:Int Codigo = rs. getInt( “ID” );Int Codigo = rs. getInt( “ID” );

String Nome = rs. getString( “Nome” );String Nome = rs. getString( “Nome” );

Date Nascimento = rs. getDate( “DtNasc” );Date Nascimento = rs. getDate( “DtNasc” );

ExemploExemplo:String info;:String info;

while(rs.next())while(rs.next())

{ info=rs.getString(“sobrenome");{ info=rs.getString(“sobrenome");

System.out.println(info);System.out.println(info);

}}

Page 10: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp Utilizando os dados retornados:Utilizando os dados retornados:

Recuperando os campos de uma tabelaRecuperando os campos de uma tabelaResultSet rs;ResultSet rs;

......

ResultSetMetaData rsm = rs.getMetaData();ResultSetMetaData rsm = rs.getMetaData();

for( int i=1;i<=rsm.getColumnCount(); i++)for( int i=1;i<=rsm.getColumnCount(); i++)

System.out.println(rsm.getColumnName(i));System.out.println(rsm.getColumnName(i));

getColumnTypeName – retorna o tipo do dado;getColumnTypeName – retorna o tipo do dado;

java.sql.Typesjava.sql.Types for (int i=1; i<=rsmd.getColumnCount(); i++)for (int i=1; i<=rsmd.getColumnCount(); i++)

{{

info=rsmd.getColumnTypeName(i);info=rsmd.getColumnTypeName(i);

info2=rsmd.getColumnName(i);info2=rsmd.getColumnName(i);

System.out.println(info2 + " --> " + info + "\n");System.out.println(info2 + " --> " + info + "\n");

}}

Recupera os campos de

uma tabela ou query

Número de campos

Os campos

Retorna o tipo

Page 11: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

cod nome cpf

1 Jose Anibal 312121212

2 Cleide Alvares 121212323

3 Celina Dilon 121323423

Proprietário

cod codp modelo valor

1 1 Fusca 1600 1320,00

2 2 Brasilia 1200,00

3 1 Gordine II 4500,00

Veículo

SQL:

SELECT modelo FROM Veiculo WHERE valor > 2000;

SELECT * FROM Proprietario WHERE name LIKE ‘Jose%’;

SELECT v.* FROM Proprietario p, veiculo v WHERE p.cod=v.codp;

INSERT INTO Veiculo VALUES(5,3,’DKW’,3000.50);

UPDATE veiculo SET valor=valor*1.1 WHERE modelo=“Fusca 1600";

Page 12: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

//inserção usando um statement

Statement statement = connect.createStatement();

String query = "INSERT INTO pessoa

(nome,endereco,cidade,estado)

VALUES

('José de Alencar','Av. Copacabana, 222', 'Rio

de Janeiro', 'RJ')";

boolean res = statement.execute(query);

Inserindo um novo Registro (Tabela Pessoa)

Page 13: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unesp

//alteração usando um statement

Statement statement = connect.createStatement();

String query = "UPDATE pessoa SET nome = 'Clara Nunes'

WHERE id = 5";

int res = statement.executeUpdate(query);

Alterando um Registro (Tabela Pessoa)

Page 14: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExemplo com JTableimport java.sql.*;import javax.swing.*;import java.awt.event.*;import java.awt.*;import java.util.*; //por causa do Vectorimport acessamysl.Conexao;

public class TesteTable extends JFrame{ private JTable table; public static Connection connect; public static Statement stmt; String host="127.0.0.1"; String banco_dados="teste"; String login="root"; String password = "sql"; String porta="3306";

public TesteTable() //construtor {

Conexao c = new Conexao("127.0.0.1", "teste", "root","sql"); c.conecta(); connect = c.getConection(); System.out.println ("Conectado");

getTable(); setSize(400,200);

show() }

}

Page 15: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExemplo com JTable

private void getTable(){

Statement st;

ResultSet rs;

try{

String query = "SELECT * FROM pessoa";

st = connect.createStatement();

rs = st.executeQuery(query);

mostraResultado(rs);

st.close();

}catch(SQLException sqlex){

sqlex.printStackTrace();

}

}

Page 16: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExemplo com JTableprivate void mostraResultado(ResultSet rs) throws SQLException { boolean verificaDados = rs.next(); if (!verificaDados){ JOptionPane.showMessageDialog(null, "Nenhum registro!"); setTitle("Nenhum registro!!!"); return; } setTitle("Pessoas cadastradas!!!"); Vector cabecalho = new Vector(); Vector tuplas = new Vector(); try { ResultSetMetaData rsmd = rs.getMetaData();

for (int i = 1; i<=rsmd.getColumnCount(); i++) cabecalho.addElement(rsmd.getColumnName(i)); do{ tuplas.addElement(getTupla(rs,rsmd)); }while(rs.next()); table = new JTable(tuplas, cabecalho); JScrollPane scroll = new JScrollPane(table); getContentPane().add(scroll, BorderLayout.CENTER); validate(); //Atualiza desenho da tela }catch(SQLException sqlex){ sqlex.printStackTrace(); } }

Page 17: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExemplo com JTableprivate Vector getTupla(ResultSet rs, ResultSetMetaData rsmd) throws SQLException{ Vector tupla = new Vector(); for (int i=1; i<=rsmd.getColumnCount(); i++) { switch(rsmd.getColumnType(i)){ case Types.VARCHAR: tupla.addElement(rs.getString(i)); break; case Types.INTEGER: tupla.addElement(new Long(rs.getLong(i))); break; case Types.SMALLINT: tupla.addElement(new Long(rs.getLong(i))); break; case Types.CHAR: tupla.addElement(rs.getString(i)); break; default: System.out.println("O Tipo era: " + rsmd.getColumnTypeName(i));

} } return tupla; }

Page 18: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExemplo com JTablepublic void shutDown() { try{ connect.close(); }catch(SQLException sqlex){ System.err.println("Não foi possível desconectar!!!"); sqlex.printStackTrace(); }}

public static void main(String[] args){

final TesteTable app = new TesteTable(); app.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e){ app.shutDown(); System.exit(0); } });

}

Page 19: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExercício

Criar um novo projetoCriar um novo projeto

Separar o sistema em três camadas básicas: interface, estrutura e Separar o sistema em três camadas básicas: interface, estrutura e

persistência; persistência;

Dividir o desenvolvimento do software em fases, cada fase tratando uma Dividir o desenvolvimento do software em fases, cada fase tratando uma

parte da aplicação. O fim de uma fase constitui na entrada da outra fase;parte da aplicação. O fim de uma fase constitui na entrada da outra fase;

Em Projeto/Propriedades – Libraries, inclua o conector JBDCEm Projeto/Propriedades – Libraries, inclua o conector JBDC

Criar uma classe Pessoa (pacote estrutura)Criar uma classe Pessoa (pacote estrutura)public class Pessoa {public class Pessoa {

/* Atributos de Pessoa *//* Atributos de Pessoa */

private String nome;private String nome;

private short idade;private short idade;

private char sexo;private char sexo;

private String dataInscricao;private String dataInscricao;

private boolean moraSozinho;private boolean moraSozinho;

private String UF;private String UF;

Criar a interface de cadastro Criar a interface de cadastro

de Pessoa (pacote interface)de Pessoa (pacote interface)

Page 20: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExercício

Criar as tabelas no banco de dados - MySQLCriar as tabelas no banco de dados - MySQL

create table estadocreate table estado

((

nome varchar(2) not null primary keynome varchar(2) not null primary key

););

create table pessoacreate table pessoa

((

nome varchar(50) not null primary key,nome varchar(50) not null primary key,

idade smallint,idade smallint,

cidade varchar(50),cidade varchar(50),

estado varchar(2),estado varchar(2),

foreign key (estado) references estado(nome)foreign key (estado) references estado(nome)

););

Page 21: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExercício

Criar uma classe persistência e implementar os métodos (salvar e Criar uma classe persistência e implementar os métodos (salvar e

carregar), passando os parâmetros de acordo com a estrutura do carregar), passando os parâmetros de acordo com a estrutura do

banco de dadosbanco de dadospublic abstract class ControladorDePersistencia {public abstract class ControladorDePersistencia {

public static void salvarRegistro(Pessoa p, Conexao conexao) throws public static void salvarRegistro(Pessoa p, Conexao conexao) throws ExceptionException

{ {

conexao.conecta();conexao.conecta();

System.out.println("conexão efetuada"); System.out.println("conexão efetuada");

Connection con = conexao.getConection(); Connection con = conexao.getConection();

Statement st = con.createStatement();Statement st = con.createStatement();

String query = "INSERT INTO pessoa(nome, idade, estado) values ('" + String query = "INSERT INTO pessoa(nome, idade, estado) values ('" + p.getNome() + "'," + p.getIdade() + ",'" + p.getUF() + "')"; p.getNome() + "'," + p.getIdade() + ",'" + p.getUF() + "')";

st.executeUpdate(query);st.executeUpdate(query);

st.close();st.close();

conexao.desconecta();conexao.desconecta();

}}

Page 22: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExercício

Criar uma classe persistência e implementar os métodos (salvar e Criar uma classe persistência e implementar os métodos (salvar e

carregar), passando os parâmetros de acordo com a estrutura do carregar), passando os parâmetros de acordo com a estrutura do

banco de dadosbanco de dados public static Pessoa carregarRegistro(String nome, Conexao conexao) throws public static Pessoa carregarRegistro(String nome, Conexao conexao) throws

ExceptionException

{ conexao.conecta();{ conexao.conecta();

Connection con = conexao.getConection();Connection con = conexao.getConection();

Statement st = con.createStatement();Statement st = con.createStatement();

ResultSet rs;ResultSet rs;

String query = "SELECT nome, idade, estado from pessoa where nome = '" String query = "SELECT nome, idade, estado from pessoa where nome = '" + nome + "'";+ nome + "'";

rs = st.executeQuery(query); rs = st.executeQuery(query);

if( !rs.next() ) return null;if( !rs.next() ) return null;

Pessoa p = new Pessoa( nome, rs.getShort("idade"), Pessoa p = new Pessoa( nome, rs.getShort("idade"), rs.getString("estado") );rs.getString("estado") );

st.close();st.close();

conexao.desconecta();conexao.desconecta();

return p;return p;

}}}}

Page 23: Ronaldo Celso Messias Correia ronaldo@fct.unesp.br Conexão com Bancos de Dados via JDBC

unespExercício

Adicione a classe Conexao.java ao projeto, na camada de persistência e Adicione a classe Conexao.java ao projeto, na camada de persistência e

declare uma variável deste tipo e instancie ela no construtor do frame declare uma variável deste tipo e instancie ela no construtor do frame

principal.principal.

Ao selecionar o botão cadastrar do formulário MDI, instanciar um objeto Ao selecionar o botão cadastrar do formulário MDI, instanciar um objeto

pessoa e armazenar no BD pessoa e armazenar no BD private void jButtonCadastrarActionPerformed(java.awt.event.ActionEvent evt) { private void jButtonCadastrarActionPerformed(java.awt.event.ActionEvent evt) {

Pessoa pessoa;Pessoa pessoa;

short idade = Short.parseShort(jSpinnerIdade.getValue().toString());short idade = Short.parseShort(jSpinnerIdade.getValue().toString());

pessoa = new Pessoa( jTextFieldNome.getText(), idade,pessoa = new Pessoa( jTextFieldNome.getText(), idade,

jRadioButtonM.isSelected() ? 'M' : 'F', jFTextFieldData.getText(),jRadioButtonM.isSelected() ? 'M' : 'F', jFTextFieldData.getText(),

jCheckBoxSozinho.isSelected(), (String)jComboBoxUF.getSelectedItem() );jCheckBoxSozinho.isSelected(), (String)jComboBoxUF.getSelectedItem() );

trytry

{{

ControladorDePersistencia.salvarRegistro(pessoa,conexao);ControladorDePersistencia.salvarRegistro(pessoa,conexao);

}}

catch(Exception e) { e.printStackTrace(); }catch(Exception e) { e.printStackTrace(); }

}}