domingo, 22 de janeiro de 2012

Exemplo de Aplicação Java Swing com BD Oracle - 2

No artigo anterior iniciámos a construção de uma série de artigos para a construção de uma pequena aplicação exemplo de gestão de biblioteca, para ambiente desktop usando classes Java Swing, e acedendo a uma base de dados (BD) Oracle.

O artigo anterior tratou da criação da Base de Dados em Oracle.Este artigo vai tratar da construção de uma classe Java para acesso à Base de Dados.

Iremos usar o NetBeans IDE 7.0.1, o qual pode ser downloaded de http://netbeans.org/community/releases/70/.

Após instalar o NetBeans IDE 7.0.1, devemos criar um novo projecto "Java Class Library", ao qual vamos chamar HelperDB, pois irá tratar-se apenas de uma classe de acesso à base de dados.


 
Criamos uma classe Java, a que chamamos DBAccessObj, a qual ficará no ficheiro DBAccessObj.java.

É necessário incluir as bibliotecas de classes JAR para acesso por JDBC à base de dados Oracle:


Estes ficheiros jar devem estar presentes na directoria

                              oraclexe\app\oracle\product\10.2.0\server\jdbc\lib

sendo oraclexe a directoria onde foi instalado o Oracle XE. A pasta 10.2.0 refere-se à versão do Oracle XE que tenho instalada na minha máquina.


Vamos criar um package, a que chamamos HelperDB, que irá conter a nossa classe, e vamos importar o package java.sql, o qual contém classes de conexão e envio de statements SQL à base de dados:



package HelperDB;

import java.sql.*;

public class DBAccessObj{
       private Connection conn;

       public DBAccessObj()
       {
       }
}



Como única variável de instância da nossa classe, criamos conn do "tipo" java.sql.Connection.
Na verdade, Connection é uma interface que poderá conter um objecto de qualquer tipo que implemente essa interface. Assim, conn poderá conter uma instância de uma conexão de qualquer tipo. O tipo será dado pelo DriverManager de acordo com o driver que for utilizado.

O construtor da classe será então modificado para criar uma conexão à base de dados:



       public DBAccessObj()
       {
              this.createDBConnection();
       }

       private void createDBConnection()
       {
            try {
                     Class.forName("oracle.jdbc.driver.OracleDriver");
            }
            catch(ClassNotFoundException e) {
                     System.out.println("Oops! Can't find class oracle.jdbc.driver.OracleDriver");
                     System.exit(1);
            }
            try{
                     conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "libraryuser","libraryuser");
            }
            catch(Exception e){
                     System.out.println("ERRO " + e.getMessage());
            }
       }



O driver a usar é o "oracle.jdbc.driver.OracleDriver" e a string de ligação à base de dados é:

"jdbc:oracle:thin:@localhost:1521:XE"

sendo "libraryuser","libraryuser", respectivamente o user e password do utilizador que queremos usar no acesso à base de dados (ver artigo anterior).

Neste ponto, se fizermos uma pequena classe de teste (TestClass.java) para criar uma instância da nossa classe, já será possível ver se a conexão é possível:

import HelperDB.DBAccessObj;

public class TestClass {
    public static void main(String[] args) {
        DBAccessObj conexao = new DBAccessObj();
       
    }
}

Se não for possível, aparecerá uma das mensagens de erro que damos num dos catchs acima.

Depois de criar a conexão à base de dados queremos enviar statements SQL para inserir dados numa tabela (INSERT), alterar dados (UPDATE), apagar dados (DELETE) ou consultar dados (SELECT).

Para isso temos que ter uma instância de uma classe que implemente a interface java.sql.Statement:


       public  Statement   createStatement()
       {
          Statement st=null;
          if (this.conn==null)
                   this.createDBConnection();
          try{
                   st = this.conn.createStatement();
          }
          catch(Exception e){
                   System.out.println("ERRO " + e.getMessage());
          }
          return st;
       }

Para executar um comando SQL usando a instância de Statement, vamos criar mais uns métodos na nossa classe:

- Para executar um comando SQL que não devolve resultado (INSERT, UPDATE ou DELETE):

       public void executeSQL(String SqlComm)
       {
        Statement st = this.createStatement();
        try{
                   st.execute(SqlComm);
              }
          catch(Exception e){
                   System.out.println("ERRO " + e.getMessage());
          }

       }


- Para executar um comando SQL que devolve um resultado (SELECT):

       public ResultSet  executeQuery(String SqlComm)
       {
          Statement st = this.createStatement();
          ResultSet rs=null;

          try{
                   rs = st.executeQuery(SqlComm);
          }
          catch(Exception e){
                   System.out.println("ERRO " + e.getMessage());
          }
          return rs;
       }



Por fim, vamos escrever métodos para criar uma conexão e eliminar uma conexão:


       public Connection  openConnection()
       {
           if(this.conn==null)
                     this.createDBConnection();

           return this.conn;
       }

       public void   closeConnection()
       {
              if(this.conn!=null)
              {
                  try{
                            this.conn.close();
                   }
                   catch(Exception e){
                            System.out.println("ERRO " + e.getMessage());
                   }
              }
       }



Isto termina a nossa classe. Para a testar, podemos agora melhorar a nossa classe de teste:

import HelperDB.DBAccessObj;
import java.sql.*;

public class TestClass {
    public  static  void  main(String[] args) {
             DBAccessObj conexao = new DBAccessObj();
      
             conexao.executeSQL("Insert into Author columns (Name, SURNAME) VALUES ('XICO', 'MENDES')");
      
             ResultSet rs = conexao.executeQuery("SELECT * FROM AUTHOR");
      
             try{
                    while(rs.next()){
                           String aName = ((String)rs.getString("Name"));
                           String aSurname = ((String)rs.getString("Surname"));
                           //
                           System.out.println(aName + " " + aSurname);
                    }
             }
             catch(Exception e){
                     System.out.println("ERRO " + e.getMessage());
             }
    }
}

Se tudo estiver bem, o resultado do teste será a inserção do autor com nome XICO MENDES na tabela AUTHOR e a posterior listagem do conteúdo da mesma tabela.
Não foram testados os métodos de criar e fechar a conexão, mas veremos a sua utilidade noutro artigo.

Outros artigos relacionados:
     - Exemplo de Aplicação Java Swing com BD Oracle - 1
     - Exemplo de Aplicacao Java Swing com BD Oracle - 3
     - Exemplo de Aplicacao Java Swing com BD Oracle - 4

6 comentários:

  1. Respostas
    1. Nikanor, pode fazer download do zip com as sources do projeto HelperDB aqui.

      Ou copiar/colar o link seguinte no seu browser: https://docs.google.com/open?id=0B0zl-Rzbx3qgaTh5RWZTZG9ES1E

      Bom trabalho!

      Eliminar
    2. Primeiro deve deszipar o projeto numa pasta HelperDB\src.
      Depois, no Netbeans, deve criar um projeto "with Existing Sources" e indicar a pasta onde estão as sources.
      Há uma pequena classe para fazer o teste.

      Claro que, antes, precisa de ter criado a base de dados...

      Eliminar
  2. Desculpe professor, mas para quem nunca utilizou o NetBeans é muito complicado, os ficheios sao para colocar na pasta HelperDB\src ou oraclexe\app\oracle\product\10.2.0\server\jdbc\lib?

    ResponderEliminar