Todos os comandos que devem ser enviados para o SGBD precisam estar encapsulados por um objeto do tipo Statement, portanto é necessário criar o Statement a partir da conexão que você já fez com o banco de dados.
Importante
Você deve importar java.sql.Statement, e não Statement de outros pacotes, o Netbeans oferece como primeira opção java.beans.Statement, você não deve clicar no botão OK, primeiro você deve alterar para selecionar java.sql.Statement antes de confirmar a importação.
O método responsável pela criação de um Statement é createStatement(), então o seu código seria algo como:
Statementstatement = conexao.createStatement(); Lembre-se que este método pode levantar a exceção SQLException.
2.4.4 Utilizando um Statement
Os dois métodos principais de Statement são:
ResultSetexecuteQuery(comandoSQL) utilizado para comandos SELECT que retornam um único ResultSet;
intexecuteUpdate(comandoSQL) utilizado para atualizar dados com comandos INSERT, DELETE ou UPDATE e retorna um inteiro que informa quantas linhas da tabela foram atualizadas.
Um ResultSet é a classe em Java que encapsula a tabela resultante de um comando SELECT e você irá utilizá-la para visualizar os dados retornados pelo seu SELECT.
A classe Pessoa da figura 2.21 (diferente da classe Pessoa utilizada anteriormente) será utilizada para armazenar as informações retornadas pelo Java DB, conforme o código exibido na figura 2.22.
Veja que no código da figura 2.22 é necessário sempre fechar os ResultSet, Statmente e Connection, por isso esse código está na cláusula finally. Observe que o main agora pode levantar uma SQLException, pois os comandos de close() podem gerar esta exceção. Se você quiser evitar isto, basta colocar um código try/catch dentro do finally. Note que na linha 23 o comando está selecionando todas as linhas da tabela Pessoas, e na linha 24 está sendo utilizado o método next() do ResultSet.
Figura 2.22: Código completo de uma utilização do JDBC
Fonte: Conteudista
O ResultSet inicialmente tem um ponteiro posicionado antes da primeira linha da tabela de resultado, então quando você chama o método next(), este ponteiro passa a apontar para a primeira linha. Chamadas subsequentes de next() fará com que você percorra toda a
apontando para a última linha da tabela, então ele passa a apontar para a posição após a última linha e retorna false, assim você consegue controlar o laço while (vide linha 24 da figura 2.22).
Quando o ponteiro do ResultSet está posicionado sobre uma das linhas da tabela, você poderá acessar os campos desta linha, e para isto você precisa utilizar o método apropriado dependendo do tipo daquela coluna. No exemplo da tabela Pessoas, os campos id e idade são inteiros e nome é uma String, por isso foram utilizados os métodos getInt(nomeDaColuna) e getString(nomeDaColuna), respectivamente (vide linhas 25 a 27 da figura 2.22).
Na linha 28 da figura 2.22 você pode ver a criação do objeto Pessoa a partir das informações armazenadas no banco de dados. Veja que é um trabalho extra que você precisa fazer, pois o banco de dados que você está utilizando não armazena objetos, só armazena dados no formato de tabelas.
O código da figura 2.23 mostra para você o processo inverso, isto é, você tem os dados dentro de um objeto Pessoa, e deseja armazená-lo no banco de dados, para isto você irá utilizar o comando INSERT que deverá inserir os dados da Pessoa (veja as linhas 21 e 22). O comando SQL que será enviado ao banco de dados é:
"INSERT INTO PESSOAS (ID, NOME, IDADE) VALUES (5, 'Ana', 21)"
Observe que String para o banco de dados deve estar dentro de apóstrofos ('), diferentemente do Java que utiliza aspas ("). Veja que o trecho de código abaixo incluir um apóstrofo antes e outro depois do nome da pessoa:
", '" + p.getNome() + "', "
Tome muito cuidado ao montar a String que será enviada para o banco de dados, pois é muito comum esquecer dos apóstrofos, ou de uma vírgula, etc.
Figura 2.23: Classe Pessoa
Fonte: Conteudista
Na linha 24 da figura 2.23 é realizado o teste para saber se a linha foi ou não inserida com sucesso. Como neste exemplo, o INSERT só irá inserir uma linha, o teste é feito para saber se ele conseguiu inserir esta linha e mostrar a mensagem de sucesso, e no caso de não conseguir o ELSE exibe a mensagem de falha na inserção.
Compor comando SQL desta maneira é muito propenso a erros e também a um tipo de ataque muito conhecido chamado de SQL
Injection, por isso, na maioria das vezes utiliza-se o PreparedStatement no lugar do Statement.
2.4.5 Criando um PreparedStatement
Além da vantagem que você acabou de ver, o PreparedStatement também aumenta bastante a velocidade de processamento quando você deseja executar um mesmo comando várias vezes, pois o código SQL fica compilado do lado do servidor.
Uma outra característica interessante do PreparedStatment é que ele pode ter parâmetros.
O método responsável pela criação de um PreparedStatement é preparedStatement(), então o seu código seria algo como:
conexao.prepareStatement(comandoSQL);
O comandoSQL que você precisará passar poderá ter interrogações (?) para informar que são parâmetro que serão passados na hora de executar o comando. Por exemplo, o código de inserção utilizado se tornaria agora:
"INSERT
INTO PESSOAS (ID, NOME, IDADE) VALUES (?, ?, ?)"
2.4.6 Utilizando um PreparedStatement
Uma vez criado o PreparedStatment, você precisa preencher com as informações desejadas e executá-lo. Para preencher as informações você utiliza os métodos setTipo (setInt, setString, setDouble, etc.), informando o número do parâmetro e o seu valor. Veja exemplos nas linhas 22 a 24 da figura 2.24.
Depois de preenchidos todos os parâmetros é necessário executar a consulta (executeQuery) ou atualização (executeUpdate).
Veja o código da figura 2.24 para um exemplo de inserção de duas pessoas no banco de dados.
Figura 2.24: Código utilizando Prepared Statement
Saiba Mais
Vocês pode obter mais detalhes sobre JDBC nos seguintes sites: http://download.oracle.com/javase/tutorial/jdbc/index.html http://netbeans.org/kb/docs/ide/java-db_pt_BR.html
http://marciobueno.com/arquivos/ensino/poo/POO_17_JDBC .pdf
Atividades de aprendizagem:
1. Crie um banco de dados Java DB e a partir de algum modelo ER que você fez na disciplina de banco de dados, crie as tabelas e execute algumas consultas.
2. Crie um programa em Java que se conecte neste banco de dados e realize inserção e consulta de dados.
Resumo
Utilizar SGBDs para armazenar, consultar e manipular dados deixa o seu aplicativo bem mais robusto e fácil de implementar. Para isto, você aprendeu como utilizar o Netbeans para gerenciar o seu banco de dados, e também viu todo o código necessário para acessar o banco de dados de dentro da sua aplicação.
3. INTERFACE GRÁFICA I
ObjetivosAprender os conceitos básicos de Swing. Saber utilizar os principais componentes.
3.1 Introdução
Até agora todos os seus programas foram feitos utilizando apenas interface com o usuário via console, o que torna a sua aplicação nada atraente, pois hoje em dia todo mundo só quer utilizar interfaces gráficas.
Para isto, você aprenderá nesta lição como criar interfaces gráficas utilizando o Netbeans de uma forma bem simples e fácil.
3.2 Swing
O Swing é um toolkit contendo muitos componentes prontos para você utilizar e criar as suas interfaces gráficas.
Saiba Mais
Você pode visualizar os componentes gráficos disponíveis no Swing através dos seguintes links:
http://download.oracle.com/javase/tutorial/ui/features/component
s.html
http://download.oracle.com/javase/tutorial/ui/features/compWin.h
tml
Na realidade o Swing possui é bem mais que um simples toolkit, ele oferece diversos recursos extras como: internacionalização de componentes e suporte a acessibilidade, entre outros.
O Swing é parte da JFC (Java Foundation Classes) que oferece muito mais recursos para você desenvolver a sua aplicação gráfica.