Escolar Documentos
Profissional Documentos
Cultura Documentos
Artigo JDBC Swing Mysql
Artigo JDBC Swing Mysql
Artigo http://mballem.wordpress.com/
1. Arquivos necessrios
Como a conexo ser por JDBC, precisaremos do driver JDBC do Mysql, e tambm do Mysql instalado na
PC. Quem no quiser utilizar o Mysql, fique a vontade de utilizar qualquer outro gerenciador de banco de dados
ou mesmo um banco de dados do tipo standalone como Derby ou o HsqlDB (veja mais sobre eles em:
http://mballem.wordpress.com/2011/02/02/jdbc-com-banco-de-dados-standalone/).
Para baixar o Driver JDBC do Mysql, acesse: http://www.mysql.com/downloads/connector/j/. Aps baix-lo
adicione o arquivo mysql-connector-java-5.1.15-bin no projeto.
Para quem no tem o MySql instalado ainda, eu sugiro baixar o WampServer que vem com uma verso do
MySql e possui uma instalao bem mais rpida e simples, acesse http://www.wampserver.com/en/
Quem no quiser o WampServer, pode baixar o MySql em http://www.mysql.com/downloads/
2. Padro MVC
O objetivo do Model View Controller (MVC) separar os dados ou lgicas de negcios (Model) da interface
do usurio (View) e do fluxo da aplicao (Control). Utilizando este padro seria possvel reutilizar boa parte da
aplicao para a comunicao com outras interfaces e tambm torna mais fcil a manuteno na aplicao.
Imagine a situao em que voc cria uma aplicao em Swing sem a utilizao do padro MVC. Na classe
que contm a interface voc faz as chamadas a banco atravs de select, insert e demais mtodos que se
comunicam com o banco de dados. Ok, sua aplicao vai funcionar perfeitamente como voc queria.
Agora imagine que voc precisa que essa aplicao seja tambm criada para a Web. Bom, voc ter muito
trabalho, isto por que est tudo misturado na classe de interface. Na mesma classe voc fez as chamadas a
banco de dados e as regras de negcio. Agora ter que refazer tudo isso para criar a aplicao no formato
Web.
Caso no primeiro projeto voc tivesse usado o padro MVC, no precisaria refazer tudo, apenas criaria uma
nova interface no padro Web e a comunicaria com o seu controller. claro que no controller teria que mudar
algumas coisas, por que o padro Web trabalha com requisies e tudo mais, mas teria bem menos trabalho.
Esse trabalho seria bem menor tambm no caso de voc simplesmente querer atualizar a sua interface em
Swing para um modelo diferente. Mudaria apenas a interface, os mtodos principais da aplicao no
precisariam ser modificados.
Na aplicao que criaremos a seguir, o modelo MVC se aplica e pode ser visto mais ou menos assim:
O usurio clica em um boto na interface (View). Esse boto possui um evento que faz uma
chamada ao Controller
2.
3.
O Model executa, por exemplo, um acesso ao banco de dados, como uma consulta, e ento retorna
uma resposta ao Controller que retorna uma resposta a View
possvel na View o acesso ao Model, como instanciar uma classe de entidade para ter acesso aos seus
mtodos, mas nunca as classes que possuem relacionamentos com o banco de dados. No exemplo deste
tutorial foram passados para o Controller parmetros tipo String, mas poderiam ser os objetos do tipo
Contato (Entidade Contato).
3. Tabela contatos
Vamos criar a tabela Contatos, para isso, rode o script da listagem 1. Observe que estamos utilizando auto
incremento para o id da tabela, assim quem se preocupa com a criao dos ids o gerenciador do banco de
dados.
Listagem 1. Contatos.sql
package br.mb.tutorialJdbcsSwingMysql.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionDataBase {
private
private
private
private
static
static
static
static
final
final
final
final
String
String
String
String
URL_MYSQL = "jdbc:mysql://localhost/agenda";
DRIVER_CLASS = "com.mysql.jdbc.Driver";
USER = "root";
PASS = "";
5. Classe GenericDao
Vamos criar uma classe genrica para os mtodos insert, update e delete, veja na listagem 3.
Listagem 3. Classe GenericDao
package br.mb.tutorialJdbcSwingMysql.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
Esta classe poder ser usada por qualquer outra classe que faa acesso ao banco de dados. A vantagem
de criar uma classe desse tipo que no precisamos criar estes trs mtodos em cada classe que os
utilizarmos, precisamos apenas passar os parmetros necessrios para as aes com o banco de dados.
Veja que criamos um atributo connection, do tipo Connection, que recebe atravs do construtor da classe
uma conexo com o banco de dados sempre que a classe dao for instanciada. Essa conexo recebida vem
como retorno da classe ConnectionDataBase.
Os mtodos so protected para que apenas as classes que herdam GenericDao possoam ter acesso a eles.
O mtodo save() recebe dois parametros, o primeiro o sql que contm o insert e o segundo uma lista de
argumentos que pode passar vrios parmetros de uma s vez, algo muito parecido com um array, que
conter o valor dos campos do insert. O mtodo update() possui um parmetro a mais, que ser o id da coluna
que iremos executar o update.
6. Classe Contato
Nossa classe contato ter como atributos os campos da tabela Contatos. Para isso, crie a classe como na
listagem 4 e gere os mtodos getters e setters. Veja que ela foi criada no pacote model, esse model no o
mesmo Model do padro MVC, um pacote onde se costuma colocar as classes de entidades.
Listagem 4. Classe Contato
package br.mb.tutorialJdbcSwingMysql.model;
import java.sql.Date;
public class Contato {
private Long id;
private String nome;
private String apelido;
private Date dtNascimento;
//gere os mtodos getters and setters
}
7. Classe ContatoDao
Criamos a classe GenericDao para ser herdadas pelos demais daos, assim, vamos agora criar a classe
ContatoDao, onde tero os mtodos mais especficos da classe. Veja na listagem 5.
Listagem 5. Classe ContatoDao
package br.mb.tutorialJdbcSwingMysql.dao;
import br.mb.tutorialJdbcSwingMysql.model.Contato;
import
import
import
import
import
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
java.util.ArrayList;
java.util.List;
uma lista com todos os contatos cadastrados no banco de dados e um que realizara um select pela coluna
nome da tabela contatos do banco de dados. Podem ser criadas mais consultas, mas para este tutorial vamos
utilizar apenas estes dois.
8. Classe ContatoController
A classe ContatoController ser o relacionamento entre o banco de dados e a interface com o usurios,
assim, no iremos misturar na classe da interface mtodos referentes ao banco de dados e a regras de
negcios. Crie a classe conforme a listagem 6.
Listagem 6. Classe ContatoController
package br.mb.tutorialJdbcSwingMysql.controller;
import br.mb.tutorialJdbcSwingMysql.dao.ContatoDao;
import br.mb.tutorialJdbcSwingMysql.model.Contato;
import
import
import
import
import
import
import
javax.swing.*;
java.sql.Date;
java.sql.SQLException;
java.text.DateFormat;
java.text.ParseException;
java.text.SimpleDateFormat;
java.util.List;
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Problemas ao localizar contato\n"
+ e.getLocalizedMessage());
}
return null;
}
public void excluir(long id) throws SQLException {
new ContatoDao().excluir(id);
}
public Contato buscaContatoPorNome(String nome) throws SQLException {
ContatoDao dao = new ContatoDao();
return dao.findByName(nome);
}
}
A classe ContatoController faz a comunicao entre o banco de dados e a interface, utilizamos aqui o
modelo conhecido como MVC(Model View Controller), onde separamos regras de negcios e interface. Criamos
aqui um mtodo para manipular a data. Os mtodos desta classe sero chamados pela interface, e faro a
chamada aos mtodos das classes daos para ento retornar para a interface o resultado.
9. Classe ContatoFrame
Agora criaremos a nossa classe de interface com o usurio. Quem for criar a interface com auxilio de uma
IDE qualquer, tente apenas utilizar as mesmas nomenclaturas dos atributos e mtodos para evitar problemas.
O resultado final ser uma interface como a da figura 1.
package br.mb.tutorialJdbcSwingMysql.frame;
import br.mb.tutorialJdbcSwingMysql.controller.ContatoController;
import br.mb.tutorialJdbcSwingMysql.model.Contato;
import
import
import
import
import
import
import
import
javax.swing.*;
java.awt.*;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.sql.SQLException;
java.text.ParseException;
java.text.SimpleDateFormat;
java.util.List;
}
);
btnExcluir.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickExcluir();
}
}
);
btnClear.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearFields();
registroAtual = 0;
}
}
);
btnLocalizar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickLocalizar();
}
}
);
btnPrimeiro.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickPrimeiro();
}
}
);
btnAnterior.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickAnterior();
}
}
);
btnProximo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickProximo();
}
}
);
btnUltimo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickUltimo();
}
}
);
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel salvar
contato!\n" + e.getLocalizedMessage());
} catch (ParseException e) {
JOptionPane.showMessageDialog(this, "Data possui formato invlido!\n"
+ e.getLocalizedMessage());
}
}
private void onClickExcluir() {
ContatoController cc = new ContatoController();
long id = contatoList.get(registroAtual).getId();
try {
cc.excluir(id);
JOptionPane.showMessageDialog(this, "Contato excluido com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel excluir o
contato!\n" + e.getLocalizedMessage());
}
}
private void onClickLocalizar() {
ContatoController cc = new ContatoController();
try {
Contato c = cc.buscaContatoPorNome(txtLocalizar.getText());
txtNome.setText(c.getNome());
txtApelido.setText(c.getApelido());
txtDtNascimento.setText(new
SimpleDateFormat("dd/MM/yyyy").format(c.getDtNascimento()));
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Ocorreu um erro, tente
novamente!\n" + e.getLocalizedMessage());
} catch (NullPointerException e){
JOptionPane.showMessageDialog(this, "Contato no localizdo ou no
existe!\n" + e.getLocalizedMessage());
}
}
private void clearFields() {
txtNome.setText("");
txtApelido.setText("");
txtDtNascimento.setText("");
txtLocalizar.setText("");
}
public static void main(String[] args) {
ContatoFrame frame = new ContatoFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Nesta classe temos a criao da interface com usurio e os mtodos que se comunicam com o controller
para enviar ou receber dos dados do banco de dados. Alm dos atributos referentes aos componentes da
interface, foram criados mais dois atributos, o contatoList e o registroAtual. O contatoList uma lista que ir
guarda a consulta do banco de dados para a visualizao de todos os contatos cadastrados. O registroAtual ir
guaradar a posio atual do regitro na lista, que ser til para a navegao entre os registros.
Os mtodos onClickUltimo(), onClickProximo(), onClickAnterior() e onClickPrimeiro() enviaro para o mtodo
getValores() a posio atual na lista, para ento os campos do formulrio serem preenchidos com estes
valores. Esta navegao feita toda dentro da lista, assim poupa o trabalho de ficar abrindo e fechando a
conexo com o banco de dados a todo momento, o que considerado um alto custo para uma apliao.
Os mtodos onClickSalvar(), onClickExcluir() e onClickAlterar(), passam por parmetros os dados
necessrios para os mtodos no controller interagirem com o banco de dados.
O mtodo onClickLocalizar() ir fazer uma consulta atravs do parmetro nome. O parmetro deve ser
digitado no campo especifico e o clique no boto Ir faz a chamada ao mtodo onClickLocalizar() que se
comunica com o controller. O controller faz a chamada aos daos que retorna o resultado da consuta.
O mtodo clearFields() serve apenas para limpar os campos quando estiverem preenchidos com dados.
Sobre a utilizao do padro MVC, por exemplo, no mtodo onClickSalvar() poderia ao invs de enviar 3
parmetros do tipo String, um unico parmetro do tipo Contato. Assim, ao invs de criar o objeto contato no
controller como foi feito, criariamos dentro do mtodo onClickSalvar().
Concluso
Este tutorial exemplificou de forma simples como utilizar SWING com Banco de Dados. Tambm
exemplificou como utilizar o padro MVC.
Agora que voc j sabe como criar os eventos com o banco de dados atravs da interface, experimente
criar outras tabelas no banco de dados e outras interfaces para testar o que aprendeu at aqui. Lembre-se,
para cada tabela criada, crie uma nova entidade, um novo dao especifico e um novo controller.
Saiba mais
MySql http://www.mysql.com/
Netbeans http://netbeans.org
Eclipse http://www.eclipse.org/downloads/