Upload
internet
View
107
Download
1
Embed Size (px)
Citation preview
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
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
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");
}}
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");
}}
}}
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;
}}
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
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
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);
}}
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
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";
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)
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)
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() }
}
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();
}
}
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(); } }
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; }
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); } });
}
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)
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)
););
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();
}}
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;
}}}}
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(); }
}}