Programação com a BD Programação OOAcesso em Java Curso: Técnico em Informática Campus: Ipanguaçu José José Maria Maria Monteiro Monteiro Pontifícia PontifíciaUniversidade Universidade Católica Católica do do Rio Rio de de Janeiro Janeiro –– PUC PUCPUC PUC---Rio Rio Departamento Departamento de de Informática Informática Clayton Maciel Costa [email protected]@inf.puc [email protected] [email protected] rio.br [email protected] Programação com Acesso a BD “O futuro tem muitos nomes. Para os fracos é o inatingível. Para os temerosos, o desconhecido. Para os valentes é a oportunidade:” Victor Hugo. 1 Programação com Acesso a BD Unidades X: Acesso a Bancos de Dados (JDBC) O QUE É JDBC Conjunto de classes e interfaces (API) escritas em Java que faz o envio de cláusulas sql para qualquer banco de dados relacional; Api de baixo nível e base para api’s de alto nível; Amplia o que você pode fazer com Java; Possibilita o uso de BD’s já instalados; 2 JAVA E JDBC Java : não é mais necessário escrever um programa para cada plataforma; Jdbc : não é mais necessário escrever um programa para cada tipo de bando de dados; Escreva uma vez e execute em qualquer lugar; Tempo de desenvolvimento reduzido; Instalação e manutenção simplificadas; Dissiminação da informação de maneira fácil e econômica; CARACTERÍSTICAS DE JDBC Java e JDBC proporcionam aos programadores de bancos de dados as seguintes características : Fácil mapeamento objeto para relacional. Independência de banco de dados. Computação distribuída. 3 O QUE JDBC FAZ? De maneira simplificada JDBC faz seis coisas : 1 – Estabelece conexão com o banco de dados. 2 – Executa consultas. 3 – Recebe o conjunto de resultados das consultas. 4 – Executa stored procedures. 5 – Obtém informações sobre o banco de dados, tabelas, índices, visões, e stored procedures. 6 – Executa transações. JDBC X ODBC ODBC: – Atualmente o ODBC (Open Database Conectivity) da Microsoft é a interface mais usada para acessar bancos de dados relacionais; – Possibilita conectar quase todos os bancos de dados em quase todas as plataformas ; Por que não usar odbc a partir de java ? 4 JDBC X ODBC ODBC usa uma interface em C; Chamadas de Java para códigos em C trazem desvantagens em: segurança, robustez e portabilidade; O ODBC deve ser instalado em todas as máquinas clientes; – Exceções: – MDAC da Microsoft ARQUITETURAS JDBC Modelo em duas camadas; Modelo em três camadas; 5 ARQUITETURAS JDBC 1 - MODELO EM DUAS CAMADAS Acesso ao Banco LAN ou Intranet Disco Local e Outras Fontes Java e JDBC Máquina Cliente Servidor de BD ARQUITETURAS JDBC Observações – No modelo em Duas Camadas, um applet ou uma aplicação Java conversa diretamente com o SGBD. Neste modelo, cláusulas SQL são enviadas do usuário para o banco, e os resultados são devolvidos para o usuário. O banco pode ser local ou remoto, neste último caso o usuário é conectado à base via rede, que pode ser uma Intranet ou Internet. – Vantagens: • Performance e Gerenciamento da Aplicação. – 1.3-Desvantagens: • Segurança, Aplicação Pesada (Fat). 6 ARQUITETURAS JDBC 2 - MODELO EM TRÊS CAMADAS Lógica de Negócios BD 1 RPC ou CORBA Application GUI code Distribuição Adicional das Lógicas de Negócios BD 2 ARQUITETURAS JDBC Observações – No modelo em Três Camadas os comandos são enviados do usuário para uma camada intermediária de serviços, a qual então manda cláusulas SQL para o banco. O banco processa as cláusulas SQL e manda os resultados para a camada intermediária, a qual então manda os resultados para o usuário. – Vantagens • Utilização em bancos de dados sem servidor (Dbase, Paradox, Access etc); • Possibilidade de uma camada de segurança; • Aplicação “leve” (Thin). – Desvantagens • Performance e Gerenciamento. 7 TIPOS DE DRIVERS JDBC Ponte JDBC-ODBC Acesso Nativo Acesso por Middleware Acesso Direto ao Servidor TIPOS DE DRIVERS JDBC 1 – Ponte JDBC-ODBC Convertem chamadas JDBC em chamadas ODBC e as envia ao driver ODBC; Possibilitam o uso indireto de drivers ODBC; Necessidade de configurar o ODBC; Mais apropriado para uma rede corporativa ou para aplicações usando arquitetura em três camadas; – Ex: sun jdbc-odbc bridge. 8 TIPOS DE DRIVERS JDBC 2 – Acesso Nativo Convertem chamadas JDBC em chamadas nativas do banco e comunicam-se diretamente com o SGBD; Apresentam ganhos de performance; Mais apropriado para uma rede corporativa; – Ex: IBM DB2, BEA WebLogic(SQL Server, Oracle e Sybase), InfoZoom(SQL Server e Access), etc. TIPOS DE DRIVERS JDBC 3 - Acesso por Middleware Convertem chamadas JDBC em um protocolo de rede independente do SGBD e comunicam-se com um gateway que traduz estas requisições para o protocolo específico do SGBD; Possibilitam o uso de diferentes SGBD’s; Esta é a mais flexível alternativa de JDBC; Suportam o acesso pela internet; Precisam de cuidados adicionais com a segurança; –Ex: DataDirect (SQL Server), CONNX (DB2, SQL Server, Access, Oracle, Sysbase, Informix), etc. 9 TIPOS DE DRIVERS JDBC 4 – Acesso Direto ao Servidor Convertem chamadas JDBC para um protocolo de rede usado diretamente pelo SGBD; Suportam o acesso pela Internet; São geralmente específicos para determinada base de dados; – Ex: Atinav (SQL Server), BEA WebLogic(SQL Server e Informix), DataDirect(Oracle e SQL Server), etc. ARQUITETURA JDBC Aplicação Aplicação Aplicação API JDBC JDBC Driver Manager pacote java.sql Protocolo JDBC Driver Tipo 1 Driver Tipo 2 Código nativo Código nativo Driver ODBC Protocolo Proprietário SGBD BD Protocolo Proprietário SGBD BD Driver Tipo 3 Protocolo de rede aberto Middleware Protocolo Proprietário SGBD BD Driver Tipo 4 Protocolo de rede Proprietário SGBD BD 10 CLASSES DE DRIVERS JDBC DIRETOS ODBC-BRIDGE Lista Completa: http://servlet.java.sun.com/products/jdbc/drivers DRIVER MANAGER A classe DriverManager é uma camada de gerenciamento do JDBC; Responsável pela usuários e os drivers; interface entre os 11 JDBC INTERFACES Interface Connection Descrição Representa a conexão com o banco especificado. Dentro do contexo da conexão, cláusulas SQL são executadas e os resultados são devolvidos. DatabaseMetaData Usado para obter informações sobre as bases, tabelas, índices, tipos de campos, etc. Usado para executar cláusulas SQL estáticas e obter os resultados Statement produzidos por elas. PreparedStatement Usado para executar cláusulas SQL que se repetem várias vezes de maneira eficiente e executar consultas parametrizadas. Instâncias de PreparedStatement contêm cláusulas SQL já compiladas. CallableStatement Usado para executar SQL stored procedures. Usado para acessar os dados retornados pelas cláusulas SQL executadas. ResultSetMetaData Usado para obter informações sobre o conjunto dos resultados de uma cláusula SQL. ResultSet TRANSAÇÕES EM JDBC JDBC provê um modelo de controle de transações; Cada nova conexão é iniciada no modo autocommit; JDBC implicitamente emite um commit após cada Statement executado; Podemos desabilitar o autocommit; Após um commit ou um rollback, automaticamente é iniciada uma nova transação; Ex: con.setAutoCommit(false); ... con.commit(); 12 STORED PROCEDURES COM JDBC Permite usar as particularidades do SGBD; Diminui a portabilidade através dos SGBD’s; Portabilidade - SQL 92; CENÁRIO DE UMA APLICAÇÃO JDBC Client DriverManager Connection 1 getConnection 2 repeat ResultSet createStatement 3 6 Statement executQuery 4 next 5 get 7 8 close close 13 MAPEAMENTO ENTRE TIPOS SQL E TIPOS JAVA SQL type Java type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.lang.Bignum DECIMAL java.lang.Bignum BIT boolean TINYINT byte SMALLINT short INTEGER int MAPEAMENTO ENTRE TIPOS SQL E TIPOS JAVA SQL type Java type BIGINT long REAL float FLOAT double DOUBLE double BINARY byte[] VARBINARY byte[] LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp 14 MAPEAMENTO ENTRE TIPOS SQL E TIPOS JAVA Java type SQL type String VARCHAR OU LONGVARCHAR java.lang.Bignum NUMERIC boolean BIT byte TINYINT short SMALLINT int INTEGER long BIGINT float REAL double DOUBLE byte[] VARBINARY OU LONGVARBINARY DATE java.sql.Date ACESSANDO BD’S EM DUAS CAMADAS 15 PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA NESTE EXEMPLO UTILIZAREMOS O DRIVER JDBC-ODBC BRIDGE DA SUN EM UMA ARQUITETURA DE DUAS CAMADAS. PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 1: IMPORTAÇÃO DOS PACOTES NECESSÁRIOS PASSO 2: REGISTRO DO(S) DRIVER(S) PASSO 3: ABERTURA DA CONEXÃO PASSO 4: EXECUÇÃO DE CONSULTAS E RECUPERAÇÃO DOS RESULTADOS PASSO 5: FECHAMENTO DA CONEXÃO 16 PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 1: IMPORTAÇÃO DOS PACOTES NECESSÁRIOS import java.sql.*; PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 2: REGISTRO DO(S) DRIVER(S) Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver"); 17 PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 3: ABERTURA DA CONEXÃO String url = "jdbc:odbc:my-dsn"; Connection con = DriverManager.getConnection(url,"usuario","senha"); PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 4: EXECUÇÃO DE CONSULTAS E RECUPERAÇÃO DOS RESULTADOS Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("Select a, b, c, d from Table1"); while (rs.next()){ int a = rs.getInt(1);// int a = rs.getInt(“a”);// BigDecimal b = rs.getBigDecimal(2,0); char c[] = rs.getString(3).toCharArray(); boolean d = rs.getBoolean(4); } OBS: O cursor de um ResultSet é inicialmente posicionado antes da primeira linha da tabela. 18 PROCEDIMENTOS NECESSÁRIOS PARA ACESSAR BD’S UTILIZANDO JAVA PASSO 5: FECHAMENTO DA CONEXÃO stmt.close(); con.close(); PreparedStatement Statement pré-compilado – Apresenta ganhos de eficiência quando várias consultas similares são enviadas com parâmetros diferentes Uma String com a instrução SQL é preparada previamente, deixando-se “?” no lugar dos parâmetros Parâmetros são inseridos em ordem, com setXXX() onde XXX é um tipo igual aos retornados pelos métodos de ResultSet 19 PreparedStatement ... String sql = “INSERT INTO Conta VALUES(?, ?, ?)”; PreparedStatement cstmt = con.preparedStatement(sql); cstmt.setString(1, “123”); cstmt.setDouble(2, 0); cstmt.setString(3, “C”); cstmt.executeUpdate(); ... Stored Procedures Stored Procedures (Proc. Armazenados) – Procedimentos desenvolvidos em linguagem proprietária do SGBD (PL-SQL, Transact-SQL, etc) – Podem ser chamados através de objetos CallableStatement – Parâmetros são passados da mesma forma que em instruções PreparedStatement Sintaxe – con.prepareCall(“{call proc_update}”); – con.prepareCall(“{call proc_update(?)}”); – con.prepareCall(“{? = call proc_update(?)}”); 20 Stored Procedures ... String command = "{call INS_CLIENTES(?,?)}"; CallableStatement cstmt = con.prepareCall (command); cstmt.setInt(1, cliente_id); cstmt.setString(2, nome_cliente.trim()); cstmt.execute(); ... Stored Procedures ... String command = "{? = call INS_CLIENTES(?,?)}"; CallableStatement cstmt = con.prepareCall (command); cstmt.setInt(1, cliente_id); cstmt.setString(2, nome_cliente.trim()); ResultSet rs = cstmt.executeQuery(); ... 21 Stored Procedures ... String command = "{call INS_CLIENTES(?, ?, ?)}"; CallableStatement cstmt = con.prepareCall (command); cstmt.registerOutParameter(3, 3); cstmt.setInt(1, cliente_id); cstmt.setString(2, nome_cliente.trim()); cstmt.execute(); System.out.println("Retorno: " + cstmt.getInt(3)); ... Metadados Classe DatabaseMetaData – Permite obter informações relacionadas ao banco de dados Classe ResultSetMetaData – Permite obter informações sobre o ResultSet, como por exemplo quantas colunas e linhas existem na tabela de resultados, o nome das colunas, etc. 22 Metadados ... Connection con; DatabaseMetaData dbdata = con.getMetaData(); String dbname = dbdata.getDatabaseProductName(); ... ... ResultSet rs; ResultSetMetaData meta = rs.getMetaData(); int col = meta.getColumnCount(); String [] nomeCols = new String[col]; for (int i=0; i<col; i++) nomeCols[i] = meta.getColumnName(i); ... MEDIDAS DE SEGURANÇA Não é seguro transmitir o login e a senha do usuário através da Internet; Solução: usar procedimentos armazenados e tirar o direito de modificar diretamente os dados; 23 JDBC 2.0 Supera diversas limitações da versão 1.0: – – – – – navegação bidirecional posicionamento absoluto atualizações/inserções/remoções via cursor row sets (cursores desconectados) connection pooling (reutilização de conexões) Características são opcionais – Muitos drivers ainda não implementam estas novas características JDBC COMO INFRA-ESTRUTURA JDBC proposta como a infra-estrutura de baixo nível para integração de Java com BDs Soluções de alto nível (sobre JDBC): – SQLJ (Oracle, IBM, Sun...) - integração Java/SQL (Embedded SQL, SQL Types e SQL Routines) – Java Data Objects (Sun) - persistência transparente (possivelmente através de mapeamento objeto-relacional) – soluções proprietárias (ex.: componentes JBuilder) 24 EXERCÍCIOS Altere as definições de banco vistas na aula para que poupanças e contas especiais possam ser armazenadas no banco de dados. 25