Você está na página 1de 14

Programando com Java

Artigo http://mballem.wordpress.com/

Utilizando Swing com Banco de Dados


Autor
Marcio Ballem: formado em Sistemas de Informao e possui certificao Oracle Certified Professional, Java
SE 6 Programmer. Trabalhou profissionalmente com desenvolvimento em Delphi 7 e Java JEE.
Introduo
Muitos iniciantes em Java instalam, geralmente o Netbeans, e montam uma interface atravs dos
componentes visuais da IDE. No apenas o Netbeans que oferece esse recurso, o Eclipse, o Intellij Idea entre
outros tambm oferecem.
Com a interface montada eles querem fazer a ligao entre a interface e o banco de dados. Bom, ai que
surge a dvida. Como fazer?
Neste tutorial irei exemplificar de maneira bem simples, mas til, de como resolver este problema. Iremos
utilizar conexo JDBC com banco de dados Mysql e a interface ser feita no brao, como se costuma dizer
quando no utilizamos uma IDE para esse fim.
claro que quem quiser utilizar uma IDE para construir sua interface, pode faz-lo sem problemas, at por
que o intuito desse tutorial ser como enviar e receber os dados do banco de dados por uma interface grfica e
no como criar uma interface grfica.
Tambm tentarei explicar e exemplificar como funciona o padro Model View Controller ou MVC como
costuma ser chamado.

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:

Model: contm as classes Contato, ContatoDao, GenericDao e ConnectionDataBase

Controller: contm a classe ContatoController

View: contm a classe ContatoFrame

O processo funciona assim:


1.

O usurio clica em um boto na interface (View). Esse boto possui um evento que faz uma
chamada ao Controller

2.

O Controller atende essa chamada e ento se comunica com o Model

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

CREATE TABLE IF NOT EXISTS `contatos` (


`ID` BIGINT( 20 ) NOT NULL AUTO_INCREMENT ,
`NOME` VARCHAR( 50 ) NOT NULL UNIQUE ,
`APELIDO` VARCHAR( 15 ) NOT NULL ,
`DATA_NASCIMENTO` DATE NOT NULL ,
PRIMARY KEY ( `ID` )
)

4. Classe de conexo JDBC


Vamos criar a classe de conexo JDBC, conforme listagem 2.
Listagem 2. Classe ConnectionDataBase

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

public static Connection getConnection() {


System.out.println("Conectando ao Banco de Dados");
try {
Class.forName(DRIVER_CLASS);
return DriverManager.getConnection(URL_MYSQL, USER, PASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return null;
}
}
Para quem instalou o WampServer o usurio root e a senha vazia por padro. Quem utilizou outra
instalao do Mysql, deve alterar para seu usurio e sua senha.
Criamos um mtodo chamado getConnection() que retorna um objeto de conexo com o banco de dados.
Neste mtodo chamamos o mtodo esttico getConnection(...) da classe DriverMenager, pelo qual passamos
as configuraes para a conexo.
Quando precisarmos de uma conexo como o banco de dados, vamos apenas fazer uma chamada ao
mtodo criado. Esta classe poder ser utilizada com qualquer banco de dados, basta apenas alterar os
parmetros DRIVER_CLASS, URL_MYSQL, USER, PASS e adicionar no projeto o driver JDBC referente ao
banco de dados usado.

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;

public abstract class GenericDao {


private Connection connection;
protected GenericDao() {
this.connection = ConnectionDataBase.getConnection();
}
protected Connection getConnection() {
return connection;
}
protected void save(String insertSql, Object... parametros) throws
SQLException {
PreparedStatement pstmt = getConnection().prepareStatement(insertSql);
for (int i = 0; i < parametros.length; i++) {
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
pstmt.close();
}
protected void update(String updateSql, Object id, Object... parametros)
throws SQLException {
PreparedStatement pstmt = getConnection().prepareStatement(updateSql);
for (int i = 0; i < parametros.length; i++) {
pstmt.setObject(i+1, parametros[i]);
}
pstmt.setObject(parametros.length + 1, id);
pstmt.execute();
pstmt.close();
}
protected void delete(String deleteSql, Object... parametros) throws
SQLException {
PreparedStatement pstmt = getConnection().prepareStatement(deleteSql);
for (int i = 0; i < parametros.length; i++) {
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
pstmt.close();
}
}

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;

public class ContatoDao extends GenericDao {


public void salvar(Contato contato) throws SQLException {
String insert = "INSERT INTO CONTATOS(nome, apelido, data_nascimento)
VALUES(?,?,?)";
save(insert, contato.getNome(), contato.getApelido(),
contato.getDtNascimento());
}
public void alterar(Contato contato) throws SQLException {
String update = "UPDATE CONTATOS " +
"SET nome = ?, apelido = ?, data_nascimento = ? " +
"WHERE id = ?";

update(update, contato.getId(), contato.getNome(), contato.getApelido(),


contato.getDtNascimento());
}
public void excluir(long id) throws SQLException {
String delete = "DELETE FROM CONTATOS WHERE id = ?";
delete(delete, id);
}
public List<Contato> findContatos() throws SQLException {
List<Contato> contatos = new ArrayList<Contato>();
String select = "SELECT * FROM CONTATOS";
PreparedStatement stmt = getConnection().prepareStatement(select);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Contato contato = new Contato();
contato.setId(rs.getLong("id"));
contato.setNome(rs.getString("nome"));
contato.setApelido(rs.getString("apelido"));
contato.setDtNascimento(rs.getDate("data_nascimento"));
contatos.add(contato);
}
rs.close();
stmt.close();
return contatos;
}
public Contato findByName(String nome) throws SQLException {
String select = "SELECT * FROM CONTATOS WHERE nome = ?";
Contato contato = null;
PreparedStatement stmt = getConnection().prepareStatement(select);
stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
contato = new Contato();
contato.setId(rs.getLong("id"));
contato.setNome(rs.getString("nome"));
contato.setApelido(rs.getString("apelido"));
contato.setDtNascimento(rs.getDate("data_nascimento"));
}
rs.close();
stmt.close();
return contato;
}
Veja que utilizamos herana nesta classe, herdando os mtodos criados na classe GenericDao. Nossos
mtodos salvar(), alterar() e excluir() possuem a criao do SQL que ser executado no banco de dados e uma
chamada ao mtodo da classe GenericDao, passando para ele o SQL e os demais parmetros.
Os mtodos salvar(), alterar() e excluir(), sero os mtodos acessados pela classe ContatoController para
manipulao com o banco de dados. Ainda criamos mais dois mtodos, um que retorna atravs de um select

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;

public class ContatoController {


private Date formatarData(String data) throws ParseException {
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
return new Date( formatter.parse(data).getTime() );
}
public void salvar(String nome, String apelido, String dtNascimento) throws
SQLException, ParseException {
Contato contato = new Contato();
contato.setNome(nome);
contato.setApelido(apelido);
contato.setDtNascimento(formatarData(dtNascimento));
new ContatoDao().salvar(contato);
}
public void alterar(long id, String nome, String apelido, String dtNascimento)
throws ParseException, SQLException {
Contato contato = new Contato();
contato.setId(id);
contato.setNome(nome);
contato.setApelido(apelido);
contato.setDtNascimento(formatarData(dtNascimento));
new ContatoDao().alterar(contato);
}
public List<Contato> listaContatos() {
ContatoDao dao = new ContatoDao();
try {
return dao.findContatos();

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

Figura 1 - Interface Contatos 1

Listagem 7. Classe ContatoFrame

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;

public class ContatoFrame extends JFrame {


private
private
private
private

JLabel lbNome, lbApelido, lbDtNascimento;


JTextField txtNome, txtApelido, txtDtNascimento, txtLocalizar;
JButton btnSalvar, btnAlterar, btnExcluir, btnClear, btnLocalizar;
JButton btnPrimeiro, btnProximo, btnAnterior, btnUltimo;

private List<Contato> contatoList = new ContatoController().listaContatos();


private int registroAtual = 0;
public ContatoFrame() {
super("Contatos");
Container tela = getContentPane();
setLayout(null);
lbNome = new JLabel("Nome");
lbApelido = new JLabel("Apelido");
lbDtNascimento = new JLabel("Data de Nascimento(dd/mm/aaaa)");
lbNome.setBounds(10, 10, 240, 15);
lbApelido.setBounds(10, 50, 240, 15);
lbDtNascimento.setBounds(10, 90, 240, 15);
lbNome.setForeground(Color.BLACK);
lbApelido.setForeground(Color.BLACK);
lbDtNascimento.setForeground(Color.BLACK);
lbNome.setFont(new Font("Courier New", Font.BOLD, 14));
lbApelido.setFont(new Font("Courier New", Font.BOLD, 14));
lbDtNascimento.setFont(new Font("Courier New", Font.BOLD, 14));
tela.add(lbNome);
tela.add(lbApelido);
tela.add(lbDtNascimento);
txtNome = new JTextField();
txtApelido = new JTextField();
txtDtNascimento = new JTextField();
txtNome.setBounds(10, 25, 265, 20);
txtApelido.setBounds(10, 65, 265, 20);
txtDtNascimento.setBounds(10, 105, 265, 20);
tela.add(txtNome);
tela.add(txtApelido);
tela.add(txtDtNascimento);
btnSalvar = new JButton("Salvar");

btnAlterar = new JButton("Alterar");


btnExcluir = new JButton("Excluir");
btnClear = new JButton("Limpar");
btnPrimeiro = new JButton("|<");
btnAnterior = new JButton("<<");
btnProximo = new JButton(">>");
btnUltimo = new JButton(">|");
btnSalvar.setBounds(280, 25, 80, 20);
btnAlterar.setBounds(280, 65, 80, 20);
btnExcluir.setBounds(280, 105, 80, 20);
tela.add(btnSalvar);
tela.add(btnAlterar);
tela.add(btnExcluir);
btnPrimeiro.setBounds(10, 135, 50, 20);
btnAnterior.setBounds(60, 135, 50, 20);
btnClear.setBounds(110, 135, 75, 20);
btnProximo.setBounds(185, 135, 50, 20);
btnUltimo.setBounds(235, 135, 50, 20);
tela.add(btnPrimeiro);
tela.add(btnAnterior);
tela.add(btnClear);
tela.add(btnProximo);
tela.add(btnUltimo);
JLabel lbLocalizar = new JLabel("Localizar por nome");
lbLocalizar.setBounds(10, 160, 220, 20);
txtLocalizar = new JTextField();
txtLocalizar.setBounds(10, 180, 220, 20);
btnLocalizar = new JButton("Ir");
btnLocalizar.setBounds(230, 180, 55, 20);
tela.add(lbLocalizar);
tela.add(txtLocalizar);
tela.add(btnLocalizar);
setSize(400, 250);
setVisible(true);
setLocationRelativeTo(null);
btnSalvar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickSalvar();
}
}
);
btnAlterar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickAlterar();
}

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

private void onClickUltimo() {


registroAtual = contatoList.size() - 1;
getValores(registroAtual);
}
private void onClickProximo() {
if (registroAtual != contatoList.size() - 1) {
getValores(++registroAtual);
}
}
private void onClickAnterior() {
if (registroAtual != 0) {
getValores(--registroAtual);
}
}
private void onClickPrimeiro() {
registroAtual = 0;
getValores(registroAtual);
}
private void getValores(int index) {
if (index <= contatoList.size() - 1) {
Contato contatoAtual = contatoList.get(index);
txtNome.setText(contatoAtual.getNome());
txtApelido.setText(contatoAtual.getApelido());
txtDtNascimento.setText(new
SimpleDateFormat("dd/MM/yyyy").format(contatoAtual.getDtNascimento()));
}
}
private void onClickAlterar() {
ContatoController cc = new ContatoController();
long id = contatoList.get(registroAtual).getId();
try {
cc.alterar(id, txtNome.getText(), txtApelido.getText(),
txtDtNascimento.getText());
JOptionPane.showMessageDialog(this, "Contato alterado com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel alterar
contato!\n" + e.getLocalizedMessage());
} catch (ParseException e) {
JOptionPane.showMessageDialog(this, "Data possui formato invlido!\n"
+ e.getLocalizedMessage());
}
}
private void onClickSalvar() {
ContatoController cc = new ContatoController();
try {
cc.salvar(txtNome.getText(), txtApelido.getText(),
txtDtNascimento.getText());
JOptionPane.showMessageDialog(this, "Contato salvo com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();

} 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

Model View Controller http://pt.wikipedia.org/wiki/MVC.

MySql http://www.mysql.com/

JDBC artigo Guj http://www.guj.com.br/articles/7

JDBC tutorial Oracle http://download.oracle.com/javase/tutorial/jdbc/index.html

Netbeans http://netbeans.org

Eclipse http://www.eclipse.org/downloads/

Intellij Idea http://www.jetbrains.com/idea/download/

Você também pode gostar