Você está na página 1de 13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

5. Lendo, Inserindo e Atualizando dados


A manipulao do banco de dados discutida neste tpico. Ser discutido de forma simples como inserir novos
registros, alterar, excluir, procurar e listar.
O primeiro programa o principal chamado de ExecutarCadastroCliente.java listado abaixo. Apenas executa a
classe CadastroCliente exibindo a tela conforme figura 5.1.
1 import java.awt.event.*;
2
3 class ExecutarCadastroCliente
4{
5 public static void main( String args[] )
6{
7 CadastroCliente app = new CadastroCliente();
8
9 app.addWindowListener(
10 new WindowAdapter() {
11 public void windowClosing( WindowEvent e )
12 {
13 System.exit( 0 );
14 }
15 }
16 );
17 }}

facape.br/jocelio/p3//atualiza.html

1/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

figura 5.1

A classe CadastroCliente.java contem os botes principais para executar incluso, alterao, excluso, procurar e
listar dados a partir do banco de dados. Est listada abaixo.
1 // Inserting into, updating and searching through a database
2 import java.sql.*;
3 import java.awt.*;
4 import java.awt.event.*;
5 import javax.swing.*;
6
7 public class CadastroCliente extends JFrame {
8 private ControlPanel controls;
9 private ScrollingPanel scrollArea;
10 private JTextArea output;
11 private String url;
12 private String username ;
13 private String password ;
14 private Connection connect;
15 private JScrollPane textpane;
16
17 public CadastroCliente()
18 {
19 super( "Aplicacao Banco de Dados - Cadastro de Clientes" );
20
21 Container c = getContentPane();
22
23 // Start screen layout
24 scrollArea = new ScrollingPanel();
25 output = new JTextArea( 6, 30 );
26 c.setLayout( new BorderLayout() );
27 c.add( new JScrollPane( scrollArea ),
28 BorderLayout.CENTER );
29 textpane = new JScrollPane( output );
30 c.add( textpane, BorderLayout.SOUTH );
31
32 // Set up database connection
33 try {
34 url = "jdbc:odbc:Empresa";
35 username = "anonimo";
36 password = "convidado";
37
38 Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
39 connect = DriverManager.getConnection( url, username, password );
40 output.append( "Conectado com sucesso\n" );
41 }
42 catch ( ClassNotFoundException cnfex ) {
43 // process ClassNotFoundExceptions here
44 cnfex.printStackTrace();
45 output.append( "Conexao nao efetivada\n" +
facape.br/jocelio/p3//atualiza.html

2/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

46 cnfex.toString() );
47 }
48 catch ( SQLException sqlex ) {
49 // process SQLExceptions here
50 sqlex.printStackTrace();
51 output.append( "Conexao nao efetivada\n" +
52 sqlex.toString() );
53 }
54 catch ( Exception ex ) {
55 // process remaining Exceptions here
56 ex.printStackTrace();
57 output.append( ex.toString() );
58 }
59
60 // Complete screen layout
61 controls =
62 new ControlPanel( connect, scrollArea, output);
63 c.add( controls, BorderLayout.NORTH );
64
65 setSize( 700, 500 );
66 show();
67 }
68
69
70 }
Esta classe CadastroCliente (definida na linha 7) utiliza um objeto ControlPanel e um objeto ScrollingPanel para
a GUI do programa. A linha 39 estabelece a conexo com o banco de dados. Classes separadas so definidas pra
tratar eventos de cada um dos 7 botes na interface com o usurio.
A classe AdicionandoRegistro.java est listada abaixo.
1 // Class AddRecord definition
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.sql.*;
5 import javax.swing.*;
6
7 public class AdicionandoRegistro implements ActionListener {
8 private ScrollingPanel fields;
9 private JTextArea output;
10 private Connection connection;
11
12 public AdicionandoRegistro( Connection c, ScrollingPanel f,
13 JTextArea o )
14 {
15 connection = c;
16 fields = f;
17 output = o;
18 }
19
20 public void actionPerformed( ActionEvent e )
facape.br/jocelio/p3//atualiza.html

3/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

21 {
22 try {
23 Statement statement = connection.createStatement();
24
25 if (( !fields.clcdesc.getText().equals( "" ) ) &&
26 !fields.clyrend.getText().equals( "" ) ){
27 String query = "INSERT INTO TBcliente (" +
28 "clcdesc, clyrend" +
29 ") VALUES ('" +
30 fields.clcdesc.getText() + "', '" +
31 fields.clyrend.getText() + "')";
32 output.append( "\nEnviando query: " +
33 connection.nativeSQL( query )
34 + "\n" );
35 int result = statement.executeUpdate( query );
36
37 if ( result == 1 )
38 output.append( "\nRegistro Adicionado com Sucesso\n" );
39 else {
40 output.append( "\nFalha na incluso\n" );
41 fields.clcdesc.setText( "" );
42 fields.clyrend.setText( "" );
43 }
44 }
45 else
46 output.append( "\nEntre com a descricao e a renda\n" );
47
48 statement.close();
49 }
50 catch ( SQLException sqlex ) {
51 sqlex.printStackTrace();
52 output.append( sqlex.toString() );
53 }
54 }
55 }
Esta classe AdicionandoRegistro acionada ao pressionar o boto Adicionar. O contrutor
AdicionandoRegistro recebe os 3 argumentos - uma Connection, um ScrollingPanel e uma JTextArea. Este
ltimo serve para sada de mensagens exibidas pelo programa. A linha 23 no mtodo actionPerformed cria um
objeto Statement para manipular o banco de dados. A linha 25 e 26 testam se existem dados nos campos de
texto de descrio e renda. Se esses campos de texto no contiverem dados, nenhum registro ser adicionado ao
banco de dados. As linhas 27 a 31 constroem o string de SQL INSERT INTO que ser utilizado para adicionar
um registro ao banco de dados. A linha 35
35 int result = statement.executeUpdate( query );
utiliza o mtodo statement.executeUpdate para atualizar o banco de dados com o novo registro. O mtodo
retorna um int indicando o sucesso ou fracasso da operao de atualizao que testado na linha 37. Se a
atualizao for malsucedida, todos os campos de texto sero limpos. O esquema de execuo de query para
inserir registro o mesmo utilizado para atualizar e excluir, descrito respectivamente nas classes
AtualizandoRegistro (linhas 23 a 44) e ExcluindoRegistro (linhas 22 a 39).
A classe AtualizandoRegistro.java est listada abaixo.
facape.br/jocelio/p3//atualiza.html

4/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

1 // Class UpdateRecord definition


2 import java.awt.*;
3 import java.awt.event.*;
4 import java.sql.*;
5 import javax.swing.*;
6
7 public class AtualizandoRegistro implements ActionListener {
8 private ScrollingPanel fields;
9 private JTextArea output;
10 private Connection connection;
11
12 public AtualizandoRegistro( Connection c, ScrollingPanel f,
13 JTextArea o )
14 {
15 connection = c;
16 fields = f;
17 output = o;
18 }
19
20 public void actionPerformed( ActionEvent e )
21 {
22 try {
23 Statement statement = connection.createStatement();
24
25 if ( ! fields.clncodg.getText().equals( "" ) ) {
26 String query = "UPDATE TBcliente SET " +
27 "clcdesc='" + fields.clcdesc.getText() +
28 "', clyrend='" + fields.clyrend.getText()+
29 "' WHERE clncodg=" + fields.clncodg.getText();
30 output.append( "\nEnviando query: " +
31 connection.nativeSQL( query ) + "\n" );
32
33 int result = statement.executeUpdate( query );
34
35 if ( result == 1 )
36 output.append( "\nAtualizado com sucesso\n" );
37 else {
38 output.append( "\nFalha na atualizacao\n" );
39 fields.clcdesc.setText( "" );
40 fields.clyrend.setText( "" );
41 }
42
43 statement.close();
44 }
45 else
46 output.append( "\nVoce so pode atualizar um" +
47 "registro que existe. Use Procurar para " +
48 "localizar o rengistro, entao " +
49 "modifique a informacao e " +
50 "precione Atualizar.\n" );
51 }
facape.br/jocelio/p3//atualiza.html

5/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

52 catch ( SQLException sqlex ) {


53 sqlex.printStackTrace();
54 output.append( sqlex.toString() );
55 }
56 }
57 }
A classe ExcluindoRegistro.java est listada abaixo.
1 import java.awt.*;
2 import java.awt.event.*;
3 import java.sql.*;
4 import javax.swing.*;
5
6 public class ExcluindoRegistro implements ActionListener {
7 private ScrollingPanel fields;
8 private JTextArea output;
9 private Connection connection;
10
11 public ExcluindoRegistro( Connection c, ScrollingPanel f,
12 JTextArea o )
13 {
14 connection = c;
15 fields = f;
16 output = o;
17 }
18
19 public void actionPerformed( ActionEvent e )
20 {
21 try {
22 if ( !fields.clncodg.getText().equals( "" ) ) {
23 Statement statement =connection.createStatement();
24 String query = "DELETE FROM TBcliente " +
25 "WHERE clncodg = " +
26 fields.clncodg.getText() + "";
27 output.append( "\nEnviando query : " +
28 connection.nativeSQL( query )
29 + "\n" );
30
31 int result = statement.executeUpdate( query );
32
33 if ( result == 1 )
34 output.append( "\nRegistro Excluido\n" );
35 else {
36 output.append( "\nFalha na Exclusao\n" );
37 }
38 statement.close();
39 }
40 else
41 fields.clcdesc.setText(
42 "Entre com a descricao e precione Procurar" );
facape.br/jocelio/p3//atualiza.html

6/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

43 }
44 catch ( SQLException sqlex ) {
45 sqlex.printStackTrace();
46 output.append( sqlex.toString() );
47 }
48 }
49
50 // Display results of query. If rs is null
51 }
A classe ProcurandoRegistro.java est listada abaixo.
1 // Class FindRecord defintion
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.sql.*;
5 import javax.swing.*;
6
7 public class ProcurandoRegistro implements ActionListener {
8 private ScrollingPanel fields;
9 private JTextArea output;
10 private Connection connection;
11
12 public ProcurandoRegistro( Connection c, ScrollingPanel f,
13 JTextArea o )
14 {
15 connection = c;
16 fields = f;
17 output = o;
18 }
19
20 public void actionPerformed( ActionEvent e )
21 {
22 try {
23 if ( !fields.clcdesc.getText().equals( "" ) ) {
24 Statement statement =connection.createStatement();
25 String query = "SELECT * FROM TBcliente " +
26 "WHERE clcdesc like '" +
27 fields.clcdesc.getText() + "'";
28 output.append( "\nEnviando query : " +
29 connection.nativeSQL( query )
30 + "\n" );
31 ResultSet rs = statement.executeQuery( query );
32 display( rs );
33 output.append( "\nQuery bem sucedida\n" );
34 statement.close();
35 }
36 else
37 fields.clcdesc.setText(
38 "Entre com a descricao e precione Procurar" );
39 }
facape.br/jocelio/p3//atualiza.html

7/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

40 catch ( SQLException sqlex ) {


41 sqlex.printStackTrace();
42 output.append( sqlex.toString() );
43 }
44 }
45
46 // Display results of query. If rs is null
47 public void display( ResultSet rs )
48 {
49 try {
50 rs.next();
51
52 int recordNumber = rs.getInt( 1 );
53
54 if ( recordNumber != 0 ) {
55 fields.clncodg.setText( String.valueOf( recordNumber));
56 fields.clcdesc.setText( rs.getString( 2 ) );
57 fields.clyrend.setText( rs.getString( 3 ) );
58 }
59 else
60 output.append( "\nNenhum registro encontrado\n" );
61 }
62 catch ( SQLException sqlex ) {
63 sqlex.printStackTrace();
64 output.append( sqlex.toString() );
65 }
66 }
67 }
Esta classe ProcurandoRegistro pesquisa no banco de dados um registro especfico em resposta so boto
Procurar na GUI. A linha 23 testa se o campo de texto descrio contm dados. Se esse campo estiver vazio, o
programa configura o campo de texto descrio com a mensagem "Entre com a descricao e precione Procurar".
Se existir dados no campo de texto, uma nova Statment criada na linha 24. A string de consulta SQL criada
nas linhas 25 a 27. Seleciona os registros que correspondem descrio.A linha 32 chama o mtodo display
(definido na linha 47) e passa o ResultSet retornado pela chamada executeQuery. O primeiro registro obtido
chamando o mtodo next na linha 50. A linha 52 obtm o nmero do objeto ResultSet rs chamando getInt. A
linha 54 determina se o nmero do registro diferente de zero. Se for, os campos de texto sero preenchidos com
dados do registro. A linha 56 exibe a String com a descrio retornado pelo mtodo getString de ResultSet. O
argumento 2 referencia o nmero da coluna (os nmeros de coluna iniciam a partir de 1) no registro. Instrues
semelhantes so executadas para cada campo de texto. Quando essa operao completada, a GUI exibe o
primeiro registro do ResultSet.
A classe ListarCliente.java esta listada abaixo.
1 import java.sql.*; // Acesso a Banco de Dados relacionais
2 import javax.swing.*; // JTable
3 import java.util.*;
4 import java.awt.*;
5 import java.awt.event.*;
6
7 public class ListarCliente implements ActionListener {
8 private ScrollingPanel fields;
facape.br/jocelio/p3//atualiza.html

8/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

9 private JTextArea output;


10 private Connection connection;
11
12 public ListarCliente(Connection c, ScrollingPanel f,
13 JTextArea o )
14 {
15 connection = c;
16 fields = f;
17 output = o;
18 }
19
20 public void actionPerformed( ActionEvent e )
21 {
22 Statement statement; // Comando SQL, pacote java.sql
23 ResultSet resultSet; // Resultado da consulta
24
25 try {
26 String query = "SELECT CLNCODG AS Codigo,"+
27 " CLCDESC AS Descricao,CLYREND AS Renda FROM Tbcliente";
28
29 statement = connection.createStatement(); // Obtem o objeto (no h instancia aqui)
30 resultSet = statement.executeQuery( query ); // Executa o comando SQL
31 displayResultSet( resultSet);
32 statement.close();
33 }
34 catch ( SQLException sqlex ) {
35 sqlex.printStackTrace();
36 }
37 }
38
39 private void displayResultSet( ResultSet rs )
40 throws SQLException
41 {
42 // position to first record
43 boolean moreRecords = rs.next(); // Retorna se h registro (No EOF (End Of File))
44 // posicionado antes do primeiro registro vlido
45
46 // If there are no records, display a message
47 if ( ! moreRecords ) { // Se no h registros
48 output.append ("\nResultSet nao contem registros" );
49 output.append ("\nNenhum registro para exibir" );
50 return;
51 }
52
53 output.append ("\nTabela Clientes da Empresa" );
54
55
56 try {
57 // get column heads
58 ResultSetMetaData rsmd = rs.getMetaData(); // pacote java.sql
59 // Informaes do registro
facape.br/jocelio/p3//atualiza.html

9/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

60 output.append ("\n");
61 for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) // Quantidade de Colunas (campos)
62 output.append (rsmd.getColumnName( i ) + "\t"); // Nome da coluna
63
64 // get row data
65 do {
66 output.append ("\n" + getNextRow( rs, rsmd ) ); // Formata a cada registro
67 } while ( rs.next() );
68
69 }
70 catch ( SQLException sqlex ) {
71 sqlex.printStackTrace();
72 }
73 }
74
75 private String getNextRow( ResultSet rs,
76 ResultSetMetaData rsmd )
77 throws SQLException
78 {
79 String currentRow = "";
80
81 for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
82 switch( rsmd.getColumnType( i ) ) { // Tipo da coluna (campo)
83 case Types.VARCHAR: // pacote java.sql
84 currentRow += rs.getString( i ) + "\t"; // Obtem o dado String
85 break;
86 case Types.INTEGER:
87 currentRow += new Long( rs.getLong( i ) ) + "\t";// Obtem o dado 88 Long
89 break;
90 default:
91 currentRow += ( "Tipo : " +
92 rsmd.getColumnTypeName( i ) + "\t" );
93 }
94
95 return currentRow;
96 }
97 }
Esta classe ListarCliente j foi discutida do tpico Consultando dados. uma adaptao da classe
MostrarTabela para exibir os dados no JTextArea.
A classe Help.java esta listada abaixo.
1 // Class Help definition
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.swing.*;
5
6 public class Help implements ActionListener {
7 private JTextArea output;
8
9 public Help( JTextArea o )
facape.br/jocelio/p3//atualiza.html

10/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

10 {
11 output = o;
12 }
13
14 public void actionPerformed( ActionEvent e )
15 {
16 output.append( "\nClique Procurar para localicar um registro.\n" +
17 "Clique Adicionar para inserir um novo registro.\n" +
18 "Clique Atualizar para atualizar " +
19 "a informacao em um registro.\n" +
20 "Clique Limpar para limprar" +
21 " os campos.\n" +
22 "Clique em Excluir para eliminar um registro.\n" +
23 "Clique em Listar para os registro.\n");
24 }
25 }
Esta classe Help exibe instrues sobre como utilizar o programa na janela de console na parte inferior da tela
(JTextArea)..
A classe ControlPanel.java esta listada abaixo.
1 // Class ControlPanel definition
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.sql.*;
5 import javax.swing.*;
6
7 public class ControlPanel extends JPanel {
8 private JButton findName, addName,
9 updateName, clear, excluir, listar, help;
10
11 public ControlPanel( Connection c, ScrollingPanel s,
12 JTextArea t )
13 {
14 setLayout( new GridLayout( 1, 5 ) );
15
16 findName = new JButton( "Procurar" );
17 findName.addActionListener( new ProcurandoRegistro( c, s, t ) );
18 add( findName );
19
20 addName = new JButton( "Adicionar" );
21 addName.addActionListener( new AdicionandoRegistro( c, s, t ) );
22 add( addName );
23
24 updateName = new JButton( "Atualizar" );
25 updateName.addActionListener(
26 new AtualizandoRegistro( c, s, t ) );
27 add( updateName );
28
29 clear = new JButton( "Limpar" );
30 clear.addActionListener( new ClearFields( s ) );
facape.br/jocelio/p3//atualiza.html

11/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

31 add( clear );
32
33 excluir = new JButton( "Excluir" );
34 excluir.addActionListener( new ExcluindoRegistro( c, s, t ) );
35 add( excluir );
36
37 listar = new JButton( "Listar" );
38 listar.addActionListener( new ListarCliente( c,s,t ) );
39 add( listar );
40
41 help = new JButton( "Ajuda" );
42 help.addActionListener( new Help( t ) );
43 add( help );
44 }
45 }
A classe ScrollingPanel.java esta listada abaixo.
1 // Class ScrollingPanel
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.swing.*;
5
6 public class ScrollingPanel extends JPanel {
7 private JPanel labelPanel, fieldsPanel;
8 private String labels[] =
9 { "Codigo :", "Descricao:", "Renda:"};
10 JTextField clncodg, clcdesc, clyrend;// package access
11
12 public ScrollingPanel()
13 {
14 // Label panel
15 labelPanel = new JPanel();
16 labelPanel.setLayout(
17 new GridLayout( labels.length, 1 ) );
18
19 ImageIcon ii = new ImageIcon( "images/icon.jpg" );
20
21 for ( int i = 0; i < labels.length; i++ )
22 labelPanel.add( new JLabel( labels[ i ], ii, 0) );
23
24 // TextField panel
25 fieldsPanel = new JPanel();
26 fieldsPanel.setLayout(
27 new GridLayout( labels.length, 1 ) );
28 clncodg = new JTextField( 20 );
29 clncodg.setEditable( false );
30 fieldsPanel.add( clncodg );
31 clcdesc = new JTextField( 20 );
32 fieldsPanel.add( clcdesc );
33 clyrend = new JTextField( 20 );
facape.br/jocelio/p3//atualiza.html

12/13

03/08/2011

5. Lendo, Inserindo e Atualizando dad

34 fieldsPanel.add( clyrend);
35
36 setLayout( new GridLayout( 1, 2 ) );
37 add( labelPanel );
38 add( fieldsPanel );
39 }
40 }
A classe ClearFields.java est listada abaixo.
1 // Class ClearFields definition
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class ClearFields implements ActionListener {
6 private ScrollingPanel fields;
7
8 public ClearFields( ScrollingPanel f )
9{
10 fields = f;
11 }
12
13 public void actionPerformed( ActionEvent e )
14 {
15 fields.clncodg.setText( "" );
16 fields.clcdesc.setText( "" );
17 fields.clyrend.setText( "" );
18 }
19 }
Esta classe ClearFields responsvel por limpar os campos de texto em resposta ao boto Limpar na GUI.

facape.br/jocelio/p3//atualiza.html

13/13