Ciência da Computação GBC043 Sistemas de Banco de Dados Java Database Connectivity JDBC PostgreSQL JDBC Diferentes SGBD possuem diferentes formas de se comunicar com uma aplicação Aplicação Java Profa. Maria Camila Nardini Barioni camila.barioni@ufu.br Bloco B -sala 1B137 Oracle MySQL PostgreSQL 1 semestre de 2018 Necessidade de aprendizado de várias APIs GBC043 Sistemas de Banco de Dados -1 semestre de 2018 2 JDBC JDBC - Arquitetura Solução: Aplicação Java API do JDBC O JBDC provê um conjunto de interfaces para acesso ao BD é um conjunto de APIs (bibliotecas de classes) Cada SGBD possui um Driver JDBC específico (que é usado de forma padrão - JDBC) Os drivers de outros fornecedores devem ser adicionados ao CLASSPATH da aplicação para serem utilizados driver JDBC driver JDBC driver JDBC Oracle MySQL PostgreSQL Mudança do driver não afeta a aplicação Os fabricantes de SGBD são responsáveis por disponibilizar os drivers de acesso para suas bases de dados. GBC043 Sistemas de Banco de Dados -1 semestre de 2018 3 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 4 JDBC - Arquitetura java.sql.* fornece classes para serem usadas pelas aplicações O driver JDBC do PostgreSQL é do tipo 4 totalmente implementado em Java conhece todo o protocolo de comunicação com o BD e pode acessar o BD sem software extra JDBC Arquitetura Pacote Java.sql Principais classes do JDBC DriverManager-gerencia o driver e cria uma conexão com o banco de dados Connection-é a classe que representa a conexão com o banco de dados Statement- controla e executa uma sentença SQL PreparedStatement uma subclasse de Statement que controla e executa uma sentença SQL ResultSet-contém o conjunto de dados retornado por uma consulta SQL ResultSetMetaData-é a classe que trata dos metadados do banco GBC043 Sistemas de Banco de Dados -1 semestre de 2018 5 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 6 1
JDBC Arquitetura Pacote Java.sql DriverManager O método DriverManager.getConnection () é chamado para efetuar a conexão com o banco de dados; Connection executeupdate () -utilizados pelos comandos insert, update e delete; executequery () -utilizado para o comando select. Etapas básicas 1. Criar e Popular o banco de dados 2. Carregar Driver 3. Definir URL (ou IP) para a conexão 4. Estabelecer conexão 5. Criar objeto do tipo statement 6. Executar uma consulta 7. Processar resultado 8. Fechar Conexão GBC043 Sistemas de Banco de Dados -1 semestre de 2018 7 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 8 Criando e populando o banco de dados Utilizar o pgadmin III para executar os scripts para a criação do banco de dados para a inserção de dados Obter o Driver do PostgreSQL (postgresql.jar) https://jdbc.postgresql.org/download.html JDBC4 Postgresql Driver, Version 42.1.4 Adicionar o caminho para o arquivo postgresql.jarna configuração do CLASSPATH adicione ao Projetopor meio do item Bibliotecas (Libraries) na paleta Projetos GBC043 Sistemas de Banco de Dados -1 semestre de 2018 9 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 10 Class.forName("org.postgresql.Driver"); System.out.println("Driver carregado!"); catch (ClassNotFoundException cnfe) { System.out.println("Não carregou o driver!"); cnfe.printstacktrace(); Criando uma Conexão Connection conexao = null; String url = "jdbc:postgresql://localhost/postgres"; String username = postgres ; String password = 12345 ; conexao = DriverManager.getConnection(url, username, password); System.out.println("Usuario conectado!"); System.out.println("Nao foi possivel conectar."); GBC043 Sistemas de Banco de Dados -1 semestre de 2018 11 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 12 2
Statement sentenca; // Cria uma sentenca para atualizar o banco de dados sentenca = conexao.createstatement(); // Atualiza o BD sentenca.executeupdate( Create, Insert, Update, Delete, "); PreparedStatement A principal característica de um objeto da classe PreparedStatement é que, ao contrário de objetos da classe Statement, ele recebe uma declaração SQL na hora de sua criação Isto permite que a declaração seja enviada ao SGBD para ser compilada na hora de sua declaração. Como resultado, objetos PreparedStatement contêm declarações pré-compiladas Quando um PreparedStatement é executado, o SGBD pode executar seu comando SQL imediatamente sem ter que compilá-lo primeiro GBC043 Sistemas de Banco de Dados -1 semestre de 2018 13 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 14 PreparedStatement - Exemplo String sql = insert into aluno (matricula, nome, sobrenome) values (?,?,?) ; PreparedStatement st = Conexao.prepareStatement(sql); st.setint(1, mat); st.setstring(2, nome); st.setstring(3, sobrenome); int nroinsercoes = st.executeupdate(); Criando uma Sentença para consultar o BD // Cria uma sentenca para consultar o banco de dados sentenca = conexao.createstatement(); // Consulta o conteudo de uma (ou varias) tabela(s) ResultSet conjresposta = sentenca.executequery( "Select from where"); GBC043 Sistemas de Banco de Dados -1 semestre de 2018 15 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 16 Processando e Exibindo o resultado da consulta ResultSetMetaData metadados = ConjResposta.getMetaData(); int nrodecolunas = metadados.getcolumncount(); System.out.println("Tabela X do Banco de Dados nomebanco:"); for(int i = 1; i <= nrodecolunas; i++) System.out.printf("%-8s\t", metadados.getcolumnname(i)); System.out.println(); //Exibindo o conteudo da tabela X while (conjresposta.next()){ for (int i = 1; i <= nrodecolunas; i++) System.out.printf("%-8s\t", conjresposta.getobject(i)); System.out.println(); GBC043 Sistemas de Banco de Dados -1 semestre de 2018 17 Encerrando a conexão //conexao //consulta e/ou atualizacao finally{ // assegura que a instrucao/conexao e fechada // adequadamente try{ sentenca.close(); conexao.close(); catch(exception exception){ exception.printstacktrace(); GBC043 Sistemas de Banco de Dados -1 semestre de 2018 18 3
Execução de uma stored procedure CallableStatement - Exemplo CallableStatement cs = Conexao.prepareCall( procedure"); cs.setint(1, mat); cs.setstring(2, nome); ResultSet rs = cs.executequery(); Para atender ao requisito de diferentes grupos de usuários Utilize a criação de papéis em SQL (visto na aula sobre SQL DDL) consulte o material sobre visões que tem os dados de permissões do dicionário de dados GBC043 Sistemas de Banco de Dados -1 semestre de 2018 19 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 20 SELECT schemaname,viewname FROM pg_views WHERE viewname LIKE '%priv%'; schemaname viewname --------------------+---------------------- information_schema column_privileges information_schema routine_privileges information_schema table_privileges information_schema udt_privileges information_schema usage_privileges information_schema data_type_privileges (6 registros) GBC043 Sistemas de Banco de Dados -1 semestre de 2018 21 SELECT schemaname,viewname FROM pg_views WHERE viewname LIKE '%rol%'; schemaname viewname --------------------+----------------------------------- pg_catalog pg_roles information_schema applicable_roles information_schema administrable_role_authorizations information_schema enabled_roles information_schema role_column_grants information_schema role_routine_grants information_schema role_table_grants information_schema role_udt_grants information_schema role_usage_grants (9 registros) GBC043 Sistemas de Banco de Dados -1 semestre de 2018 22 Exemplos: SELECT * FROM information_schema.role_table_grants WHERE grantee = current_user; SELECT * FROM information_schema.table_privileges WHERE grantee = current_user; Bibliografia Deitel, H. M. Java: como programar.6 ed. São Paulo: Pearson Prentice Hall, 2005. Material Didático produzido pelo professor Marcelo Z. Nascimento GBC043 Sistemas de Banco de Dados -1 semestre de 2018 23 GBC043 Sistemas de Banco de Dados -1 semestre de 2018 25 4
Leitura complementar para casa Capítulo 25do livro: Deitel, H. M. Java: como programar. Practical PostgreSQL: http://www.commandprompt.com/ppbook/ GBC043 Sistemas de Banco de Dados -1 semestre de 2018 26 5