Académique Documents
Professionnel Documents
Culture Documents
INTRODUÇÃO ................................................................................................................................................ 2
FÁBRICA DE CONEXÕES.......................................................................................................................... 4
PRATICAR............................................................................................................................................... 8
Introdução
Conectar-se a um banco de dados com Java é feito de maneira diferenciada. Para evitar que cada banco
tenha a sua própria API e conjunto de classes e métodos, temos um único conjunto de interfaces muito
bem definidas que devem ser implementadas. Esse conjunto de interfaces fica dentro do pacote java.sql
1
e nos referiamos a esta API como JDBC .
Entre as diversas interfaces deste pacote, existe a interface Connection que define, entre outros,
métodos para executar uma query, comitar transação e fechar a conexão. Caso queiramos trabalhar
2
com o MySQL , precisamos de classes concretas que implementem essas interfaces do pacote java.sql.
3
Esse conjunto de classes concretas é quem fará a ponte entre o código cliente que usa a API JDBC e o
banco de dados. São essas classes que sabem se comunicar através do protocolo proprietário do banco
de dados. Esse conjunto de classes recebe o nome de driver. Todos os principais bancos de dados do
mercado possuem drivers JDBC para que você possa utilizá-los com Java.
Implementação
JDBC MySQL DriverManager.getConnection("jdbc:mysql://localh
ost/teste");
1
Java Database Connectivity ou JDBC é um conjunto de classes e interfaces (API) escritas em Java que fazem o envio de instruções
SQL para qualquer banco de dados relacional
2
O MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Linguagem de Consulta
Estruturada, do inglês Structured Query Language) como interface
3
Application Programming Interface (ou Interface de Programação de Aplicações) é um conjunto de rotinas e padrões
estabelecidos por um software para a utilização das suas funcionalidades por programas aplicativos que não querem envolver-se
em detalhes da implementação do software, mas apenas usar seus serviços.
3
Para abrir uma conexão com um banco de dados, precisamos utilizar sempre um driver. A classe
DriverManager é a responsável por se comunicar com todos os drivers que você deixou disponível. Para
isso, invocamos o método estático getConnection com uma String que indica a qual banco desejamos
nos conectar.
Essa String - chamada de String de conexão JDBC - utilizaada para acessar o MySQL, segue o padrão
abaixo:
jdbc:mysql://ip/nome_do_banco
Devemos substituir ip pelo IP do servidor e nome_do_banco pelo nome do banco de dados a ser
utilizado, o restante mantem o padrão.
Seguindo o exemplo da linha acima e tudo que foi dito até agora, seria possível rodar o exemplo abaixo
e receber uma conexão para um banco MySQL chamado exemplo, caso ele esteja rodando na mesma
máquina:
}
}
Repare que estamos deixando passar a SQLException, que é uma exception checked, lançada por
muitos dos métodos da API de JDBC. Numa aplicação real devemos utilizar try/catch nos lugares que
julgamos haver possibilidade de recuperar uma falha com o banco de dados. Também precisamos tomar
sempre cuidado para fechar todas as conexões que foram abertas.
Dica
É necessário carregar o driver MySQL na biblioteca.
Clique com botão direito nas bibliotecas >> Adicionar biblioteca, na lista escolha MySQL JDBC Driver.
4
Fábrica de Conexões
Abaixo segue exemplo de uma classe simples de conexão. Para efetuar teste com esta classe, crie um
novo projeto no NetBeans chamado Fabrica. Clique no menu Novo >> Novo Projeto, categoria Java e
projetos “Aplicativo a área de trabalho Java”.
Crie uma nova classe no seu projeto chamada Conexao, para isso clique com botão direito do mouse no
projeto principal escolha Novo >> Classe Java, ao solicitar o nome da classe digite Conexao, observe que
a primeira letra é maiuscula.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
Observe que existem 4 parametros para configurar, eles são: IP, NOME_DO_BANCO, USUARIO E SENHA.
con = DriverManager.getConnection("jdbc:mysql://IP/nome_do_banco","usuario","senha");
Conexao.Conectar();
5
Este método será executado normalmente na abertura do frame, já instanciando a variável con da
classe Conexao com as informações para conectar-se ao banco de dados.
A partir deste momento a variável con da classe Conexao está declarada contendo os dados de conexão.
Com a conexão pronta, necessitamos declarar uma SQL para executarmos no banco de dados.
Poderemos usar os comandos DML para modelar os dados no banco, como por exemplo:
INSERT,UPDATE e DELETE bem como o famoso SELECT.
1. Abaixo segue exemplo do comando para inserir diretamente no banco de dados sem uso de
classe de entidade. Para efetuar teste com este comando, crie um novo projeto no NetBeans
chamado Pagina5. Clique no menu Novo >> Novo Projeto, categoria Java e projetos “Aplicativo
a área de trabalho Java”.
2. Crie um novo Jframe, para isso execute um clique com botão direito do mouse sobre o projeto
Pagina5, Novo >> Formulário Jframe. Ao solicitar o nome do frame digita JFPagina5.
3. Adicione um botão (Button) no meio do frame, rotule-o como Inserir e adicione no evento
4
actionPerformed o código abaixo:
Cada interrogação no comando insert acima é um parametro que deve ser definido no
PreparedStatement com setString para String’s setInt, setFloat e assim por diante, no nosso exemplo
usaremos setString, pois os valores nome e email são deste tipo String. Não substitua as interrogações
do comando insert acima por valores, as interrogações serão substituídas por meio dos parâmetros
abaixo:
Por fim, uma chamada ao metodo execute() que serve para executar o comando SQL sem retornar
dados, isso significa que seu uso será geralmente para INSERT, UPDATE e DELETE.
stmt.execute();
Será necessário adicionar trecho para tratamento de erro por bloqueio com try-catch
4
Clique com botão direito do mouse sobre o componente escolha Eventos >> Action >> actionPerformed
6
Veja o exemplo abaixo, execução de comando insert no banco considerando classe conexão
explicada neste artigo. Crie um jFrame com um jButton, insira o código abaixo no evento
actionPerformed, conforme exemplo da pagina acima.
// conectando
Conexao.Conectar();
// cria um preparedStatement
String sql = "insert into contatos (nome,email) values (?,?)";
java.sql.PreparedStatement stmt = Conexao.con.prepareStatement(sql);
// preenche os valores
stmt.setString(1, "DOUGLAS");
stmt.setString(2, "dtybel@yahoo.com.br");
// executa
stmt.execute();
stmt.close();
System.out.println("Gravado!");
Conexao.con.close();
Será necessário adicionar trecho para tratamento de erro por bloqueio com try-catch.
Para realizar consultas, também utilizamos a interface PreparedStatement, de forma que o método
executeQuery retorna todos os dados de uma determinada consulta.
O objeto retornado é do tipo ResultSet que permite navegar por seus registros através do método
next etc. Esse método irá retornar false quando chegar ao fim da consulta, portanto é normalmente
utilizado para realizar um loop nos registros como no exemplo a seguir:
Será necessário adicionar trecho para tratamento de erro por bloqueio com try-catch.
7
Para retornar o valor de uma coluna no banco de dados basta chamar um dos métodos get do
ResultSet , dentre os quais, o mais comum: getString.
ResultSet rs = stmt.executeQuery();
CampoTexto.setText( rs.getString(“nome_do_campo_da_tabela_do_tipo_String”) );
CampoInteiro.setText( rs.getInt(“nome_do_campo_da_tabela_do_tipo_Inteiro”) );
CampoFloat.setText( rs.getFloat(“nome_do_campo_da_tabela_do_tipo_Real”) );
Este código não é muito diferente de um código em linguagem C, isto acontece porque a linguagem Java
foi criada com base na linguagem C possuindo quase todas as palavras reservadas dela e um conceito
que deixa muitos desenvolvedores descontentes: o case-sensitive. Isso mesmo, Java é case-sensitive,
portanto maiúsculas são diferentes de minúsculas, a é diferente de A .
8
PRATICAR
5
No NetBeans clique no menu Novo >> Novo Projeto, categoria Java e projetos “Aplicativo a área de trabalho Java”.
6
No NetBeans clique com botão direito do mouse sobre o projeto, Novo >> Formulário Jframe. Ao solicitar o nome do
frame digite nome desejado.
9
A classe JTable é utilizada para vizualizar dados em grid no Swing é um dos componentes mais
complexos desse pacote. Alias o JTable possui até um pacote especial, que contém diversas classes para
7
sua utilização: javax.swing.table. A JTable é um componente MVC : o seu trabalho é dividido em 3
partes: Model: É a parte que cuida dos dados, quem controla e distribui os dados na jtable. É
implementado pela interface TableModel ( AbstractTableModel e DefaultTableModel ). Ela é
responsavel por fornecedor os dados para a tabela, a qual requisitará os dados atraves do método
getValueAt, informando a linha e a coluna. Este método retorna um Object, ou seja, um objeto
qualquer, que pode ser um Integer, uma String ou outra classe que você tenha implementado.
Componente jTable
Componente jButton
jTable1 1
O importante é observar as colunas (Código, Nome, Telefone), são estas colunas que usaremos como
base para iniciar a população de dados.
Para reproduziar a tabela acima, clique com botão direito no JTable e selecione “Conteúdo da tabela”
7
Model-view-controller (MVC) é um padrão de arquitetura de software que visa a separar a lógica de negócio da lógica de
apresentação, permitindo o desenvolvimento, teste e manutenção isolado de ambos.
10
Vamos neste momento definir uma variável para armazenar a estrutura atual da tabela:
modelo.addRow
3. modelo.addRow(new Object[]{
“0001”,
“Douglas”,
“2799379892”
});
4. jTable1.setModel(modelo);
Esse comando adicionará uma nova linha com o conteúdo acima na tabela.
11
Crie um jFrame com um Jbutton, adicione o conteúdo abaixo no evento actionPerformed do botão:
jTable1.setModel(modelo);
12
PRATICAR
7. Criar novo Formulário jFrame chamado jFContato, conforme pagina: 9, não será necessário
menus;
8. O código do botão Consultar, deve: Conectar e popular o JTable, conforme exemplo na pagina:
11
13
Rótulo Nome
Código codigojTextField
Nome pessoajTextField
Telefone telefonejTextField
Cadastrar cadastrarjButton
try {
// TODO add your handling code here:
// conectando
Conexao.Conectar();
// cria um preparedStatement
String sql = "insert into pessoas (pessoa,telefone) values (?,?)";
PreparedStatement stmt = Conexao.con.prepareStatement(sql);
// preenche os valores
stmt.setString(1, pessoajTextField.getText());
stmt.setString(2, telefonejTextField.getText());
// executa
stmt.execute();
stmt.close();
System.out.println("Gravado!");
Conexao.con.close();
Para realizarmos o cadastro acima, colocamos o código DML diretamente no botão cadastrar, o que não
é permitido na programação orientada a objeto.
Entendemos que o insert acima representa o método “Cadastrar contato”, isto significa que é um
método chamado setCadastar() da classe de contato.
Contatos
codPessoa
pessoa
telefone
setCadastrar()
setConsultar()
Logicamente existem outros métodos na classe contatos, contudo focaremos na função setCadastrar();
Para criar uma classe chamada Contratos, clique com botão direito no pacote da aplicação e escolha
opção: Novo >> Classe Java
package desktopapplication1;
No próximo passo precisamos criar os métodos get e set publicos. Para realizar esta tarefa de forma
automática, clique no final da classe antes da “chave }” e pressione as teclas [ALT] e [INSERT] .
Escolha Getter e setter, aparecerá uma nova janela com as opções abaixo:
Para criarmos um método que contenha os comandos para cadastrar um contato, é necessário observar
três pontos importantes:
1. Visibilidade
2. Retorno
3. Parametros
O primeiro ponto trata-se de visibilidade, pois não adinhanta criarmos um método que os frames não
possão acessar, deste modo a visibilidade do método será public, assim sua visibilidade será publica
para todo o projeto.
O segundo ponto trata-se do retorno desejado após execução do comando. Normalmente para
comandos de definição como o setCadastrar , setAlterar ou setExcluir, não existe retorno, pois apenas
queremos alterar o conteúdo da tabela e não precisamos de retorno para mostrar para o usuário, deste
modo o retorno correspondente a nulo será void.
O terceiro e ultimo ponto, trata-se de parâmetros que possamos precisar para execução o comando. Os
parametros podem ser repassados atraves da própria função como exemplo abaixo:
Declaração:
setCadastar(int Codigo);
Uso:
setCadastrar( 2 );
Com este uso o número 2 estará disponível dentro da classe e do método setCadastrar na variável
Codigo.
Por outro lado e até mais útil, podemos usar os próprios atributos da classe como parâmetros, pois eles
já são visíveis e acessáveis de dentro do método sem a necessidade de repassá-los, apenas é necessário
atribuir valor antes de executar o método, como exemplo abaixo:
A variável codPessoa estará presente dentro da função setCadastrar com o valor 2, assim podemos
utilizá-lo para inserir em nosso comando.
Usaremos então o mesmo código utilizado no botão cadastar, contudo faremos algumas alterações:
Insira o código abaixo no método setCadastrar que você acabou de criar na classe Contatos:
Observe que duas linhas ainda constam erros, pois não existe os componentes pessoajTextField e
telefonejTextField na classe Contatos para pegar os valores, assim os mesmos devem ser passados para
classe antes mesmo da execução deste método, como no exemplo a seguir:
Devemos alterar as linhas erradas pelos próprios métodos, já que os valores foram atribuídos antes da
execução do método.
try {
// cria um preparedStatement
String sql = "insert into pessoas (pessoa,telefone) values (?,?)";
PreparedStatement stmt = Conexao.con.prepareStatement(sql);
// preenche os valores
stmt.setString(1, getPessoa() );
stmt.setString(2, getTelefone() );
// executa
stmt.execute();
stmt.close();
System.out.println("Gravado!");
Conexao.con.close();
} catch (SQLException ex) {
Logger.getLogger(Contatos.class.getName()).log(Level.SEVERE, null, ex);
}
19
8
O código do botão cadastrar usando as técnicas OO , será sempre mais curto, pois todo o código estará
na classe, assim em todo o projeto, toda vez que fizer necessário o uso do cadastro de contato, não será
necessário digitar todo o código e sim o método chamado a partir da classe Contatos, conforme abaixo:
Conexao.Conectar();
Contatos oContato = new Contatos();
oContato.setPessoa( pessoajTextField.getText() );
oContato.setTelefone( telefonejTextField.getText() );
oContato.setCadastrar();
Obs.: Não se faz necessário a conexão toda vez que for executar um método, basta conectar na abertura
do frame por exemplo.
8
A orientação a objetos é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e
interação entre diversas unidades de software chamadas de objetos.
Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programação. De fato, o paradigma "orientação
a objeto", tem bases conceituais e origem no campo de estudo da cognição, que influenciou a área de inteligência artificial e da
linguística, no campo da abstração de conceitos do mundo real
20
PRATICAR
Para criarmos um método que contenha os comandos para consultar um contato, é necessário observar
três pontos simples:
1. Visibilidade
2. Retorno
3. Parametros
O primeiro ponto trata-se de visibilidade, pois não adinhanta criarmos um método que os frames não
possão acessar, deste modo a visibilidade do método será public, pois sua visibilidade será publica para
todo o projeto.
O segundo ponto trata-se do retorno desejado após execução do comando. Normalmente para
comandos de consulta como o getConsultar, getEmitir ou getID, existem retornos de diversos tipos, mas
normalmente gostariamos de tratar todo o retorno em forma de tabela. O retorno que representará a
tabela em sua igualdade será o tipo ResultSet.
O terceiro e ultimo ponto trata-se de parâmetros que possamos precisar para execução do comando. Os
parametros podem ser repassados atraves da própria função no caso da consulta não será necessário.
Conforme já visto no método setCadastrar, a única diferença é que o retorno da função não é nulo ou
void por assim dizer, observe abaixo a declaração do método:
A linha em destaque amarela acima, refere ao retorno da função com a variável resultSet declarada
para armazanar o resultado do banco de dados.
Obs.: Lembre-se de deixar o tratamento de exceção com uma throws chamada SQLException, conforme
a figura abaixo:
22
return resultSet;
}
try {
// TODO add your handling code here:
Conexao.Conectar();
Contatos oContato = new Contatos();
ResultSet resultSet = oContato.getConsultar();
DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
modelo.setNumRows(0);
while (resultSet.next()) {
modelo.addRow(new Object[]{resultSet.getString("codPessoa"), resultSet.getString("pessoa"),
resultSet.getString("telefone")});
}
jTable1.setModel(modelo);
PRATICAR