Java JDBC Aplicação Java com Acesso a um SGBD Ricardo Terra rterrabh [at] gmail.com Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 1 CV Nome: Ricardo Terra Email: rterrabh [at] gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868 Ph.D. (UFMG/UWaterloo), Post-Ph.D. (INRIA/Université Lille 1) Background Acadêmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos) Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano) Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 2 Conexão Java com SBGD n Não faria sentido um SGBD se não existisse a conexão entre uma linguagem de programação e um banco de dados q Em Java, existe o Java Database Connectivity (JDBC) n JDBC é uma biblioteca vinculada a API da linguagem de programação Java que define como um cliente pode acessar um banco de dados. Inclusive provê métodos para consulta e atualização n JDBC é direcionado a banco de dados relacionais Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 3 JDBC n A API JDBC já está vinculada ao JDK do Java, porém é necessário baixar as API específicas para o Oracle q n O connector Oracle pode ser facilmente baixado em: q n http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html O connector MySql pode ser facilmente baixado em: q n São conhecidas como connectors http://dev.mysql.com/downloads/connector/j/ O connector é a implementação das interfaces JDBC. Ela possui a extensão JAR e deve ser adicionada ao "Build Path" do projeto que a utilizará, conforme demonstrado no próximo slide Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 4 Importando Bibliotecas Externas... n Clique com o botão direito no projeto, vá em "Build Path" e depois em "Add External Archives..." Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 5 Importando Bibliotecas Externas... n Selecione a biblioteca (extensão JAR) desejada onde ela estiver Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 6 Importando Bibliotecas Externas... n Observe que a biblioteca aparecerá em "Referenced Libraries" Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 7 Conexão Java com SGBD Para exemplos, utilizaremos o seguinte modelo relacional: n CONTATO (cpf, nome, sexo, data_nascimento, telefone)! ! ! ! ! ! !dom(cpf) = numérico(11) NN! !dom(nome) = alfabético(60) NN, com nome único! !dom(sexo) = char(1) NN, pode ser 'M' ou 'F'! !dom(data_nascimento) = data NN! !dom(telefone) = numérico(10) NN! q Por didática, todos os campos serão não-nulos (not null) Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 8 Conexão Java com Oracle n Criação do modelo relacional proposto no Oracle: create table CONTATO( CPF number(11) not null, NOME varchar2(60) not null, SEXO char(1) not null, DATA_NASCIMENTO date not null, TELEFONE number(10) not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) ); Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 9 Conexão Java com MySql n Criação do modelo relacional proposto no MySql: create table CONTATO( CPF bigint not null, NOME varchar(60) not null, SEXO char(1) not null, DATA_NASCIMENTO date not null, TELEFONE int not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) ); Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 10 JDBC n As classes e interfaces JDBC estão contidas no pacote java.sql! n Veremos nos próximos slides a classe e as interfaces deste pacote. q q A única classe é a DriverManager que é responsável pelo gerenciamento de conectores (connectors ou drivers) Todos os outros tipos são interfaces, pois a implementação deles encontra-se na biblioteca (connector) que foi adicionado ao projeto e que deve ser registrado pela classe DriverManager Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 11 JDBC n Arquitetura JDBC: Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 12 JDBC – java.sql.DriverManager! n DriverManager é a classe responsável por: q q n Registrar o connector Abrir conexão Os principais métodos são: q registerDriver(driver: Driver) : void! n Utilizado para o registro de um connector (ou driver). É a primeira atividade a ser realizada DriverManager.registerDriver(! ! !new oracle.jdbc.driver.OracleDriver());! q getConnection(url: String, user : String, pword: String) : Connection! n Utilizado para criar uma conexão a um SGDB. Deve ser passado a url de acesso ao SGBD, o nome e a senha do usuário Connection conn = DriverManager.getConnection(! ! "jdbc:oracle:thin:@localhost:1521:xe","user”,"pw");! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 13 JDBC – java.sql.Connection! n Connection é a interface responsável por: q q Realizar commit ou rollback de uma transação Criar instruções n n Qualquer DML ou DDL, como insert, select, create view etc Os principais métodos são: q setAutoCommit(autoCommit: boolean) : void! n Configura se a conexão será "auto-comitada" ou não q conn.setAutoCommit(false); q commit() : void! n Realiza o commit da conexão q conn.commit();! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 14 JDBC – java.sql.Connection q rollback() : void! n Realiza o rollback da conexão q conn.rollback(); q createStatement() : java.sql.Statement! n Cria uma instrução para que seja enviado algum SQL ao banco de dados q Statement st = conn.createStatement();! q prepareStatement(sql : String) : java.sql.PreparedStatement! n Cria uma instrução parametrizada para que seja enviado algum SQL ao banco de dados n q PreparedStatement ps = conn.prepareStatement("select * from CONTATO where CPF = ?");! close() : void! n Realiza o encerramento da conexão. Sempre ao abrir uma conexão, a mesma deverá ser encerrada n conn.close();! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 15 JDBC – java.sql.Statement n Statement é a interface responsável por: q q n Executar instruções Realizar consultas Os principais métodos são: q executeUpdate(sql : String) : int! n Realiza a execução de um insert, update, delete ou qualquer instrução SQL que não retorne nada, por exemplo, instruções DDL q q executeQuery(sql : String) : java.sql.ResultSet! n Realiza uma consulta q q st.executeUpdate("delete from CONTATO where SEXO='M'"); ResultSet rs = st.executeQuery("select * from CONTATO"); close() : void! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 16 JDBC – java.sql.PreparedStatement n PreparedStatement é a interface com as mesmas responsabilidades da Statement, porém possui métodos para inserir os parâmetros n Alguns destes métodos de inserção de parâmetros: q setInt(paramIndex : int, x : int) : void! q setLong(paramIndex : int, x : long) : void! q setString(paramIndex : int, x : String) : void! q setDate(paramIndex : int, x : java.sql.Date) : void! q setNull(parameterIndex : int, sqlType : int) : void! n Ex.: ps.setNull(5, java.sql.Types.NULL); Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 17 JDBC – java.sql.PreparedStatement n Exemplo: q ...! !PreparedStatement ps = ! ! !conn.prepareStatement(! ! ! ! !"insert into CONTATO values (?,?,?,?,?)");! !! !ps.setLong(1, 12345678903L);! !ps.setString(2, "Marcos");! !ps.setString(3, "M");! !ps.setDate(4, new java.sql.Date(500000000000L));! !ps.setLong(5, 3134181010L);! ! !ps.executeUpdate();! !...! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 18 JDBC – java.sql.ResultSet n ResultSet é a interface responsável por: q n Manipular o conjunto de resultados de uma consulta Os principais métodos são: q next() : boolean! n Move o cursor para a próxima posição do conjunto de resultados, retornando um booleano dizendo se a próxima posição é válida ou não q q q rs.next(); close() : void! Métodos de recuperação de valores das colunas que será abordado no próximo slide Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 19 JDBC – java.sql.ResultSet n Possui métodos para recuperação dos valores das colunas: q n Os valores poderão ser recuperados pelo nome da coluna ou mesmo pela posição em que a coluna se encontra no resultado Alguns destes métodos de recuperação de valores das colunas: q getInt( [columnName : String | columnIndex : int ] ) : int! q getLong( [columnName : String | columnIndex : int ] ) : long! q getString( [columnName : String | columnIndex : int ] ) : String! q getDate([columnName : String | columnIndex : int]) : java.sql.Date! n Somente a data q getTimestamp([columnName : String | columnIndex : int]) : java.sql.Date! n Data e hora Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 20 Utilizando JDBC n A programação usando JDBC pode ser descrita em um fluxo de atividades que será descrita em Diagrama de Atividade da UML no próximo slide Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 21 Utilizando JDBC Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 22 JDBC - Exemplos n Os slides a seguir apresentam alguns exemplos da utilização do JDBC em um SGBD MySql n Os primeiros três exemplos estão focados na utilização, ignorando completamente qualquer exceção que possa ocorrer n O último exemplo apresenta um tratamento de exceção adequado Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 23 Exemplos – Utilizando Instrução Simples public static void insert() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); Statement st = conn.createStatement(); st.executeUpdate( "insert into CONTATO values (12345678903,'Marcos','M',to_date('04/11/1985','dd/MM/yyyy'),3132501111)"); st.close(); conn.commit(); conn.close(); } Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 24 Exemplos – Utilizando Instrução Preparada public static void insertPreparado() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement( "update CONTATO set NOME = ?, SEXO = ?, DATA_NASCIMENTO = ?, TELEFONE = ?" + "where CPF = ?"); ps.setString(1, "Carla"); ps.setString(2, "F"); ps.setDate(3, new java.sql.Date(500000000000L)); ps.setLong(4, 3132501111L); ps.setLong(5, 12345678904L); ps.executeUpdate(); ps.close(); conn.commit(); conn.close(); } Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 25 Exemplos – Conjunto de Resultados public static void select() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * from CONTATO"); while (rs.next()) { System.out.println("CPF: " + rs.getLong("CPF")); System.out.println("NOME: " + rs.getString("NOME")); System.out.println("SEXO: " + rs.getString("SEXO")); System.out.println("DATA DE NASCIMENTO: " + rs.getDate("DATA_NASCIMENTO")); System.out.println("TELEFONE: " + rs.getLong("TELEFONE")); System.out.println("========================================"); } rs.close(); st.close(); conn.commit(); conn.close(); } Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 26 Exemplos – Bloco Transacional public static void blocoTransacional() { Connection conn = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); /* AQUI VEM O CÓDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceção de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexão estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceção ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexão estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceção ao fechar a conexão. Causa: " + e.getMessage()); } } } } Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 27 PreparedStatement ps = conn.prepareStatement( "insert into CONTATO values (?,?,?,?,?)"); ps.setLong(1, 12345678905L); ps.setString(2, "Clodovil"); ps.setString(3, "I"); ps.setDate(4, new java.sql.Date(500000000000L)); ps.setLong(5, 3132501111L); public static void blocoTransacional() { ps.executeUpdate(); Connection conn = null; ps.close(); try { DriverManager.registerDriver(new com.mysql.jdbc.Driver() ()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); Exemplos – Bloco Transacional /* AQUI VEM O CÓDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceção de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexão estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceção ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexão estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceção ao fechar a conexão. Causa: " + e.getMessage()); } } } } Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 28 Importante n Prefira a utilização de transações. q n Encerre tudo que tiver sido aberto. q n Isto é, opte por conn.setAutoCommit(false)! Invoque o método close() de conexões, instruções e conjunto de resultados Sempre faça o acesso a um banco de dados utilizando um tratamento de exceção adequado q Isto é, fazer rollback em caso de erro, fechar sempre a conexão independente de sucesso ou falha na transação etc Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 29 Desenvolvendo uma Aplicação Completa n Com toda a teoria absorvida e entendida, vamos agora criar uma aplicação Java completa com acesso à uma base de dados n Para isso, utilizaremos: q Eclipse q Oracle XE ou MySql q Connector para Oracle ou MySql q Biblioteca TerraUtil! n n Disponível em: www.ricardoterra.com.br/palestras A aplicação a ser desenvolvida será explicada nos próximo slides Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 30 Desenvolvendo uma Aplicação Completa n Inicialmente, o usuário poderá escolher dentre uma das opções abaixo. Cada opção será implementada em um método específico ========================! CADASTRO DE CONTATOS ! ========================! 1 – SALVAR! 2 – ATUALIZAR! 3 – EXCLUIR! 4 – PESQUISAR! 5 – LISTAR! 6 – ENCERRAR! ! DIGITE A OPÇÃO DESEJADA: ! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 31 Desenvolvendo uma Aplicação Completa 1. Salvar q Pedirá ao usuário todas as informações do contato e gravará no SGBD q Retornará ao menu de opções 2. Atualizar q Pedirá ao o usuário para digitar o cpf do contato n q 3. Caso exista, pedirá todas as informações do contato novamente – com a exceção do cpf – e atualizará no SGBD. Caso não exista, isso deverá ser avisado ao usuário Retornará ao menu de opções Excluir q Pedirá para o usuário digitar o número da matrícula n q Caso exista, excluir-se-á e avisará ao usuário que a exclusão foi efetuada com sucesso. Caso não exista, isto deverá ser avisado ao usuário Retornará ao menu de opções Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 32 Desenvolvendo uma Aplicação Completa 4. Pesquisar q Pedirá para o usuário digitar o cpf do contato q Caso exista, irá exibir as informações do contato. Caso não exista, isto deverá ser avisado ao usuário q Retornará ao menu de opções 5. Listar q Se existir algum contato, exibirá as informações de todos. Caso não exista nenhum, isso deverá ser avisado ao usuário q Retornará ao menu de opções 6. Encerrar q Deverá encerrar o aplicativo Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 33 Desenvolvendo uma Aplicação Completa n Teremos uma classe do tipo Contato! n Teremos uma classe de busca de conexão (DBLocator) n Teremos um ContatoDAO! n Teremos a classe Aplicacao! q que fará toda a interação com o usuário através da biblioteca TerraUtil! Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 34 Dúvidas? ??? Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 35 Obrigado! Ricardo Terra rterrabh [at] gmail.com Apresentação e projeto Java disponíveis em: www.ricardoterra.com.br/palestras Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 36 Referência Bibliográfica n DEITEL, H. M; DEITEL, P. J. Java, como programar. 6 ed. São Paulo: Prentice-Hall, 2005. n DAWES, Chip; THOMAS, Biju. OCA/OCP: Introduction to Oracle9i™ SQL. São Francisco: Sibex, 2002. Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010 37