Conexão com Bancos de Dados Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense Noção Geral ● ● ● ● A aplicação chama a biblioteca JDBC A biblioteca carrega o driver que “entende” o SGDB Após, a aplicação pode se conectar e enviar requisições ao SGBD Pacote principal: java.sql JDBC ● Java Database Connectivity; ● Padrão de acesso a BD’s relacionais através de Java: ● ● ● API comum; Os fabricantes de drivers JDBC implementam aspectos específicos; Qualquer aplicação Java pode acessar um SGBD através do JDBC; JDBC é semelhante ao ODBC, mas é escrito em Java. "http://java.sun.com/javase/6/docs/api/java/sql/packag e-summary.html" JDBC – Tipos de drivers ● Classe 1: Ponte ODBC-JDBC: Aplicações para Windows com o BD registrado; JDBC – Tipos de drivers – Classe 1 ● ● ● ● ODBC fornece uma interface uniforme para que aplicações em Windows acessem bancos de dados de fornecedores diferentes; O JDK é distribuído com um driver desse tipo; Uma aplicação que utilize este drive se comunica indiretamente com o banco de dados através da ponte JDBC-ODBC; Este uso requer código nativo de acesso ao banco na máquina cliente. JDBC – Tipos de drivers ● Classe 2: Acesso nativo: Usa as bibliotecas client do SGBD; Aplicação JDBC Driver Manager API Nativa do Banco Banco de Dados JDBC – Tipos de drivers – Classe 2 ● ● ● Drivers híbridos, parcialmente escritos em Java, mas que também utilizam código nativo; Usualmente, são drivers nativos com um wrapper Java; Por utilizarem código nativo, também são menos portáveis. JDBC – Tipos de drivers ● Classe 3: Acesso por middleware: Não há necessidade de configuração da máquina cliente. A aplicação se comunica com o middleware através de sockets. O middleware converte a chamada de alto nível da API na chamada ao SGBD; Aplicação JDBC Driver Manager Rede Middleware ou Servidor Banco de Dados JDBC – Tipos de drivers – Classe 3 ● ● ● Chamadas ao banco de dados através da rede, utilizando HTTP; A interação real com o banco de dados estaria entre os servidores de middleware e banco de dados; A aplicação é 100% Java. JDBC – Tipos de drivers ● Classe 4: Acesso direto ao servidor utilizandose o protocolo do próprio SGBD; Aplicação JDBC Driver Manager Rede Banco de Dados JDBC – Tipos de drivers – Classe 4 ● ● ● Drivers 100% Java; São portáveis e mais eficientes se comparados com os que exigem tradução; Diferentemente dos drivers da classe 3, estes implementam o acesso ao servidor utilizando bibliotecas da própria linguagem Java. JDBC ● 5 passos básicos: ● Registrar o driver na aplicação Conectar no SGBD Executar sentenças SQL e procedures Processar o resultado recebido Fechar a conexão Principais classes da API: ● DriverManager, Connection, Statement, ResultSet Referência: http://java.sun.com/javase/6/docs/api/java/sql/package -summary.html JDBC – Passos Básicos ● Registro do driver: O driver é registrado automaticamente quando a classe é carregada na aplicação; Class.forName("org.postgresql.Driver"); // PostgreSQL Class.forName("com.mysql.jdbc.Driver"); // MySQL ● Inicializador estático que registra o driver JDBC – Passos Básicos ● Conexão com o SGBD: Após o registro do driver, precisamos fornecer informações ao DriverManager para a conexão; Connection con = DriverManager.getConnection(url, login, senha); ● url: URL de conexão JDBC jdbc:postgresql://localhost: 5432/cursodb jdbc:mysql://localhost:3306/cursodb ● login: usuário com direitos de acesso ao banco de dados; ● senha: senha para autenticação. ● Sintaxe geral de urls: “jdbc:<subprotocol>://<server>:<port>/<database>” JDBC – Passos Básicos ● Execução de sentenças SQL Para a execução de sentenças devemos criar, por exemplo, um Statement e obter o resultado através de um ResultSet; ● ● Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(“select * from db.empregados e”); Neste caso, o resultado é armazenado num ResultSet e pode ser percorrido com métodos definidos nesta classe JDBC – Passos Básicos ● Exemplo de estrutura básica de uma aplicação import java.sql.*; public class AcessoBDSimples { public static void main(String[] args) { try { Class.forName("org.postgresql.Driver"); Connection con = (Connection) DriverManager.getConnection ("jdbc:postgresql://localhost:5432/cursodb","bazilio","bazilio"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from prod p;") while (rs.next()) { System.out.print("Nome: " + rs.getString("PNAME")); System.out.println("Cidade: " + rs.getString("CITY")); } stmt.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("A classe do driver de conexão não foi encontrada!"); } catch (SQLException e) { System.out.println("O comando SQL não pode ser executado!"); } } } Alternativas para Criação de Sentenças ● ● Statement: executa consultas simples, sem parâmetros Prepared Statement: executa consultas pré-compiladas com ou sem parâmetros PreparedStatement modificaTabela = con.prepareStatement ("UPDATE TABELA SET CAMPO1 = ? WHERE CAMPO2 LIKE ? "); modificaTabela.setInt(1, 75); modificaTabela.setString(2, “Sirius”); modificaTabela.executeUpdate(); ● Callable Statement: executa chamadas à stored procedures CallableStatement cs = con.prepareCall ("{call NOME_PROC}"); ResultSet rs = cs.executeQuery() Exercício ● Gere 1 tabela contendo os dados básicos de uma conta, insira manualmente (no SGBD) alguns clientes e liste estes clientes utilizando um programa em Java. Padrões de Projeto ● ● ● Um padrão de projeto é uma solução comum para um problema comum encontrado no desenvolvimento de software (Sun); Sedimentação do conceito com o lançamento do livro: “Design Patterns: Elements of Reusable Object-Oriented Software”; Não está amarrado à nenhuma linguagem OO. Padrões de Projeto (GoF – Gang of Four) Padrões de Projeto ● ● A utilização desses padrões usualmente implica em algumas vantagens: Facilidade de comunicação: padrões possuem nomes, os quais resumem uma solução que deve ser de conhecimento comum entre equipes de desenvolvimento; Credibilidade: sua implementação estará utilizando soluções amplamente testadas e aprovadas; Facilidade de manutenção: padrões tendem a reduzir o acoplamento entre componentes, o que implica num sistema de fácil manutenção Não implica em códigos “mais enxutos” Padrões de Projeto – Exemplo: Façade (Facade, Fachada) Exemplo de Uso do Façade Exemplo de Uso do Façade import java.util.*; /** "Façade" */ class UserfriendlyDate { GregorianCalendar gcal; public UserfriendlyDate(String dataGreg) { String[] a = dataGreg.split("-"); gcal = new GregorianCalendar(Integer.valueOf(a[0]).intValue(), Integer.valueOf(a[1]).intValue()-1, Integer.valueOf(a[2]).intValue()); } public void addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); } public String toString() { return new Formatter().format("%1$tY-%1$tm-%1$td", gcal).toString();} } /** "Client" */ class FacadePattern { public static void main(String[] args) { UserfriendlyDate d = new UserfriendlyDate("1980-08-20"); System.out.println("Date: "+d); d.addDays(20); System.out.println("20 days after: "+d); } } Padrões de Projeto ● Usualmente são apresentados seguindo uma estrutura bem definida, como: ● Nome do padrão para facilitar a citação Descrição do uso, apresentando o problema, contextualização e implicações Solução para o problema apresentado, usualmente apresentada no formato de diagramas Exemplo: Nome: Façade Descrição: Necessário quando temos um conjunto de subsistemas e algumas funcionalidades como combinação destes subsistemas Solução Padrões de Projeto Livro do GoF ● Creational Patterns ● Structural Patterns ● Factory, Abstract Factory, Singleton, Builder, Prototype Adapter, Bridge, Composite, Decorator, Façade, Flyweight, Proxy Behavioral Patterns Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Momento, Observer, State, Strategy, Template, Visitor Padrões J2EE ● ● ● ● Inspiraram o surgimento de diversos “novos” padrões, os quais são comumente associados à linguagem Java Entretanto, assim como os da GoF, não estão amarrados à nenhuma linguagem OO específica http://www.corej2eepatterns.com/Patterns2ndE d/index.htm Destes, podemos destacar o DAO (Data Access Object) Padrões de Projeto - DAO ● ● ● ● Visa a separação entre a lógica de acesso a dados da lógica do negócio; Com este padrão podemos utilizar diferentes fontes de dados e isolar a lógica de negócio de possíveis modificações na camada de acesso a dados; Ou seja, um DAO deve esconder todos os detalhes de implementação de acesso a fontes de dados. Pode ser utilizada em diversos cenários (web, desktop, mobile, em aplicação distribuída ou centralizada) Padrões de Projeto - DAO DAO em Java ● Neste caso, o padrão DAO é bastante útil para separar a lógica de negócio das diversas tecnologias de persistência existentes: ● JDBC, JDO, EJB CMP, TopLink, Hibernate, iBATIS, openJPA e muitas outras Ou seja, com este padrão permitimos que estas tecnologias possam ser substituídas ou atualizadas sem prejuízo ao restante da aplicação