Litebase 1.3 e SuperWaba – Parte 02

Wellington Pinto de Oliveira

Inserindo dados com INSERT

Neste momento temos nosso banco de dados criado. Para inserir dados na tabela podemos utilizar o comando insert da SQL. No exemplo da Listagem 2 temos a inserção de uma pessoa na base  PESSOAS.

 

/**

   * Método que demonstra como executar INSERT

   * @param conn Conexão

   */

  public void executaInsert(LitebaseConnection conn)

  {

         String sql = "INSERT INTO PESSOAS(COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO) VALUES" +

         "('111.111-12','Wellington P. Oliveira','1979/06/12','2008/03/18 22:45:00')";

        

  //Para executar uma INSERT utilize sempre o método executeUpdate()

         conn.executeUpdate(sql);

         Vm.debug("Inserido com sucesso");

  }

Listagem 2. Exemplo de INSERT

Ao executar este código pela primeira vez temos o seguinte resultado:

156 - Abriu a conexão com: HdBA
172 - Não foi preciso criar pois a tabela já existe
172 – Fim
172 - Inserido com sucesso

Ao executar pela segunda vez o retorno é diferente (ver Listagem 3).

 

25 - Abriu a conexão com: HdBA

140 - Não foi preciso criar pois a tabela já existe

140 - Fim

litebase.PrimaryKeyViolationException: Statement creates a duplicated primary key in HdBA-pessoas

  at litebase.c.a (Unknown Source)

  at litebase.A.a (Unknown Source)

  at litebase.t.a (Unknown Source)

  at litebase.B.b(Unknown Source)

  at litebase.u.a (Unknown Source)

  at litebase.u.a (Unknown Source)

  at litebase.u.a (Unknown Source)

  at litebase.u.b(Unknown Source)

  at litebase.LitebaseConnection.executeUpdate (Unknown Source)

  at samples.Primeiro.onStart (Primeiro.java:49)

  at waba.ui.MainWindow._onTimerTick (MainWindow.java:209)

  at waba.applet.WinTimer$2.run(WinTimer.java:102)

  at waba.applet.SWEventThread.handleOneEvent (SWEventThread.java:73)

  at waba.applet.SWEventThread.run (SWEventThread.java:48)

  at java.lang.Thread.run(Unknown Source)

---------------------------

>>>>>>> CAUGHT UNHANDLED EXCEPTION IN SuperWaba EVENT THREAD:

Listagem 3. Retorno do comando insert


Este erro, neste caso, é um bom sinal. Ele informa que a tabela PESSOAS já possui um registro com a chave 111.111-12.

Outra forma de inserir dados é a utilização de uma query pré-compilada chamada PreparedStatement. Ela geralmente é de 3 a 4 vazes mais rápida e é indicada para inserções em Bach (ler Nota 4). Na Listagem 4 temos um exemplo do uso do PreparedStatement para a inserção de uma pessoa na base de dados.

 

/**

   * Exemplo do uso do PreparedStatement

   * @param conn Conexão

   */

  public void executaPreparedStatement(LitebaseConnection conn)

  {

         //Primeiro gere uma SQL

         String sql = "INSERT INTO PESSOAS(COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO) VALUES" +

         "(?,?,?,?)";

        

//Crie a PreparedStatement que será utilizada para executar várias vezes

//a SQL criada

         litebase.PreparedStatement prep_insert = conn.prepareStatement(sql);

         //Passe os parametros, este primeiro deve assumir a posição do

         //primeiro ? na sql acima, e assim por diante

         prep_insert.setString(0, "111.111-13");

         prep_insert.setString(1, "Wellington P. Oliveira");

         prep_insert.setDate(2, new waba.util.Date(12,6,1979));

         prep_insert.setDateTime(3, new waba.util.Date(), new waba.sys.Time());

        

         //Sempre o método executeUpdate() retorna o número de alterações feitas

         //na base de dados, logo um insert deve retornar 1

         int retorno = prep_insert.executeUpdate();

         Vm.debug("Inserido com sucesso, retorno: " + retorno);

  }

Listagem 4. Exemplo do uso do PreparedStatement

 

Nota 2. Uso do PreparedStatement

Sempre que tiver um laço inserindo uma grande quantidade de informações utilize o PreparedStatement, caso contrário, utilize o executeUpdate() conforme o exemplo da Listagem 2.

 

Ao explorar a base de dados (ver Figura 2) encontramos apenas dois registros.

 

net-16-06-2008pic01.JPG

Figura 2. LitebaseExplorer 1.0

Alterando dados com UPDATE

O mecanismo que altera a informação segue o mesmo mecanismo utilizado na inserção, porém a SQL possui outra sintaxe, conforme podemos ver na Listagem 5 (ler Nota 3). Veja na Figura 3 o resultado da atualização do registro.

 

/**

   * Exemplo do uso do Update

   * @param conn

   */

  public void executaUpdate(LitebaseConnection conn)

  {

         //Simples como o insert, gere a SQL e execute

         String sql = "UPDATE PESSOAS SET NOME='Wellington Pinto Oliveira',DAT_NASCIMENTO='1979/06/13' WHERE COD_RG='111.111-12'";

         conn.executeUpdate(sql);

         Vm.debug("Alterado com sucesso");

  }

Listagem 5. Exemplo de Update.

 

Nota 3. Uso do update

1 – Nunca altere um campo que é chave em uma tabela, isso no Litebase 1.3 ou inferior não retorna erro, porém corrompe os dados do registro.

2 – Podemos utilizar PreparedStatement com UPDATE caso seja necessário.

 

net-16-06-2008pic02.JPG
Figura 3. Dados da tabela PESSOAS atualizados.

Exibindo dados com ResultSet

Toda a consulta realizada na base é processada pelo método executeQuery() que retorna um ResultSet, este ResultSet pode ser nulo caso a consulta não retorne informações, então sempre valide antes de usar o retorno.

 

/**

   * Exemplo do uso do ResultSet

   * @param conn

   */

  public void listar(LitebaseConnection conn)

  {

         //Podemos realizar consultas com cláusulas como no exemplo:

         // SELECT * FROM PESSOAS WHERE NOME = 'WELLINGTON'

        

         //Podemos informar as colunas que queremos para agilizar o  

      // processo de consulta e ainda ter o máximo de rendimento:

         // SELECT ROWID, NOME FROM PESSOAS

        

         //Podemos ordenar usando o ORDER BY:

         // SELECT ROWID, NOME FROM PESSOAS ORDER BY NOME

         // SELECT ROWID, NOME FROM PESSOAS ORDER BY NOME DESC

        

         String sql = "SELECT * FROM PESSOAS";

        

         //Um resultset é o resultado de uma consulta, se a consulta

         //não retornar valor algum então este resultset será nulo

         litebase.ResultSet rs = conn.executeQuery(sql);

         if(rs != null)

         {

                   //Para movimentar o ponteiro para o próximo registro

                   while(rs.next())

                   {

                            //podemos capturar os campos do registro corrente

                            Vm.debug("+++++++++++++++++++++++++++++");

                            Vm.debug("RG: " + rs.getString("COD_RG"));

                            Vm.debug("Nome: " + rs.getString("NOME"));

                            Vm.debug("Data Nascimento: " + rs.getDate("DAT_NASCIMENTO").toString(Settings.DATE_DMY));

                            Vm.debug("Incluido na base em: " + rs.getDateTime("HOUR_CADASTRO").toIso8601());

                   }

                   //Nunca esqueça de fechar o ResultSet

                   rs.close();

         }//FIM DO IF

  }//FIM DO MÉTODO

Listagem 6. Consultado a base

 

Dicas Rápidas

1 – Embora o ResultSet seja fechado não feche a conexão, esta deve ficar sempre aberta.

 

Excluindo registros com DELETE

Utilizamos o delete para excluir um ou mais registros, sua sintaxe é bem simples e o exemplo da Listagem 6 demonstra seu uso.

 

  /**

   * Método que exclui dado um RG

   * @param rg

   */

  public void delete(LitebaseConnection conn,String rg)

  {

         //Gerando a instrução SQL

         String sql = "DELETE FROM PESSOAS WHERE COD_RG='"+ rg +"'";

        

         conn.executeUpdate(sql);

  }

Listagem 6 - Exemplo de DELETE

Cuidado com a cláusula delete, sempre observe a WHERE, caso contrário ela elimina todos os registros da tabela.