Litebase 1.3 e SuperWaba – Parte 02
Dando continuidade ao artigo, veremos como inserir dados com INSERT, alterar os dados com UPDATE, exibir dados com ResultSet e excluir registros com DELETE.
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.
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.
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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo