Acessando dados em Java com JDBC



Documentos relacionados
Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia

Banco de Dados. Banco de Dados. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Acesso a Bancos de Dados (JDBC) Autor: Cleyton Maciel (clayton.maciel@ifrn.edu.br) Adaptação: Pedro Baesse (pedro.baesse@ifrn.edu.

Acesso a Bancos de Dados em Java (JDBC)

Programação com Acesso a Banco de Dados

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M

Aula 1 Acesso a Banco de Dados

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

Integrando Java com Banco de Dados

Programação Orientada a Objetos JDBC Java Database Connectivity

JDBC Acessando Banco de Dados

Java Básico JDBC. Razer Anthom Nizer Rojas Montaño Banco de Dados: JDBC

Fernando Freitas Costa. Pós-Graduando em Gestão e Docência Universitária. blog.fimes.edu.br/fernando nando@fimes.edu.br

Capítulo 1. Acesso a Banco de Dados com JDBC (Java Database Connectivity) e o Padrão de Projeto DAO (Data Access Object)

Desenvolvimento Web TCC Turma A-1

Java JDBC Aplicação Java com Acesso a um SGBD. Ricardo Terra (rterrabh [at] gmail.com) Java JDBC Maio, 2010

JDBC. Java DataBase Connectivity

JDBC. Prof. Márcio Bueno

Java 2 Standard Edition Fundamentos de

Conectividade de Banco de Dados Java JDBC

Banco de Dados. Sérgio Luiz Ruivace Cerqueira

JAVA JDBC Java Database Connectivity

Leonardo Gresta Paulino Murta

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

Java e Conexão com Banco de Dados

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs?

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

JAVA JDBC COMO FUNCIONA. Programação Orientada a Objetos Flávio de Oliveira Silva 315. Programação Orientada a Objetos Flávio de Oliveira Silva 316

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

Figura 1. A Classe Java

Acesso a Bancos de Dados (JDBC) Desenvolvimento de Aplicações em Java O QUE É JDBC JAVA E JDBC CARACTERÍSTICAS DE JDBC

Programação com Acesso a BD. Programação com OO Acesso em Java

Manipulação de Banco de Dados com Java 1. Objetivos

JDBC Java Database Connectivity

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Curso de Java. Acesso a banco de dados através de JDBC. Todos os direitos reservados Klais

Linguagens de Programação

Programação Orientada a Objetos (DPADF 0063)

Programação em Rede JDBC

Acessando bancos de dados com o JDBC

Especialização em web com interfaces ricas

JDBC JDBC. JDBC - Arquitetura. JDBC Arquitetura Pacote Java.sql. Java Database Connectivity JDBC PostgreSQL

No cabeçalho de cada arquivo Java onde haverá acesso a banco de dados, o seguinte Import deve ser colocado:

JDBC (Fundamentos) Sang Shin Java Technology Architect Sun Microsystems, Inc.

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em

JavaServer Faces JSF

Desenvolvimento de Sistemas de Informação

Orientação a Objetos

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha

Acesso a banco de dados

Introdução à Tecnologia Java 02/2012. Java Aula 05 12/09/2012. Celso Olivete Júnior.

Agenda. Instalação e configuração. Processamento de comandos SQL com JDBC. Driver JDBC Criação da classe de conexão

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Padrões de Projeto e Persistência com DAO

JPA: Persistência padronizada em Java

De forma simples, para a execução de comandos SQL com JDBC, precisa-se da instancia de três classes Java. São elas: Nome da classe Função

Banco de Dados. Prof. Leonardo Barreto Campos 1

(UFF) JDBC (I) TEPIS II

Módulo 5 - JDBC java.sql - Conexão com Banco de Dados

JDBC DRIVER. Objetivo: Possibilitar aplicações não Zim de se conectar a um banco de dados Zim utilizando as normas JDBC.

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Integrando Java e Banco de Dados (Tutorial) por Jorge Henrique Cabral Fernandes

Curso de Java Módulo III JDBC Fábio Mengue Centro de Computação - Unicamp

Persistência de Classes em Tabelas de Banco de Dados

Banco de Dados. Banco de Dados Parte 2. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Introdução ao SQL. O que é SQL?

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

Aula 4 JDBC - Java Database Connectivity

SQL BANCO DE DADOS. Linguagem de consulta SQL. Linguagem de consulta SQL. Linguagem de Consulta Estruturada

Curso: Desenvolvimento Java

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Java na WEB Banco de Dados

Capítulo 35. Sistemas de Banco de Dados. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Treinamento em PHP. Aula 7. Ari Stopassola Junior

Transações Seguras em Bancos de Dados (MySQL)

Execução de Instruções SQL

JAVA 14 ODBC / JDBC Aceder a Bases de Dados através da Internet. Vitor Vaz da Silva

Programação SQL. Introdução

Drive MySql de conexão para Eclipse

BD SQL Server. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Programação Orientada a Objetos II

Android e Bancos de Dados

Desenvolvimento de Aplicações para Internet Aula 9

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

Banco de dados POO Márcio Delamaro. Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP

EXERCÍCIOS PRÁTICOS. Banco de Dados

UFG - Instituto de Informática

Disciplina: Unidade V: Prof.: Período:


Transcrição:

Acessando dados em Java com JDBC Daniel Destro do Carmo Softech Network Informática daniel@danieldestro.com.br

Objetivo do curso O que é JDBC? Arquitetura da API Detalhes e uso da API

O que é JDBC? Diferentes bancos de dados relacionais possuem diferentes formas de se comunicar com uma aplicação que necessite acessar os seus dados. Aplicação Oracle SQL Server MySQL Isto causa um grande problema de codificação e manutenção nas aplicações que precisam trabalhar com diversos banco de dados e também requer o aprendizado de uma nova API para cada BD diferente. Isso não torna a aplicação flexível.

O que é JDBC? A Sun desenvolveu a API JDBC, com a intenção de uniformizar os acessos aos diferentes bancos de dados relacionais, dando maior flexibilidade aos sistemas. JDBC = Java DataBase Connectivity Aplicação JDBC Oracle SQL Server MySQL Com JDBC as chamadas ao BD são padronizadas, apesar de que os comandos SQL podem variar de banco para banco, se não for usado o SQL padrão.

O que é JDBC? A biblioteca da JBDC provê um conjunto de interfaces de acesso ao BD. Uma implementação em particular dessas interfaces é chamada de driver. Os próprios fabricantes dos bancos de dados (ou terceiros) são quem implementam os drivers JDBC para cada BD, pois são eles que conhecem detalhes dos BDs. Cada BD possui um Driver JDBC específico (que é usado de forma padrão - JDBC). A API padrão do Java já vem com o driver JDBC-ODBC, que é uma ponte entre a aplicação Java e o banco através da configuração de um recurso ODBC na máquina. O drivers de outros fornecedores devem ser adicionados ao CLASSPATH da aplicação para poderem ser usados. Desta maneira, pode-se mudar o driver e a aplicação não muda.

O que é JDBC? Tipos de Drivers JDBC: Tipo 1 - Driver Ponte JDBC-ODBC É uma implementação nativa que conecta uma aplicação Java a um banco de dados através de ODBC configurado na máquina. Tipo 2 - Driver API-Nativa Parcialmente Java É uma casca sobre uma implementação nativa de um driver de acesso ao banco (ex: este driver utiliza o OCI para Oracle). Um erro neste driver nativo pode derrubar a JVM. Tipo 3 - Driver Java c/ Net-Protocol Utiliza um middleware para a conexão com o banco de dados. Tipo 4 - Driver Java Puro Driver totalmente implementado em Java. Conhece todo o protocolo de comunicação com o BD e pode acessar o BD sem software extra. É o tipo de driver mais indicado.

Arquitetura da JDBC Arquitetura básica da API JDBC: pacote: java.sql

Arquitetura da JDBC As principais classes e interfaces do pacote java.sql são: DriverManager - gerencia o driver e cria uma conexão com o banco. Connection - é a classe que representa a conexão com o bando de dados. Statement - controla e executa uma instrução SQL. PreparedStatement - controla e executa uma instrução SQL. É melhor que Statement. ResultSet - contém o conjunto de dados retornado por uma consulta SQL. ResultsetMetaData - é a classe que trata dos metadados do banco. A interface Connection possui os métodos para criar um Statement, fazer o commit ou rollback de uma transação, verificar se o auto commit está ligado e poder (des)ligá-lo, etc. As interfaces Statement e PreparedStatement possuem métodos para executar comandos SQL. ResultSet possui método para recuperar os dados resultantes de uma consulta, além de retornar os metadados da consulta. ResultsetMetaData possui métodos para recuperar as meta informações do banco.

Utilizando a JDBC Para a aplicação Java se comunicar com um banco de dados e acessar os seus dados, uma conexão com o BD deve ser estabelecida. A conexão é estabelecida de seguinte forma: Carregamento do driver JDBC específico Criação da conexão com o BD A partir da conexão é possível interagir com o BD, fazendo consultas, atualização e busca às meta informações da base e das tabelas.

Utilizando a JDBC Carregamento do driver JDBC específico: Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); A String passada ao método forname() é o nome completo qualificado (fully qualified name) da classe que implementa o Driver JDBC de cada banco de dados. No exemplo é usado o nome do driver da ponte JDBC-ODBC. Cada driver possui um nome diferente, consulte a documentação do fabricante. Desta forma o carregamento do driver é feito de forma dinâmica (via Class.forName), dando flexibilidade ao código. Para maior flexibilidade, o nome poderia estar contido em um arquivo de configuração externo, podendo ser alterado sem a necessidade de recompilar o fonte Java.

Utilizando a JDBC Criação da conexão com o BD: Connection conn = DriverManager.getConnection( url, usuario, senha ); Após o carregamento do driver, a classe DriverManager é a responsável por se conectar ao banco de dados e devolver um objeto Connection, que representa a conexão com o BD. O parâmetro url também é específico de cada fornecedor de driver, consulte a documentação. Geralmente, na url são informados o IP ou nome do servidor, porta e o nome da base de dados (database ou instância). Os outros argumentos são o nome do usuário do banco e sua senha de acesso.

Utilizando a JDBC Com a conexão estabelecida já é possível interagir com o BD de várias formas: Criar tabelas e outros elementos Inserir, Alterar e Remover registros Buscar registros Buscar as meta informações do banco As três primeira interações se dão por meio das interfaces Statement ou PreparedStatement, que veremos a seguir. Todos os exemplos estão baseados no uso do driver JDBC fornecido pela Oracle. Porém, os mesmo exemplos podem ser usados com qualquer banco de dados relacional que possua um driver JDBC, necessitando apenas trocar o nome do driver e a URL de conexão. Lembrando que o JAR do driver JDBC, fornecido pelo fabricante, precisa ser disponibilizado no CLASSPATH da aplicação.

Statement O exemplo abaixo se conecta ao banco de dados local, na instância orcl e cria uma tabela chamada PESSOA, com os campos ID e NOME. String driver = "oracle.jdbc.driver.oracledriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user = "usuario"; String password = "senha"; Class.forName( driver ); Connection conn = DriverManager.getConnection( url, user, password ); String sql = CREATE TABLE PESSOA ( ID NUMBER, NOME VARCHAR2(100) )"; Statement st = conn.createstatement(); st.executeupdate( sql ); st.close(); conn.close(); Através do método createstatement() de Connection é retornado um objeto Statement, que é usado para executar um comando SQL no BD. O método executeupdate() de Statement recebe o SQL que será executado. Este método deve ser usado para DDLs e comandos SQL de INSERT, UPDATE ou DELETE. Depois os métodos close() de Statement e Connection são invocados para liberar os recursos.

Statement O objeto Statement criado pode ser reusado várias vezes para executar diferentes comandos SQL. Isto é até recomendado. String driver = "oracle.jdbc.driver.oracledriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user = "usuario"; String password = "senha"; Class.forName( driver ); Connection conn = DriverManager.getConnection( url, user, password ); Statement st = conn.createstatement(); String sql = INSERT INTO PESSOA VALUES (1, FERNANDO HENRIQUE )"; st.executeupdate( sql ); sql = INSERT INTO PESSOA VALUES (2, LUÍS INÁCIO )"; st.executeupdate( sql ); sql = INSERT INTO PESSOA VALUES (3, ANTÔNIO CARLOS )"; st.executeupdate( sql ); st.close(); conn.close(); Porém, o Statement só pode ser liberado com o método close() ao final das execuções de todos os comandos SQL.

ResultSet A recuperação de dados do BD é trivial e é feita através da execução de uma query SQL, e os dados podem ser recuperados através da interface ResultSet, retornada na execução da query. Connection conn =... String sql = "SELECT ID, NOME FROM PESSOA"; Statement st = conn.createstatement(); ResultSet rs = st.executequery( sql ); while( rs.next() ) { System.out.println( rs.getstring("id") ); System.out.println( rs.getstring("nome") ); } rs.close(); st.close(); conn.close(); O método executequery() de Statment executa uma consulta (query) SQL e retorna um objet ResultSet, que contém os dados recuperados. Através do método next() de ResultSet, o cursor interno é movido para o próximo registro. O método retorna false caso não existam mais registros ou true caso contrário. Os valores dos registros podem ser recuperados como o método getstring(), que recebe o nome do campo ou seu alias.

ResultSet Além do método getstring(), a interface ResultSet dispõe de outros métodos para recuperar os dados do BD diretamente nos tipos mais adequados. Os tipos relacionados são os mais indicados, porém outros tipos podem ser usados. Todos os método recebem o nome do campos (ou alias) ou o número do campo no select, começando por 1 (um). Método getbyte getshort getint getlong getfloat getdouble getbigdecimal getboolean getstring getbytes getdate gettime gettimestamp getasciistream getunicodestream getbinarystream getobject Tipos (java.sql.types) TINYINT SMALLINT INTEGER BIGINT REAL FLOAT, DOUBLE DECIMAL, NUMERIC CHAR VARCHAR, LONGVARCHAR BINARY, VARBINARY DATE TIME TIMESTAMP LONGVARCHAR LONGVARCHAR LONGVARBINARY Todos os tipos

ResultSet Exemplos: String sql = "SELECT ID, NOME FROM PESSOA"; Statement st = conn.createstatement(); ResultSet rs = st.executequery( sql ); while( rs.next() ) { System.out.println( rs.getint("id") ); System.out.println( rs.getstring("nome") ); } rs.close(); st.close(); conn.close(); String sql = "SELECT ID, NOME FROM PESSOA"; Statement st = conn.createstatement(); ResultSet rs = st.executequery( sql ); while( rs.next() ) { System.out.println( rs.getint(1) ); System.out.println( rs.getstring(2) ); } rs.close(); st.close(); conn.close();

Adicionando parâmetros Geralmente os comandos SQL recebem valores externos para que trabalhem com dados dinâmicos na aplicação. Com o uso de Statement, isso é feito simplesmente concatenando o valor ao comando SQL a ser executado. String id = "1"; String sql = "SELECT ID, NOME FROM PESSOA WHERE ID=" + id; Statement st = conn.createstatement(); ResultSet rs = st.executequery( sql ); String sql = "INSERT INTO PESSOA VALUES(" + id + ", " + nome + " )"; Statement st = conn.createstatement(); ResultSet rs = st.executequery( sql ); Esta forma, apesar de ser correta, não é a melhor e nem a mais indicada, pois torna o trabalho de concatenação extremamente chato e passível de erros na montagem do comando SQL, além de permitir que outros comandos SQL sejam embutidos e executados maliciosamente. A melhor maneira é, certamente, trocar o uso de Statement por PreparedStatement.

PreparedStatement PreparedStatement tem vantagens sobre Statement, pois ela cria instruções SQL précompiladas, economizando recursos do próprio banco de dados, otimizando o programa. Além da facilidade de se adicionar parâmetros aos comandos SQL. String sql = "INSERT INTO PESSOA VALUES (?,? )"; PreparedStatement pst = conn.preparestatement( sql ); pst.setint(1, 4); pst.setstring(2, "Mário"); pst.executeupdate(); pst.close(); conn.close(); String sql = "SELECT ID, NOME FROM PESSOA WHERE NOME LIKE?"; PreparedStatement pst = conn.preparestatement( sql ); pst.setstring(1, "%Fer%"); ResultSet rs = pst.executequery(); while( rs.next() ) { System.out.println( rs.getint(1) + " / " + rs.getstring(2) ); } rs.close(); pst.close(); conn.close();

PreparedStatement Os parâmetros, com PreparedStatement, podem ser passados diretamente com o próprio tipo que o dado foi definido, evitando assim ter que ficar formatando ou convertendo campos de data e decimais, além de poder passar inclusive valores nulos (NULL). Integer id = new Integer(5); String nome = null; String sql = "INSERT INTO PESSOA VALUES (?,? )"; PreparedStatement pst = conn.preparestatement( sql ); pst.setobject(1, id, java.sql.types.numeric ); pst.setstring(2, nome, java.sql.types.varchar ); pst.executeupdate(); pst.close(); conn.close();

Controle de Transações A interface Connection oferece métodos para o controle transacional. Primeiro é necessário definir o auto-commit como false. Para confirmar a transação o método commit() deve ser invocado. O método rollback() desfaz a transação. conn.setautocommint( false ); String sql = "INSERT INTO PESSOA (ID,NOME) VALUES (?,?)"; PreparedStatement pst = conn.preparestatement( sql ); try { pst.setint(1, 5); pst.setstring(2, "Carlos"); pst.executeupdate(); sql = "UPDATE PESSOA SET NOME=? WHERE ID=?"; pst = conn.preparestatement( sql ); pst.setint(1, 3); pst.setstring(2, "Jorge"); pst.executeupdate(); conn.commit(); } catch(sqlexception e) { conn.rollback(); } pst.close(); conn.close();

Acessando Procedures Algumas empresas possuem grande parte do seu código legado em Stored Procedures, e trocar estas SPs por Java seria muito caro, portanto é mais adequado utilizar o que já existe. As chamadas a Stored Procedures são possíveis por meio da interface CallableStatement. O exemplo abaixo executa uma simples procedure no BD, sem parâmetros e sem retorno. Connection conn =... String sp = "{ call MINHA_STORED_PROCEDURE }"; CallableStatement cs = conn.preparecall( sp ); cs.execute(); cs.close(); conn.close();

Acessando Procedures Geralmente as Stored Procedures recebem argumentos e também retornam valores através desses argumentos. Isso tudo é possível com a CallableStatement. O exemplo abaixo passa dois parâmetros de entrada para a procedure. O segundo exemplo passa um argumento de entrada e recupera ao segundo argumento, do tipo DATE. Connection conn =... String sp = "{ call MINHA_STORED_PROCEDURE(?,?) }"; CallableStatement cs = conn.preparecall( sp ); cs.setint(1, 10); cs.setstring(2, 99); cs.execute(); cs.close(); conn.close(); Connection conn =... String sp = "{ call MINHA_STORED_PROCEDURE(?,?) }"; CallableStatement cs = conn.preparecall( sp ); cs.setint(1, 10); cs.registeroutparameter(2, java.sql.types.date); cs.execute(); java.sql.date d = cs.getdate(2); cs.close(); conn.close();

Acessando Procedures As Stored Procedures (ou Functions) ainda podem retornar valores e cursores com dados. String sp = "{? = call SOMAR_VALORES(?,?) }"; CallableStatement cs = conn.preparecall( sp ); cs.setint(2, 10); cs.setstring(3, 99); cs.registeroutparameter(1, java.sql.types.number); cs.execute(); int total = cs.getint(1); System.out.println( "Total: " + i ); cs.close(); conn.close(); String sp = "{? = call SP_QUE_BUSCA_DADOS(?) }"; CallableStatement cs = conn.preparecall( sp ); cs.setstring(2, "São Paulo"); cs.registeroutparameter(1, oracle.jdbc.driver.oracletypes.cursor); cs.execute(); ResultSet rs = (ResultSet) cs.getobject(1); // Trabalha os dados do ResultSet... rs.close(); cs.close(); conn.close();

Tratamento de Erros Quase todos os métodos da API JDBC podem lançar uma exceção do tipo SQLException, que representa algum tipo de erro ocorrido no acesso ao banco, seja falha na conexão, SQL mal formado, até violação de PK etc. A classe SQLException possui os métodos: getmessage() - retorna a mensagem de erro. getsqlstate() - retorna um dos códigos de estado do padrão ANSI-92 SQL. geterrorcode() - retorna o código de erro específico do fornecedor. getnextexception() - retorna a exceção aninhada (encadeada), se houver.

Tratamento de Erros Exemplo de tratamento de erro: try { //simula um erro de SQL mal formado String sql = "INSERT PESSOA (ID,NOME) VALUES (?,?)"; PreparedStatement ps = conn.preparestatement( sql ); ps.executeupdate(); } catch( SQLException ex ) { } System.out.println("\n--- SQLException ---\n"); while( ex!= null ) { System.out.println("Mensagem: " + ex.getmessage()); System.out.println("SQLState: " + ex.getsqlstate()); System.out.println("ErrorCode: " + ex.geterrorcode()); ex = ex.getnextexception(); System.out.println(""); }

Websites Relacionados Site Oficial do Java http://java.sun.com Tutorial Oficial da JDBC http://java.sun.com/docs/books/tutorial/jdbc/index.html Documentação da API da JDBC http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html