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. 2. 3. O usurio clica em um boto na interface (View). Esse boto possui um evento que faz uma chamada ao Controller O Controller atende essa chamada e ento se comunica com o Model 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