Java Conexão com Banco de Dados Introdução • funcionalidade primordial em qualquer sistema; • “é a habilidade para comunicar-se com um repositório de dados”. • A Linguagem Java possui uma Application Programming Interface (API) que possibilita o acesso a BDs; • um modelo de conexão uniforme; • API é a Java DataBase Connectivity (JDBC) API básica • • • • • Entrada/saída (java.io) Interface gráfica com o usuário (java.awt) Comunicação em rede (java.net) Coleções (java.util) Applets (java.applet) API básica • • • • • Componentes (java.beans) Objetos distribuídos Java-Java (java.rmi) Segurança (java.security) Conectividade com BDs (java.sql) Internacionalização e formatação (java.text) Extensões-padrão à API Java • • • • Interface gráfica c/ o usuário (javax.swing) Extensão de servidores (javax.servlet) Conectividade com BDs (javax.sql) Objetos distribuídos Java-* (org.omg.CORBA) Extensões-padrão à API Java • • • • • • Componentes de negócios (javax.ejb) Diretórios (javax.naming) Transações (javax.transaction) Correio eletrônico (javax.mail) Telefonia (javax.phone) ... Integração com outras linguagens • Algumas vezes é necessária a integração com módulos em outras linguagens (eficiência, funcionalidade específica da plataforma, reutilização de código legado) • Java Native Interface realiza integração com código nativo • Código externo é encapsulado em classes com métodos nativos • Conseqüência: perda de portabilidade JDBC • O que é a JDBC? – consiste em uma biblioteca; – implementada em Java; – disponibiliza classes e interfaces para o acesso ao banco de dados; • Para cada banco de dados existe uma implementação: Drives, no caso interfaces que devem ser implementadas; • São interfaces porque levam em considerações particularidades; API JDBC • Promove independência do servidor de dados para a aplicação (usa drivers substituíveis) • Pode ser usada com quaisquer dados tabulares (como tabelas relacionais, planilhas, diretórios) • Usa strings SQL como argumentos para as requisições ao servidor (dinâmica) Drivers JDBC Disponíveis • • • • • • • • • MS SQL Server IBM DB2 Oracle Interbase MySQL Informix Sybase ... ODBC/OLE DB Tipos de JDBC • JDBC-ODBC: – Também conhecido como Ponto JDBCODBC; – restrito à plataforma Windows; – utiliza ODBC para conectar-se com o banco de dados; – converte métodos JDBC em chamadas às funções do ODBC; – geralmente é usado quando não há um driver “puro-java”; Tipos de JDBC • Driver API-Nativo: – traduzir as chamadas realizadas com o JDBC para realizadas com a API cliente do banco de dados utilizado; – Funciona +- como a JDBC-ODBC; – pode ser que sejam necessários outras soluções; Tipos JDBC • Driver de Protocolo de Rede: – Converte a chamada por meio do JDBC para um protocolo de rede; – Independe do banco de dados que está sendo utilizado; – devido ao fato de se utilizar de protocolos que não se prendem a um determinado banco de dados; – modelo de conexão mais flexível e abrangente; Tipos JDBC • Driver nativo: – converte as chamadas JDBC diretamente no protocolo do banco de dados; – é implementado na linguagem Java; – normalmente independe de plataforma; – escrito pelos próprios desenvolvedores; – muito flexível; – tipo mais recomendado para ser usado e mais utilizado no mercado; Pacote java.sql • fornece a API para acesso e processamento de dados; • geralmente acessa uma base de dados relacional; • principais classes e interfaces: – DriverManager, responsável por criar uma conexão com o banco de dados; – Connection, classe responsável por manter uma conexão aberta com o banco; – Statement, gerencia e executa instruções SQL; – PreparedStatement, gerencia e executa instruções SQL, permitindo também a passagem de parâmetros em uma instrução; – ResultSet, responsável por receber os dados obtidos em uma pesquisa ao banco. DriverManager • responsável pelo gerenciamento de drivers JDBC; • estabelece conexões a bancos de dados; // Carregando um driver em tempo de execução Class.forName("org.gjt.mm.mysql.Driver"); // Tentando estabelecer conexão com o Banco de Dados Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/aula? autoReconnect=true", "conta","senha"); • retorna uma implementação para a interface Connection; Connection • representa a conexão com o banco de dados; • proporcionar informações sobre as tabelas do banco através de transações; • métodos desta interface freqüentemente utilizados (SUN, 2007): – commit(), executa todas as alterações feitas com o banco de dados pela atual transação. – rollback(), desfaz qualquer alteração feita com o banco de dados pela atual transação. – close(), libera o recurso que estava sendo utilizado pelo objeto. • Se preocupa em como o banco irá se comportar; Statement • Implementação de uma Interface que fornece métodos para executar uma instrução SQL; • Não aceita a passagem de parâmetros; • principais métodos da Interface Statement são (SUN, 2007): – executeUpdate(), executa instruções SQL do tipo: INSERT, UPDATE e DELETE; – execute(), executa instruções SQL de busca de dados do tipo SELECT; – close(), libera o recurso que estava sendo utilizado pelo objeto. // Instanciando o objeto statement (stmt) Statement stmt = conn.createStatement(); // Executando uma instrução SQL. stmt.executeUpdate(“INSERT INTO ALUNO VALUES (1, ‘Pedro da Silva’)”); PreparedStatement • A interface PreparedStatement possui todos os recursos da interface Statement; • acrescentando a utilização de parâmetros em uma instrução SQL; • métodos da interface PreparedStatement são (SUN, 2007): – – – – execute(), consolida a instrução SQL informada; setDate(), método utilizado para atribuir um valor do tipo Data; setInt(), utilizado para atribuir valores do tipo inteiro; setString(), método utilizado para atribuir valores do tipo Alfa Numéricos. PreparedStatement // Instanciando o objeto preparedStatement (pstmt) PreparedStatement pstmt = conn.prepareStatement("UPDATE ALUNO SET NOME = ?"); // Setando o valor ao parâmetro pstmt.setString(1, “MARIA RITA”); ResultSet • Esta interface permite o recebimento e gerenciamento do conjunto de dados resultante de uma consulta SQL; • métodos capazes de acessar os dados; • métodos desta interface freqüentemente utilizados (SUN, 2007): – next(), move o cursor para a próxima linha de dados, já que o conjunto de dados retornados pela consulta SQL é armazenado como em uma lista. – close(), libera o recurso que estava sendo utilizado pelo objeto. – getString(String columnName), recupera o valor da coluna informada como parâmetro, da linha atual do conjunto de dados recebidos pelo objeto ResultSet. ResultSet //Recebendo o conjunto de dados da consulta SQL ResultSet rs = stmt.executeQuery("SELECT id, nome FROM ALUNO"); // Se houver resultados, posiciona-se o cursor na próxima linha de dados while (rs.next()) { // Recuperando os dados retornados pela consulta SQL int id = rs.getInt("id"); String nome = rs.getString("nome"); } • métodos como o getInt(), getString() para recuperar os valores; Tipos de Drivers JDBC • Tipo 1: driver Java invoca driver ODBC nativo • Tipo 2: driver Java invoca API cliente proprietária nativa • Tipo 3: driver acessa servidor através de middleware de banco de dados • Tipo 4: driver acessa servidor através de protocolo de rede nativo do servidor • Tipos 1 e 2: soluções provisórias; Tipos 3 e 4: 100% Java, podem ser carregados via rede Driver Tipo 1 Driver Tipo 2 Driver Tipo 4 Driver Tipo 3 Exemplo import java.awt.Frame; import java.awt.List; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Aula { private Connection conn; private PreparedStatement pstmt; private Statement stmt; private ResultSet rs; Exemplo public void open() { try { Class.forName("org.gjt.mm.mysql.Driver"); conn = DriverManager.getConnection( "jdbc:mysql://localhost/aula04?autoReconnect=true", "root", ""); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } Exemplo public void close() { try { if (stmt != null) stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } Exemplo public void inserir(){ try { // Abrindo a conexão com o banco open(); // Instanciando o objeto statement (stmt) stmt = conn.createStatement(); // Executando uma instrução SQL. stmt.executeUpdate( "INSERT INTO ALUNO VALUES (1, 'Pedro da Silva')"); // Fechando a conexão com o banco close(); } catch (SQLException e) { // Fechando a conexão com o banco close(); e.printStackTrace(); } } Exemplo public void alterar(){ try { // Abrindo a conexão com o banco open(); // Instanciando o objeto preparedStatement (pstmt) pstmt = conn.prepareStatement("UPDATE ALUNO SET NOME = ? Where id = 1"); // Setando o valor ao parâmetro pstmt.setString(1, "MARIA RITA"); // Fechando a conexão com o banco pstmt.execute(); close(); } catch (SQLException e) { // Fechando a conexão com o banco close(); e.printStackTrace(); } } Exemplo public ResultSet buscarAlunos(){ try { open(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT id, nome FROM ALUNO"); return rs; } catch (SQLException e) { close(); e.printStackTrace(); } return null; } Exemplo public void imprimirAlunos() throws SQLException{ JTextArea output = new JTextArea(20,30); Banco aula = new Banco(); aula.rs = aula.buscarAlunos(); while (aula.rs.next()){ output.setText("Id: " + aula.rs.getInt("id") + " - " + "Nome: " + aula.rs.getString("nome")+"\n"); } JFrame janela = new JFrame("Janela"); janela.setLocation(300, 300); janela.setSize(300, 300); janela.add(new JScrollPane(output)); janela.setVisible(true); } Exemplo public static void main(String[] args ){ Aula aula = new Aula(); aula.inserir(); aula.alterar(); aula.rs = aula.buscarAlunos(); try { aula.imprimirAlunos(); } catch (SQLException e) { e.printStackTrace(); } } Java e a Web • Java fornece três alternativas distintas para aplicações Web: – Applets (cliente) – Servlets (servidor) – JavaServer Pages (servidor) Applets • Applets são módulos de programa Java que executam no contexto de uma página Web • Carga de applets é feita através da tag <applet> • Applets podem comunicar-se com o servidor de origem (Ex.: JDBC, sockets, etc) • Applets são inerentemente gráficas Applets - Recursos • Applets podem comunicar-se com o servidor de origem para E/S remota, conexão com BD, invocações remotas, etc • Applets podem orientar a navegação do browser • Applets numa mesma página podem comunicar-se Applets - Restrições de Segurança • Applets executam em um ambiente restrito (sandbox) como medida de segurança • Proibições comuns: – E/S em arquivos locais – comunicação com outros servidores que não o de origem – execução de programas locais – carregar bibliotecas e acessar código nativo Servlets • São módulos de programa Java que executam no contexto de um servidor • Paradigma requisição-serviço-resposta • Usadas principalmente em servidores Web – paradigma coerente com protocolo HTTP – 1º) browser envia requisição (GET/POST) – 2º) servlet realiza serviço – 3º) página HTML é gerada dinamicamente como resposta JavaServer Pages • Páginas HTML que possuem scripts (roteiros) para o servidor e embutem tags especiais • Similares às Active Server Pages • Linguagem script padrão: Java (outras podem ser usadas) • São traduzidas em tempo de execução para servlets Java • Novas tags podem ser adicionadas JavaServer Pages - Recursos • Possuem acesso às mesmas funcionalidades que as Servlets, com maior simplicidade • Templates JSPs são de fácil manutenção (similaridade c/ HTML) • JSPs acessam JavaBeans, facilitando a separação das lógicas da aplicação e da interface c/ o usuário <html> <body> <% String sexo,nome1,nome2,email; nome1 = request.getParameter(“firstname”); nome2 = request.getParameter(“lastname”); email = request.getParameter(“email”); sexo = request.getParameter(“sex”); %> Hello, <%= nome1 %> </body> </html> Servlet Engines • Softwares que habilitam um servidor Web a suportar servlets Java e JavaServer Pages • Facilitam a aceitação da tecnologia Servlet • Contornam a guerra tecnológica MS x Sun • Alguns produtos: – Allaire JRun (IIS, NES, Apache) – New Atlanta ServletExec (IIS, NES, Mac OS (vários)) Servidores c/ Suporte Embutido a Servlets/JSP • • • • • • Apache Web Server IBM Websphere Sun/Netscape iPlanet Oracle Application Server SilverStream Application Server outros... Conclusões Java - Tabus e Verdades • Java é lento? – os principais gargalos são a rede e o banco de dados – mecanismos de otimização: JIT e HotSpot™ – a complexidade da execução de código Java é constante - o desempenho do hardware tem evolução geométrica – os benefícios da tecnologia tornam o desempenho absoluto menos relevante Java - Tabus e Verdades • Java é útil apenas para animações na Web? – Java se mostra muito adequada para aplicações cliente-servidor (principalmente lado servidor) – Java possui um modelo de componentes e APIs excelentes para o desenvolvimento de aplicações corporativas multi-camadas (GUI+BO/BP+BD) – Poucas aplicações não são adequadas para Java (por requisitos de desempenho) Conclusões • A tecnologia Java está madura e abrange as mais diversas aplicações • A tecnologia Java concede ao desenvolvedor total independência de fornecedores, ao ser aberta, multiplataforma e baseada em padrões • A tecnologia Java fornece aos usuários um excelente suporte a ambientes heterogêneos e preserva o investimento em hardware e software http://www.javasoft.com • Java 2 Software Development Kit • JavaServer Web Development Kit • Documentação: • Tutorial Java • Documentação do Java 2 SDK (APIs, guias, etc) • Documentação de outras APIs • Especificação da linguagem • Especificação da máquina virtual • Artigos, fóruns, notícias, bugs, etc Referências DEITEL, Harvey M. Java: como programar. 6 ed. São Paulo: Pearson Prentice Hall, 2005. THOMPSON, Marco Aurélio. Java 2 & banco de dados. São Paulo: Érica, 2002. SUN, MicroSystem. Java Technology. Disponivel em http://java.sun.com. Acessado em 12/10/2007.