320 likes | 419 Views
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
E N D
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/package-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 Banco de Dados API Nativa do Banco
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 Rede Middleware ou Servidor JDBC Driver Manager 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 utilizando-se o protocolo do próprio SGBD; Aplicação Banco de Dados Rede JDBC Driver Manager
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.*; publicclass AcessoBDSimples { publicstaticvoid 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 • 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”
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()); } publicvoid addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); } public String toString() { returnnew Formatter().format("%1$tY-%1$tm-%1$td", gcal).toString();} } /** "Client" */ class FacadePattern { publicstaticvoid 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 ProjetoLivro do GoF • Creational Patterns • Factory, Abstract Factory, Singleton, Builder, Prototype • Structural Patterns • 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/Patterns2ndEd/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)
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