Especialização em web com interfaces ricas Acessando Bancos de Dados com Java Prof. Fabrízzio Alphonsus A. M. N. Soares [email protected] [email protected] Instituto de Informática Universidade Federal de Goiás Aula 4 25 de maio de 2012 Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 1/22 Bancos de Dados com Java Nesta aula você irá aprender os seguintes conceitos: Drivers para acesso a bancos de dados Objeto Connection Objeto Statement Objeto ResultSet Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 2/22 Drivers de Bancos de Dados I Um driver de banco de dados é um arquivo usado pelo programa para comunicar-se com o sistema de gerenciamento de banco de dados (DBMS). Cada fabricante de bancos de dados fornece seu driver compatível e portanto, em sua maioria, estes não acompanham o java. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 3/22 Drivers de Bancos de Dados II Para isto, você pode obter o driver com o fabricante. No caso do Apache Derby, você tem duas opções de drivers: Driver embarcado (embedded) Este acompanha o mesmo JAR do banco de dados (derby.jar) Driver separado Este é utilizado quando utiliza-se o Apache Derby em modo cliente/servidor (derbyclient.jar) Em nosso caso, como a escolha das opções neste momento é irrelevante, utilizaremos o driver embedded. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 4/22 Drivers de Bancos de Dados III Para utilizar o driver você deverá fornecer como parâmetro ao invocar o java. 1 java -classpath .:derby.jar MeuPrograma Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 5/22 Drivers de Bancos de Dados IV Para utilizar o driver em seu programa, você deverá solicitar ao java que carregue a classe do driver. Para isto utilize o seguinte código: 1 2 3 4 5 6 7 8 try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); } catch (ClassNotFoundException ex) { System.out.println("Driver não encontrado!"); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 6/22 Drivers de Bancos de Dados V Observe que a linha que carrega o driver está com tratamento da exceção ClassNotFoundException. Esta exceção é conhecida como driver não encontrado. É importantíssimo tratar esta exceção e impedir o programa de continuar, já que a falta do driver significará que o programa não tem outra coisa a fazer a não ser finalizar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 7/22 Conexão com o banco de dados I Agora que já carregamos o driver, já podemos estabelecer uma conexão com o banco de dados. Esta conexão é essencial para que possamos realizar operações no banco de dados como: insert, update, delete e select. Outras operações podem ser realizadas, mas por hora vamos nos ater às básicas. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 8/22 Conexão com o banco de dados II Para estabelecer uma conexão, você deve solicitar uma usando a classe DriverManager (gerenciador de driver), e quando a conexão não for mais necessária você deverá fecha-la. 1 2 3 4 5 6 7 8 9 10 11 12 13 try { Class.forName("org.apache.derby.jdbc.ClientDriver"); Connection cn = DriverManager.getConnection("jdbc:derby:/ home/fabrizzio/javadb/bancos/meubanco"); cn.close(); } catch (SQLException ex) { System.out.println("Erro de SQL"); } catch (ClassNotFoundException ex) { System.out.println("Driver não encontrado!"); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 9/22 Conexão com o banco de dados III Observe que no parâmetro "jdbc:derby:/home/fabrizzio/javadb/bancos/meubanco" você deverá substituir pelo caminho completo do seu banco de dados. Observe ainda que, para utilizar as classes Connection, Drivermanager e SQLException será necessário importa-las. 1 2 3 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; Por fim, a conexão criada é uma instância de Connection, e foi chamada de cn. Quando a conexão não for mais necessária você deverá encerra-la invocando seu método close. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 10/22 Operações I Para realizar operações no banco de dados você deverá utilizar uma instância do tipo Statement. O Statement é obtido a partir da sua conexão com o banco de dados. Para isto faça: 1 Statement st = cn.createStatement(); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 11/22 Operações II Para executar uma operação do tipo INSERT, UPDATE ou DELETE você deve invocar o método execute. 1 2 st.execute("insert into aluno (matricula, nome) values (1, ’João’)"); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 12/22 Operações III E quando seu statement não for mais necessário você deve finaliza-lo. 1 st.close(); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 13/22 Operações IV Um programa exemplo completo ficaria assim: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import import import import java.sql.Connection; java.sql.DriverManager; java.sql.SQLException; java.sql.Statement; public class ExemploBD { public static void main(String args[]){ try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); Connection cn = DriverManager.getConnection("jdbc:derby:/home/fabrizzio/ javadb/bancos/meubanco"); Statement st = cn.createStatement(); st.execute("insert into aluno (matricula, nome) values (1, ’João’)"); st.close(); cn.close(); } catch (SQLException ex) { System.out.println("Erro de SQL"); } catch (ClassNotFoundException ex) { System.out.println("Driver não encontrado!"); } } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 14/22 Operações V Para executar uma operação diferente, você poderá substituir o parâmetro do método execute pelo comando SQL que você desejar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 15/22 Fazendo consultas com resultados I Para executar consultas com resultados, você utilizará ainda do Statement, porém, você deverá utilizar o método executeQuery(). Este método retornará um objeto do tipo ResultSet. Este objeto representa o conjunto de dados da sua consulta SQL. 1 ResultSet rs = st.executeQuery("Select * from aluno"); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 16/22 Fazendo consultas com resultados II Para acessar os dados retornados, você deverá utilizar os métodos get<Tipo> do ResultSet. Onde <tipo> é o tipo de dado que você quer obter. Ex: getInteger(), getString(), ... Lembre-se: Você deverá importar o ResultSet para poder obter instâncias do seu tipo. 1 import java.sql.ResultSet; Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 17/22 Fazendo consultas com resultados III Não necessariamente este tipo precisa ser o mesmo do tipo armazenado no banco de dados, porém, se você usar um tipo diferente, você fará uma conversão de tipo. Se a conversão não for possível, irá gerar um erro. Ex: O tipo armazenado é uma string e você tenta usar um getInteger() porém o conteúdo não é um número inteiro. Novamente: quando o ResultSet não for mais necessário você deverá fecha-lo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 18/22 Exemplo de consulta I O código abaixo exemplifica programa que faz um select no banco de dados e exibe todos os resultados na tela. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import java.sql.*; public class ExemploBD { public static void main(String args[]){ try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); Connection cn = DriverManager.getConnection("jdbc:derby:/home/fabrizzio/javadb/ bancos/meubanco"); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery("Select * from aluno"); while(rs.next()){ System.out.println("Matricula: " + rs.getString("matricula")); System.out.println("Nome: " + rs.getString("nome")); } rs.close(); cn.close(); } catch (SQLException ex) { System.out.println("Erro de SQL"); } catch (ClassNotFoundException ex) { System.out.println("Driver não encontrado!"); } } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 19/22 Exemplo de consulta II Observação: No código acima, foi realizada a importação usando o * apenas para que o código ficasse em um único slide. Utilize sempre as importações individuais. 1 2 3 4 5 import import import import import java.sql.Connection; java.sql.DriverManager; java.sql.SQLException; java.sql.Statement; java.sql.ResultSet; Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 20/22 Exercício I 1 2 3 Crie um banco de dados Crie uma tabela chamada cliente com a seguinte estrutura: matricula integer nome varchar(50) idade integer sexo char(1) Faça dois programas em java: 1 2 Um para solicitar dados de clientes e cadastrar na tabela cliente; Outro para listar os registros da tabela cliente; Para fazer os programas, utilize os códigos de exemplo desta aula. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 21/22 Exercício II Este exercício deverá ser realizado e submetido via moodle até 27/10 (quinta-feira). Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java 22/22