Anda di halaman 1dari 72

UNIDADE 2

PERSISTNCIA DE DADOS COM JDBC

INTRODUO
JDBC (Java DataBase Conectivity) uma API Java que fornece classes e interfaces para acessar e tratar dados. Camada de abstrao que permite a um programa Java utilizar uma interface padro para acessar um banco de dados relacional atravs da linguagem SQL.

API JDBC
API suportada pela maioria dos gerenciadores de banco de dados (Oracle, Microsoft, IBM, etc.). Prov uma biblioteca padro para acessar Bancos de Dados relacionais.

VERSO
Verse do JDBC:
JDBC: Verso 4.0 Lanada em 2006 JDBC: Verso 3.0 Lanada em 2001 JDBC: Verso 2.1 Core Lanada em 1999 JDBC: Verso 2.0 Optional Package Lanada em 1998 JDBC: Verso 1.2 Lanada em 1997 JDBC: Verso 1.0 Lanada em 1996

API JDBC
Veja no esquema a ponte (implementao) entre o programa (cliente) e o banco de dados.

API JDBC
A API JDBC padroniza: O mecanismo de como deve ser feito a conexo ao Banco de Dados; Abordagem para criar consultas Resultado da consulta A API JDBC no padroniza: Sintaxe SQL API localizada no pacote java.sql
e javax.sql

JAVAX.SQL
O pacote javax.sql, usado em aplicaes J2EE, contm outras classes e pacotes que permitem o uso de conexes JDBC de forma mais eficiente e portvel. - javax.sql.DataSource: obtm uma conexo a partir de um sistema de nomes JNDI. 1) DataSource uma alternativa mais eficiente que DriverManager. Possui pool de conexes embutido. - javax.sql.RowSet e suas implementaes 1) Extenso de ResultSet 2) Permite manipulao customizada de ResultSet

ARQUITETURA JDBC
Programa Java JDBC API JDBC Driver Manager
URL URL URL

JDBC-NET

JDBC-ODBC Driver ODBC

outro Driver

ARQUITETURA JDBC
JDBC consiste em duas partes:
API JDBC, puramente escrita em Java. Gerenciador de Driver JDBC, o qual comunica-se com drivers dos vendedores de BD.

DRIVERS JDBC
So o corao do JDBC. H quatro tipos de drivers:
TIPO 1 JDBC-ODBC TIPO 2 Native-API partly Java Technologyenabled driver TIPO 3 Pure Java Driver for Database Middleware TIPO 4 Direct-to-Database Pure Java Driver

TIPOS DE DRIVERS
O grfico abaixo mostra os diferentes tipos de drivers JDBC:

TIPOS DE DRIVERS
TIPO 1
Utilizado para fazer a ligao (ponte) entre o JDBC e um driver ODBC.

TIPO 2
Converte chamadas JDBC em chamadas internas da API do cliente do banco de dados.

TIPOS DE DRIVERS
TIPO 3
A API do JDBC acessa uma aplicao intermediria (middleware) encarregada de traduzir chamadas JDBC e envi-las ao banco de dados.

TIPO 4
Este driver converte as chamadas JDBC diretamente para o protocolo nativo do SGBD.

VANTAGENS JDBC
Um programa Java utiliza uma API JDBC nica que independe do banco de dados ou driver que estiver sendo utilizado. Os drivers para conexo e acesso aos principais bancos de dados existentes so fornecidos pelos seus fabricantes. O programador precisa apenas saber utilizar o driver adequado e a API JDBC.

DRIVER ORACLE
O driver do Oracle do tipo 4
Vamos importar o driver do Oracle que se encontra na pasta softwares.

Site: http://www.oracle.com/technology/software/ tech/java/sqlj_jdbc/index.html

JPA CONFIGURAO

EXERCCIO
1. Configurar o MyEclipse para ter acesso ao Banco de Dados Oracle (Schema:Aluno e Tabela:Empresa).

EXERCCIO
1. Cont.

PRINCIPAIS CLASSES E INTERFACES JDBC


DriverManager Connection Statement PreparedStatement CallableStatement ResultSet SQLException

DRIVERMANAGER
Utilizado para estabelecer uma conexo entre o driver apropriado e o Banco de Dados. Mtodos
public static Connection getConnection (String url) throws SQLException
- Inicia uma conexo ao banco e retorna um objeto Connection.

DRIVERMANAGER
onde: url = database url (jdbc:subprotocol:subname) user = usurio do BD password = senha do usurio

Este mtodo inicia uma conexo ao banco e retorna um objeto Connection.

DRIVERMANAGER
O servio de encontrar uma ponte, ou seja, um driver certo delegado para um controlador de drivers. Um gerente de drivers. Nada mais normal que ele se chame DriverManager. Atravs dele, possvel chamar um mtodo getConnection com uma url que indica qual o banco que desejo abrir. O padro da url para o driver do Oracle que iremos utilizar :
jdbc:oracle:thin:@ip:1521:schema

DRIVERMANAGER
DriverManager procura por algum de seus Drivers que aceite essa URL como parmetro:

DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:aluno");

DRIVERMANAGER
O sistema ainda no consegue descobrir qual implementao do JDBC deve ser usado para a URL mencionada. O primeiro passo adicionar o arquivo (ojdbc14.jar) contendo a implementao do Oracle (Oracle connector) no projeto Java.

DRIVERMANAGER
Ainda falta registrar o driver do Oracle no sistema. Para isso basta carregar ele atravs do mtodo Class.forName(). Esse mtodo abre uma classe que se registra com o DriverManager.getConnection().

CONNECTION
Representa uma conexo com um Banco de Dados especfico: comandos SQL so executados e resultados so retornados aspectos de transaes so tratados (commit,etc) descrio do BD pode ser obtida (metadados)

CONNECTION
Mtodos
public Statement createStatement() throws SQLException
- Cria um objeto com uma instruo SQL para futura execuo.

CONNECTION
Mtodos
public void close() throws SQLException
- Fecha a conexo atual.

public void commit() throws SQLException


- Confirma a transao.

public void rollback() throws SQLException


- Cancela a transao.

STATEMENT
Utilizado para enviar comandos SQL

simples
Mtodos
public ResultSet executeQuery (String sql) throws SQLException - Executa a consulta SQL passada em SQL e retorna o ResultSet com o resultado da consulta.

STATEMENT
Mtodos
public int executeUpdate(String sql) throws SQLException
- Executa a instruo INSERT, UPDATE ou DELETE especificada em SQL.

public void cancel() throws SQLException


- Cancela uma instruo SQL que esteja sendo executada.

PREPAREDSTATEMENT
Utilizado para enviar comandos SQL que

recebam um ou mais parmetros como entrada


Eficincia: pr-compilao e armazenamento

Mtodos
public ResultSet executeQuery (String sql) throws SQLException
- Executa a consulta SQL passada em SQL e retorna o ResultSet com o resultado da consulta.

PREPAREDSTATEMENT
Mtodos
public int executeUpdate() throws SQLException
Usado para efetuar atualizaes em um banco de dados como a criao de tabelas (CREATE), alteraes (UPDATE) ou excluso (DELETE) de registros, etc.

public setInt(int indice, int valor) public setBoolean(int indice, boolean valor)
Usado para configurar os parmetros de um cdigo SQL.

PREPAREDSTATEMENT
As clusulas so executadas em um banco de dados atravs da interface PreparedStatement. Para receber um PreparedStatement relativo conexo, basta chamar o mtodo prepareStatement, passando como argumento o comando SQL com os valores vindos de variveis preenchidas com uma interrogao.
PreparedStatement stmt = con.prepareStatement( "insert into contatos(nome,email,endereco) values (?,?,?)");

PREPAREDSTATEMENT
Logo em seguida, chamamos o mtodo setString do PreparedStatement para preencher os valores, passando a posio (comeando em 1) da interrogao no SQL e o valor que deve ser colocado.
// preenche os valores stmt.setString(1, Abc); stmt.setString(2, abc@abc.com.br); stmt.setString(3, Rua Tal 222);

PREPAREDSTATEMENT
Por fim, uma chamada execute executa o comando SQL.
stmt.execute();

CALLABLESTATEMENT
Utilizado para chamar stored procedures no Banco de Dados.
Mtodos
public CallableStatement prepareCall (String storedProcedure) throws SQLException
- Executa a stored procedured armazenada no Banco de Dados.

CALLABLESTATEMENT
Sintaxe Procedimento sem parmetros
{call stored_procedure}

Procedimento com parmetros


{call stored_procedure(?,?,...)}

Exemplo
CallableStatement statement = connection.prepareCall{call stored_procedure(?,?,...)}

RESULTSET
Utilizado para realizar as consultas no Banco de Dados. Possui os registros do banco que satisfazem as condies do comando SQL. Fornece acesso aos dados destes registros

RESULTSET
Mtodos
public boolean next()

Move para o prximo registro do ResultSet.

RESULTSET
Mtodos
- Mtodos para obter o valor apropriado de cada coluna:

getInt(int col) ou (String col) getBoolean(int col) ou (String col) getString(int col) ou (String col) getByte(int col) ou String col)

SQLEXCEPTION
a classe utilizada para tratar as possveis excees que podem ser geradas quando se acessa um Banco de Dados.
try { } catch(SQLException e){ } public int getErrorCode()
Obtm o cdigo de erro especfico do fabricante do BD.

SETE PASSOS BSICOS PARA USAR O JDBC


1. Carregar o driver 2. Definir a URL de Conexo 3. Estabelecer a Conexo 4. Criar um objeto Statement 5. Executar a Consulta 6. Processar os Resultados 7. Fechar a Conexo

USANDO JDBC
1. Carregar o driver
try { Class.forName("oracle.jdbc.driver.OracleDriver"); catch(ClassNotFoundException e) {...}

2. Definir a URL de Conexo


String oracleURL = "jdbc:oracle:thin:@localhost:1521:aluno";

USANDO JDBC
3. Estabelecer a conexo
String user= aluno; String password = oracle; Connection connection = DriverManager.getConnection(oracleURL,user, password);

Opcionalmente, coletar informaes da base de dados:


DatabaseMetaData dbMetaData = connection.getMetaData(); String productName = dbMetaData.getDatabaseProductName();

USANDO JDBC
4. Criar um objeto Statement
Statement statement = connection.createStatement();

5. Executar a Consulta:
String query = "SELECT * FROM empresa" ResultSet resultSet = statement.executeQuery(query);

- Para modificar a Base de Dados, utilizar executeUpdate com UPDATE, INSERT ou DELETE.

USANDO JDBC
6. Processar os Resultados
while(resultSet.next()) { System.out.println(resultSet.getString(1)+ + resultSet.getString(2)+ + resultSet.getString(3));

- A primeira coluna tem ndice 1, no 0;

7. Fechar a Conexo
connection.close();

- Abrir e fechar conexo um recurso que consome muito da mquina;

EXERCCIOS
1. Criar uma classe (AcessoBanco.java) que faa acesso ao banco de dados Oracle (Schema:Aluno e Tabela:Empresa). 2. Na mesma classe crie os mtodos para adicionar, alterar, consultar e excluir registros da tabela Empresa.

STORED PROCEDURES
Definio Procedimento armazenado ou Stored Procedure uma coleo de comandos em SQL para programao no Banco de dados. Encapsula tarefas repetitivas, aceita parmetros de entrada e retorna um valor de status (para indicar aceitao ou falha na execuo). O procedimento armazenado pode reduzir o trfego na rede, melhorar a performance, criar mecanismos de segurana, etc.

PL/SQL
Definio
PL/SQL (Procedural Language/Structured Query Language) uma extenso da linguagem padro SQL para o SGBD Oracle.

STORED PROCEDURES
Criao da stored procedure sp_insereempresa(...)

STORED PROCEDURES
Cdigo da sp_insereEmpresa(...)
create or replace procedure sp_insereEmpresa (cpf in int, nome in varchar2, razaosocial in varchar2, endereco in varchar2, telefone in int) is begin insert into Empresa(cpf,nome,razaosocial,endereco, telefone) values (vcpf,vnome,vrazaosocial,vendereco,vtelefone); end;

Testar a sp_insereEmpresa(...)
begin sp_insereEmpresa(18, abc ti,abc ti,28 set.,3222); end;

STORED PROCEDURES
Cdigo JAVA
... CallableStatement cstat = connection.prepareCall({call sp_insereEmpresa(19, abc ti,abc ti,28 set.,3222)}); cstat.execute(); ...

TRANSAES
Uma transao representa um conjunto de aes que devem ser realizadas de forma atmica, isto , ou todas so realizadas com sucesso ou todas no so realizadas. A noo de transao em Banco de Dados visa preservar a integridade de aplicaes que realizam um conjunto de instrues SQL.

TRANSAES
Quando mltiplas instrues SQL so realizadas sob uma nica transao, todas as operaes podem ser confirmadas (committed) ou canceladas (rolled back). A API JDBC oferece o conceito de transao.

COMMIT e ROLLBACK
A interface Connection oferece os mtodos commit() e rollback(), permitindo a execuo de transaes atmicas. Toda conexo JDBC por padro considera cada instruo SQL uma transao. Existe o mtodo setAutoCommit(false) que desabilita esta opo.

COMMIT e ROLLBACK
try { Statement stmt = con.createStatement(); con.setAutoCommit(false); stmt.executeUpdate(UPDATE ...); stmt.executeUpdate(DELETE ...); ... con.commit(); } catch (Exception e) { try { con.rollback(); } catch (SQLException e){} }

EXERCCIOS
1. Isolar a conexo do banco de dados, criando uma classe Chamada ConnectionFactory, que contm um mtodo getConnection() que retorna a conexo; 2. Criar um mtodo na classe AcessoBanco que faa a chamada para a stored procedured sp_insereEmpresa(...).

PADRES DE PROJETO
Durante o desenvolvimento de quaisquer sistemas, projetistas tendem a se valer de decises de projeto tomadas anteriormente em outros sistemas. Design Patterns podem ser vistos como uma forma de documentar conjuntos de regras que descrevem decises de projeto recorrentes em vrios sistemas, facilitando assim a reutilizao de solues j existentes.

PADRES DE PROJETO
So solues para problemas que algum um dia teve e resolveu aplicando um modelo que foi documentado e que voc pode adaptar integralmente ou de acordo com a necessidade de sua soluo. Patterns podem cobrir vrios nveis de descrio presentes em um sistema, dependendo de quo genricas so as descries desses patterns, podendo variar desde diretrizes a respeito da organizao de um sistema at prticas de codificao da implementao desse sistema.

PADRES DE PROJETO

PADRES DE PROJETO JEE


MVC Business Delegate Service Locator Session Faade Message Faade Composite View Front Controller Value Object (VO) Data Access Object (DAO)

VO
o design pattern JEE mais famoso que temos que tem por objetivo trazer todos os dados de uma s vez, em uma nica requisio de rede, em um objeto chamado Value Object. A seguir, voc v um exemplo de uma classe JavaBean que seria equivalente ao nosso modelo de entidade do banco de dados:

VO
Temos um mapeamento de dados relacionais e dados orientados a objeto.
public class Contato { private Long id; private String nome; private String email; private String endereco; (generate getters and setters...) }

DAO
um padro de projeto que isola todo o acesso a banco em classes simples, cuja instncia um objeto responsvel por acessar os dados. Da responsabilidade deste objeto surgiu o nome de Data Access Object ou simplesmente DAO, um dos mais famosos padres de desenvolvimento.

DAO
Exemplo:
public class ContatoDAO { private Connection connection; public ContatoDAO() throws SQLException { this.connection = ConnectionFactory. getConnection(); } }

Agora que todo ContatoDAO possui uma conexo com o banco podemos focar no mtodo adiciona, que recebe um Contato como argumento e responsvel por adicionar o mesmo atravs de cdigo sql.

DAO
public void adiciona(Contato contato) throws SQLException { // prepared statement para insero PreparedStatement stmt = this.connection. prepareStatement("insert into contatos (nome,email,endereco) values (?, ?, ?)"); // seta os valores stmt.setString(1,contato.getNome()); stmt.setString(2,contato.getEmail()); stmt.setString(3,contato.getEndereco()); // executa stmt.execute(); stmt.close(); }

DAO
Para pesquisar tambm utilizamos a interface PreparedStatement, de forma que o mtodo executeQuery retorna todos os contatos. O objeto retornado do tipo ResultSet que permite navegar por seus registros atravs do mtodo next. Esse mtodo ir retornar false quando chegar ao fim da pesquisa, portanto ele normalmente utilizado para fazer um lao nos registros como no exemplo a seguir:

DAO
Exemplo:
PreparedStatement stmt = con.prepareStatement ("select * from contatos"); // executa um select ResultSet rs = stmt.executeQuery(); // itera no ResultSet while (rs.next()) { } rs.close(); stmt.close(); con.close();

DAO
Para retornar o valor de uma coluna no banco de dados basta chamar um dos mtodos get do ResultSet, dentre os quais, o mais comum: getString.
// itera no ResultSet while (rs.next()) { System.out.println( rs.getString("nome") + " :: " + rs.getString("email") ); }

Mas, novamente, podemos aplicar as idias de DAO e criar um mtodo getLista() no nosso ContatoDAO:

DAO
PreparedStatement stmt = this.connection.prepareStatement ("select * from contatos"); ResultSet rs = stmt.executeQuery(); List<Contato> contatos=new ArrayList<Contato>(); while (rs.next()) { // criando o objeto Contato Contato contato = new Contato(); contato.setNome(rs.getString(nome)); contato.setEmail(rs.getString(email)); contato.setEndereco(rs. getString(endereco)); // adicionando o objeto lista contatos.add(contato); } rs.close(); stmt.close(); return contatos;

EXERCCIOS
1. Criar na base de dados Oracle (Schema aluno) a

Tabela contatos.
create table contatos ( id BIGINT NOT NULL, nome VARCHAR(255), email VARCHAR(255), endereco VARCHAR(255), primary key (id) );

2. Implemente os mtodos de alterao e excluso na classe ContatosDAO.