5. Lendo, Inserindo e Atualizando dados
A manipulação do banco de dados é discutida neste tópico. 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 }}
figura 5.1
A classe CadastroCliente.java contem os botões principais para executar inclusão, alteração, exclusão, 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" +
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 conexão com o banco de dados. Classes separadas são definidas pra tratar eventos de cada um dos 7 botões na interface com o usuário.
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 )
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 inclusão\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 botão Adicionar. O contrutor AdicionandoRegistro recebe os 3 argumentos - uma Connection, um ScrollingPanel e uma JTextArea. Este último serve para saída de mensagens exibidas pelo programa. A linha 23 no método 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 descrição e renda. Se esses campos de texto não 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 método statement.executeUpdate para
atualizar o banco de dados com o novo registro. O método retorna
um int indicando o sucesso ou fracasso da operação de
atualização que é testado na linha 37. Se a atualização for
malsucedida, todos os campos de texto serão limpos. O esquema de
execução 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.
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 }
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" );
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 }
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 específico em resposta so botão Procurar na GUI. A linha 23 testa se o campo de texto descrição contém dados. Se esse campo estiver vazio, o programa configura o campo de texto descrição 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 à descrição.A linha 32 chama o método display (definido na linha 47) e passa o ResultSet retornado pela chamada executeQuery. O primeiro registro é obtido chamando o método next na linha 50. A linha 52 obtém o número do objeto ResultSet rs chamando getInt. A linha 54 determina se o número do registro é diferente de zero. Se for, os campos de texto serão preenchidos com dados do registro. A linha 56 exibe a String com a descrição retornado pelo método getString de ResultSet. O argumento 2 referencia o número da coluna (os números de coluna iniciam a partir de 1) no registro. Instruções semelhantes são executadas para cada campo de texto. Quando essa operação é 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;
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
(não 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
(Não EOF (End Of File))
44 // É posicionado antes do primeiro registro válido
45
46 // If there are no records, display a message
47 if ( ! moreRecords ) { // Se não 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 // Informações do registro
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 tópico Consultando dados. É uma adaptação 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 )
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 instruções 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 ) );
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 );
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 é responsável por limpar os campos de texto em resposta ao botão Limpar na GUI.