Vous êtes sur la page 1sur 44

Módulo IX

Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

Manipulação de Arquivos,
Serialização e JDBC

Assuntos
Manipulação de Arquivos
Serialização
JDBC
2

Manipulação com Arquivos


• Existem dois modos de leitura e escrita de arquivos:
– Modo Texto
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• O arquivo é tratado pelo S.O. como uma seqü seqüência de


caracteres ASCII agrupados em linhas.
• Para indicar que háhá uma quebra de linha:
adiciona-se o caracter ‘\n’ (Line Feed - LF).
– Unix: adiciona-
adiciona-se os caracteres ‘\r\n’ (Carriage Return e Line
– Windows: adiciona-
Feed - CR/LF)
• Para indicar o final do arquivo é adicionado o caracter End of
File (Ctrl
(Ctrl+Z)
+Z)
– Modo Biná
Binário
• O arquivo é visto como uma seqü
seqüência de bytes semelhante à
memó
memória do computador.
• O S.O. sabe o final do arquivo pois guarda o seu tamanho.
3

Manipulação com Arquivos


• Exemplo de Leitura Texto com FileReader e BufferedReader
import java.
java.io.*;
io.*; // as classes para manipulaç
manipulação de arquivos estão neste pacote
public class LeArquivo
{
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

public static void main(String[]


main(String[] args)args)
{
try // Imposto pelos métodos de FileReader e BufferedReader
{
FileReader fr = new FileReader(
FileReader("linhas.dat"
linhas.dat"); // cria um leitor de arquivos modo texto.
// O arquivo é aberto no S.O.
BufferedReader br = new BufferedReader(fr);
BufferedReader(fr); // cria um buffer e o associa ao leitor
while(
while(true)
true)
{
String linha = br.br.readLine();
readLine();
if (linha == null)
null) // Se a linha for null,
null, chegamos ao final do arquivo
break;
break;
System.out.
System.out.println
println(linha);
(linha);
}
br.
br.close();
close(); // fecha o buffer e conseqü
conseqüentemente o arquivo para o S.O.
}
catch (IOException excecao) xcecao)
{
System.out.
System.out.println
println(("Erro na leitura do arquivo"
arquivo" + excecao.
excecao.getMessage());
getMessage());
}
}
}
4

Nomes e Paths de Arquivos


• Em Unix, para fazer a separação dos nomes dos
diretórios utilizamos o caracter ‘/’.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• Já no Windows utilizamos o caracter ‘\’.


• Como em Java o caracter ‘\’ é utilizado para indicação
de caracteres especiais (ex: \n, \t, \r, \u3FA2), toda
vez que formos utilizar este caracter devemos
escrever “\\”
– Ex: “C:\
C:\\Java\
Java\\Dados\
Dados\\Nomes.dat”
Nomes.dat”

• Entretanto podemos escrever os caminhos de


arquivos também com ‘/’ no ambiente Windows
– Ex: “C:/Java/Dados/Nomes.dat
C:/Java/Dados/Nomes.dat””
5

Manipulação com Arquivos


• Exemplo de Leitura Texto com FileWriter e BufferedWriter
import java.
java.io.*;
io.*; // as classes para manipulaç
manipulação de arquivos estão neste pacote
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

public class EscreveArquivo


{
public static void main(String[]
main(String[] args)
args)
{
try
{
FileWriter fw = new FileWriter(
FileWriter("linhas.dat"
linhas.dat"); // Cria um escritor de arquivos.
// O arquivo é criado vazio no S.O.
BufferedWriter bw = new BufferedWriter(
BufferedWriter(fw); fw); // Cria o buffer e associa ao escritor
for(
for( int i = 1; i <= 100;
100; i++) // Irá
Irá escrever 100 linhas
{
bw.
bw.write(
write("Esta é a Linha "+ i);
i);
bw.
bw.newLine(
newLine( ); // Insere a quebra de linha de acordo com a regra do S.O.
}
bw.close(
bw.close( ); // Fecha o arquivo e salva o conteú
conteúdo que foi escrito!!!
escrito!!!
}
catch(
catch(IOException excecao)
excecao)
{
System.out.
System.out.println
println(("Não foi possí
possível gravar o arquivo!" + excecao.
excecao.getMessage());
getMessage());
}
}
}
6

Manipulação de Arquivos
• RandomAccessFile: “Semelhante” ao FILE de C.
import java.
java.io.*;
io.*;
public class LeArquivoRandomico
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

{
public static void main(String
main(String args[])
args[])
{
try
{
RandomAccessFile file = new RandomAccessFile(
RandomAccessFile(“Linhas.dat”
Linhas.dat”,"r");
"r"); // modo de leitura!
leitura!
while(
while(true)
true)
{
String linha = file.readLine
file.readLine();
();
if (linha == null)
null)
break;
System.out.
System.out.println
println(linha);
(linha);
}
file.close();
}
catch (IOException excecao) xcecao)
{
System.out.
System.out.println
println(("Não foi possí
possível ler o arquivo:"
arquivo:"+
+ excecao.
excecao.getMessage());
getMessage());
}
}
}

• O modo de leitura (2o parâmetro) pode ser “r” (leitura) ou “rw’


rw’ (leitura/escrita).
7

Manipulação de Arquivos
• Leitura de Arquivos no Modo Binário
import java.
java.io.*;
io.*;
public class LeBytes
{
publlic static final int TAMANHO = 10;
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

public static void main(String


main(String args[])
args[])
{
byte[] buffer = new byte[TAMANHO
byte[TAMANHO]; ];
try
{
// Abre o arquivo valores.dat no modo biná binário de leitura
FileInputStream file = new FileInputStream(
FileInputStream("valores.dat"
valores.dat");
int posicao = 0;
// Enquanto for possípossível ler um buffer de dez bytes
while(
while( file.
file.read(
read(buffer)
buffer) != -1 )
for(int
for(int i = 0; i < TAMANHO;
TAMANHO; i++, posicao++)
posicao++)
System.out.
System.out.println
println(( posicao + " = " + buffer[
buffer[i]);
// fecha o arquivo
file.close();
file.close();
}
catch (IOException excecao) xcecao)
{
System.out.
System.out.println
println(("Não foi possí
possível ler o arquivo:"
arquivo:"+
+ excecao.
excecao.getMessage());
getMessage());
}
}
}
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007 8

• Escrita de registros

• Leitura de registros
9
Serialização
• Processo de “Dump” dos Objetos
• É necessário definir as raízes de persistência do sistema
– Menor conjunto de objetos do sistema a partir dos quais é possí
possível
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

acessar todos os objetos presentes na memó


memória
– Geralmente os controladores DAO ou coleç
coleções apontam para estes
objetos
• Processo de Gravação
Collection raizDePersistencia;
raizDePersistencia;
...
try
{
// Declaramos uma variá
variável chamada “arq”
arq” que é uma referência para um objeto FileOutputStream
FileOutputStream arq = new FileOutputStream("objetos.dmp");
FileOutputStream("objetos.dmp");
// Declaramos uma variá
variável chamada “oos”
oos” que é uma referência para um objeto FileOutputStream
ObjectOutputStream oos = new ObjectOutputStream(arq);
ObjectOutputStream(arq);
// Mensagem para “oos”
oos” solicitando a gravaç
gravação do objeto referenciado por raizDePersistência
oos.writeObject(
oos.writeObject(raizDePersistencia
raizDePersistencia); );
// Salvando o arquivo
oos.close();
oos.close();
}
catch(IOException
catch(IOException ioe) ioe) { … }
10

Serialização
• Processo de Recuperação
Collection raizDePersistencia;
raizDePersistencia;
...
try
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

{
// Declaramos uma variá
variável chamada “arq”
arq” que é uma referência para um objeto FileInputStream
FileInputStream arq = new FileInputStream("objetos.dmp");
FileInputStream("objetos.dmp");
// Declaramos uma variá
variável chamada “ois”
ois” que é uma referência para um objeto FileInputStream
ObjectInputStream ois = new ObjectInputStream(arq);
ObjectInputStream(arq);
// Mensagem para “ois”
ois” solicitando a leitura do objeto gravado previamente (casting é necessá
necessário)
rio)
raizDePersistencia = (Collection)
(Collection)ois ois.readObject
.readObject(); ();
// Fechando o arquivo
ois.close();
ois.close();
}
catch(IOException
catch(IOException ioe) ioe)
{
// Tratando a exceç
exceção de entrada/saí
entrada/saída

}
11
Serialização

• Para que um objeto seja serializado, é necessário que


sua classe implemente a interface Serializable
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

– Neste caso, a interface Serializable não é composta de nenhuma


assinatura. Assim não é necessá
necessário codificar nenhum mé
método.
– Ex:
public class MinhaClasse implements Serializable {

}

• Se desejar que algum atributo não seja serializado, serializado, é


necessá
necessário indicar que ele é transiente (ou seja, não
persistente)
– Ex: private transient ArrayList listaTemporaria;
listaTemporaria;

• A serializaç
serialização é indicada principalmente para aplicaç
aplicações
monousuá
monousuário onde o volume a ser serializado é pequeno
– Uma mí
mínima alteraç
alteração na rede de objetos requer salvar todos os
objetos novamente!
12
JDBC
Java Database Connectivity
• JDBC é uma API Java lançada em 1997 para acesso a
bancos de dados relacionais através de SQL.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

– Inspirada no ODBC
– A API vale para qualquer banco (dependente da
disponibilidade de um driver).
driver).
– Pacote padrão: java.sql
java.sql
– Requer conhecer os comandos SQL

• Boa parte da implementação dos recursos presentes


no pacote java.sql é feita através das classes
presentes nos drivers JDBC.
– Analogia:
Analogia: o pacote java.sql
java.sql é um framework que é
instanciado pelos drivers associados a cada banco.
13
JDBC
Java Database Connectivity
• Para que um programa Java possa acessar um BD Relacional é
necessá
necessário ter um driver JDBC (que
(que na realidade é um conjunto de
classes disponibilizadas pelo fabricante do SGBD)
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• Quatro tipos de drivers:


– O Driver de Tipo 1 é aquele que utiliza os
recursos do driver ODBC para acessar o
BD (Este
(Este driver é disponibilizado atravé
através
da Java Runtime Classes que vem com o
JDK).
– O Driver de Tipo 2 é aquele que acessa
diretamente o BD, mas utiliza internamente
uma API disponibilizada pelo SGBD.
Internamente,
Internamente, o código mistura
código Java e C (C
(Código Nativo)
Nativo)

Tipo 1 Tipo 2
14
JDBC
Java Database Connectivity
– O Driver de Tipo 3 é aquele que foi feito
totalmente em Java e para acessar o BD
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

utiliza uma infra-


infra-estrutura de middleware
para se comunicar com o Servidor.
Servidor.
– O Driver de Tipo 4 é aquele que foi feito
totalmente em Java e acessa o servidor
diretamente atravé
através de sockets.

• Padrões da API
– O padrão atual para o JDBC é o 4.0
Tipo 4 Tipo 3
15

Pacote java.sql
SQLInput java.
java.lang.
lang.Object

SQLOutput Connection DriverPropertyInfo


Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

SQLType ResultSet DriverManager

SQLData Statement
Types
Struct
PreparedStatement
java.
java.util.Date
util.Date
StructLocator
CallableStatement
Time
ArrayLocator
ResultSetMetaData
BlobLocator Date

DatabaseMetaData
ClobLocator TimeStamp
Driver
Ref
interfaces
classes
16

Framework
• Conjunto de classes/interfaces reutilizá
reutilizáveis que promove uma
estrutura de comportamentos gené
genéricos, para uma famí
família de
software.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• A utilizaç
utilização de um framework implica em especializar suas classes
abstratas e realizar suas interfaces, tornando-
tornando-as concretas, e
instanciando os seus objetos.
• “Um framework é uma arquitetura de alto ní
nível, consistindo de classes
que são especialmente projetadas para serem refinadas e usadas em em
grupo”.
grupo”
• “Durante o projeto de um framework o projetista deve entender as
decisões de projeto e organizá
organizá-las em conjunto de classes abstratas e
concretas, juntamente com seus relacionamentos, que representam o
comportamente básico para um subsistema. Logo, o projetista
desenvolve uma teoria do domí
domínio do problema e a expressa segundo um
objetos” (WIRFS-
modelo orientado a objetos” (WIRFS-BROCK, JOHNSON 1990)
17

Framework
• Cada fabricante de SGBD pode gerar um driver JDBC
para o produto que estiver construindo. Para isto,
deve-se basicamente realizar (implementar) as
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

interfaces definidas em java.sql (“realizar/especializar


realizar/especializar o framework”
framework” )

• Quando nós criamos um programa para acessar um


SGBD com JDBC, declaramos variáveis que são
referências para objetos de uma interface definida em
java.sql.
• Mas, na realidade, sabemos que estes objetos são
realizações destas interfaces que foram definidas no
driver JDBC. Estamos tendo uma visão polimórfica
destes objetos.
18

JDBC via ODBC


• Se o SGBD não tiver um driver JDBC pró
próprio,
prio, podemos acessá
acessá-
lo via ODBC.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• Configurando o driver ODBC na máquina


• Acesse o ODBC Administrator (Painel
(Painel de Controle)
Controle) e na seç
seção System
DNS adicione um novo banco.
banco.

• O nome dado é o nome de referência a ser utilizado no acesso JDBC.


19

URL JDBC
• Para o estabelecimento de uma conexão com um BD,
é necessário indicar qual driver utilizar, a localização
do SGBD e o nome da base a ser utilizada. Para isto
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

devemos indicar uma URL JDBC.


• Formato: “jdbc:<subprotocolo>:<dsn>”
– O subprotocolo indica qual driver iremos utilizar
– O dsn é a indicação que será utilizada pelo driver para
a localizar o SGBD e a base de dados.
– Ex:
• jdbc:
jdbc:mysql://
mysql://unigranrio.edu
unigranrio.edu..br/base
br/base
• jdbc:
jdbc:odbc:
odbc:bdalunos
• jdbc:
jdbc:oracle:
oracle:thin:@102.20.34.13:1521:
thin:@102.20.34.13:1521:bdcorp
bdcorp
• jdbc:
jdbc:postgresql://
postgresql://localhost
localhost:5432/
:5432/bdalunos
bdalunos""
20

Estabelecendo Conexão
import java.sql.*;
java.sql.*;

Connection conexao;
conexao;
String conta, senha;
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

...
try {
//----
//---- Carga do driver ODBC-
ODBC-JDBC ----//
----//
Class.
Class.forName(
forName("sun.
sun.jdbc.
jdbc.odbc.
odbc.JdbcOdbcDriver"
JdbcOdbcDriver");
//----
//---- Abrir conexão com BD Teste via ODBC ----// ----//
conexao = DriverManager.
DriverManager.getConnection(
getConnection("jdbc:
jdbc:odbc:Teste"
odbc:Teste",, conta, senha);
//----
//---- As transaç
transações só são efetivadas apó após o commit----
commit----////
conexao.
conexao.setAutoCommit(
setAutoCommit(false);
false);
}
catch(ClassNotFoundException
catch(ClassNotFoundException cnfe) cnfe) {
System.out.
System.out.println
println((“Não tem o driver JDBC-
JDBC-ODBC:"
ODBC:" + cnfe.
cnfe.getMessage(
getMessage( ) );
}
catch(SQLException
catch(SQLException sqle) sqle) {
System.out.
System.out.println
println((“Erro na conexão:
conexão: " + sqle.
sqle.getMessage(
getMessage( ) );
}
21

Estabelecendo Conexão
• Class.
Class.forName
– A classe Class é uma classe presente no pacote java.
java.lang que descreve os
metadados de uma determinada classe (nome, atributos, mé métodos).
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

– O mé estático forName serve para solicitar ao Class Loader da JVM a


método está
carga antecipada do bytecode de uma determinada classe. No nosso
caso, estamos solicitando que faç
faça a carga do driver JDBC.
• DriverManager.
DriverManager.getConnection
– DriverManager é uma classe do JDBC que faz a gerência dos drivers e
estabelecimento das conexões com os BDs.
BDs.
• ClassNotFoundException
– Classe de exceç
exceção que é disparada quando o mémétodo forName não
encontrar o bytecode da classe especificada no parâmetro
• SQLException
– Classe de exceç
exceção que indica que ocorreu algum erro com JDBC. Todos
os mé
métodos JDBC podem disparar esta exceç
exceção e, por isto, somos
obrigados a colocar as mensagens dentro de um bloco de try...catch.
try...catch.
22

Voltando a Falar sobre Framework


• Observe que no có
código anterior, declaramos uma variá
variável chamada
“conexao”
conexao” cujo tipo é “referência para um objeto da interface
Connection”
Connection”.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• Podemos ter um objeto que é propriamente de uma interface? Não! Pois


uma das caracterí
características da interface é que ela se assemelha a uma
classe abstrata (ou seja, não ter objetos pró
próprios).
prios).

• Como isto é possí


possível? POLIMORFISMO!
• Estamos vendo um objeto como sendo Connection, Connection, mas na realidade
ele pertence a uma classe que realizou esta interface (como estamos
utilizando o driver Odbc/
Odbc/Jdbc,
Jdbc, o objeto é na realidade pertencente a classe
JdbcOdbcConnection;
JdbcOdbcConnection; precisá
precisávamos saber disto??? Não! Bastava saber o que está
está
framework).
no framework).
• Um framework vai trabalhar intensivamente com o polimorfismo
como exemplificamos acima. Há
Há várias situaç
situações onde estaremos
utilizando um framework.
framework.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007 23

• Desenho de especialização do framework.


24

Liberando a Conexão
Connection conexao;
conexao;

try {
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

//----
//---- Fechando a conexão ----//
----//
conexao.close(
conexao.close( );
}
catch(SQLException
catch(SQLException sqle)
sqle) {
System.out.
System.out.println
println((“Erro no fechamento da conexão:
conexão: " + sqle.
sqle.getMessage(
getMessage( ) );
}

• <referência p/ Connection>.close( )
– Se não formos precisar mais de uma conexão,
devemos liberá-la pois senão estaremos consumindo
recursos no banco de forma desnecessária.
25

Inserção
import java.sql.*;
java.sql.*;

Connection conexao;
conexao;
try {
//----
//---- Criando o Comando ----//----//
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

PreparedStatement comando =
conexao.
conexao.prepareStatement(
prepareStatement(”INSERT INTO ESTADO VALUES (?, ?, ?, ? )");
)");
//----
//---- Definindo os parâmetros ----// ----//
comando.setString
comando.setString(1, (1, “RJ”
RJ”);
comando.setString
comando.setString(2, (2, “Rio de Janeiro”
Janeiro”);
comando.setString
comando.setString(3, (3, “Rio de Janeiro”
Janeiro”);
comando.setBigDecimal
comando.setBigDecimal(4, (4, new BigDecimal(10000000L));
BigDecimal(10000000L));
//----
//---- Executando ----//
----//
comando.executeUpdate
comando.executeUpdate(); ();
//----
//---- Solicitando o Commit ----//
----//
conexao.
conexao.commit();
commit();
//----
//---- Fechando o PreparedStatement e liberando recursos no banco ----// ----//
comando.close();
}
catch(SQLException
catch(SQLException sqle) sqle) {
System.out.
System.out.println
println((“Erro na inserç
inserção:ão: " + sqle.
sqle.getMessage(
getMessage( ) );
}
26

Inserção
• PreparedStatement
– A classe cujas instâncias preparam a execuç
execução de um comando no
BD. Geralmente é utilizado quando apresenta parâmetros (?) na
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

String SQL a ser submetida.

• <referência p/ PreparedStatement>.set___(posição, valor)


– Métodos de PreparedStatement para definir os valores dos
parâmetros do comando SQL a ser submetido

• <referência p/ PreparedStatement>.executeUpdate()
– Método de Statement para solicitar a execuç
execução de um comando
que alterará
alterará o estado dos dados no banco.

• <referência p/ Connection>.commit()
– Solicita o commit da transaç
transação.
27

• Prefira sempre os comandos genéricos com ?


Do que os que colocam o conteúdo na String
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

– Otimização no SGBD
28

Atualização
import java.sql.*;
java.sql.*;

Connection conexao;
conexao;
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

try {
//----
//---- Criando o Comando ----// ----//
PreparedStatement comando =
conexao.
conexao.prepareStatement(
prepareStatement("UPDATE ESTADO SET POPULACAO = ? WHERE SIGLA = ?");
?");
//----
//---- Definindo os parâmetros ----// ----//
comando.setBigDecimal
comando.setBigDecimal(1, (1, new BigDecimal(12500000L));
BigDecimal(12500000L));
comando.setString
comando.setString(2, (2, “RJ”
RJ”);
//----
//---- Executando ----//
----//
comando.executeUpdate
comando.executeUpdate(); ();
//----
//---- Solicitando o Commit ----//
----//
conexao.
conexao.commit();
commit();
//----
//---- Fechando o PreparedStatement e liberando recursos no banco ----// ----//
comando.close();
}
catch(SQLException
catch(SQLException sqle) sqle) {
System.out.
System.out.println
println((“Erro na inserç
inserção:ão: " + sqle.
sqle.getMessage(
getMessage( ) );
}
29

Remoção
import java.sql.*;

Connection conexao;
conexao;
try {
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

//----
//---- Criando o Comando ----//
----//
PreparedStatement comando =
conexao.
conexao.prepareStatement(
prepareStatement(“DELETE FROM ESTADO WHERE SIGLA = ?");
?");
//----
//---- Definindo os parâmetros ----//
----//
comando.setString
comando.setString(1, (1, “GB”
GB”);
//----
//---- Executando ----//
----//
comando.executeUpdate
comando.executeUpdate(); ();
//----
//---- Solicitando o Commit ----//
----//
conexao.
conexao.commit();
commit();
//----
//---- Fechando o PreparedStatement e liberando recursos no banco ----//
----//
comando.close();
}
catch(SQLException
catch(SQLException sqle)
sqle) {
System.out.
System.out.println
println((“Erro na inserç
inserção:
ão: " + sqle.
sqle.getMessage(
getMessage( ) );
}
30

Consulta
import java.sql.*;
java.sql.*;

Connection conexao;
conexao;
try {
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

//----
//---- Criando o Comando ----// ----//
Statement comando = conexao. conexao.createStatement(
createStatement( );
//----
//---- Executando a consulta ----// ----//
ResultSet rs = comando.executeQuery
comando.executeQuery((“SELECT * FROM ESTADO"); ESTADO");
//----
//---- Recuperando os dados ----// ----//
while(rs.
while(rs.next
next(( ) )
{
System.out.
System.out.println
println((“Sigla: “ + rs.getString
rs.getString(1));
(1));
System.out.
System.out.println
println((“Nome: “ + rs.getString
rs.getString(2));
(2));
System.out.
System.out.println
println((“Capital: “ + rs.getString
rs.getString(3));
(3));
System.out.
System.out.println
println((“Populaç
População: “ + rs.getBigDecimal
rs.getBigDecimal(4));
(4));
}
//----
//---- Fechando o ResultSet e liberando recursos no banco ----// ----//
rs.close();
//----
//---- Fechando o PreparedStatement e liberando recursos no banco ----// ----//
comando.close();
}
catch(SQLException
catch(SQLException sqle) sqle) {
System.out.
System.out.println
println((“Erro na consulta:
consulta: " + sqle.
sqle.getMessage(
getMessage( ) );
}
31

Consulta
• Mesmo exemplo com PreparedStatement
import java.sql.*;
java.sql.*;

Connection conexao;
conexao;
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

try {
//----
//---- Criando o Comando ----// ----//
PreparedStatement comando = conexao. conexao.prepareStatement(
prepareStatement(“SELECT * FROM ESTADO");
ESTADO");
//----
//---- Executando a consulta ----// ----//
ResultSet rs = comando.executeQuery
comando.executeQuery(); ();
//----
//---- Recuperando os dados ----// ----//
while(rs.
while(rs.next
next(( ) )
{
System.out.
System.out.println
println((“Sigla: “ + rs.getString
rs.getString(1));
(1));
System.out.
System.out.println
println((“Nome: “ + rs.getString
rs.getString(2));
(2));
System.out.
System.out.println
println((“Capital: “ + rs.getString
rs.getString(3));
(3));
System.out.
System.out.println
println((“Populaç
População: “ + rs.getBigDecimal
rs.getBigDecimal(4));
(4));
}
//----
//---- Fechando o ResultSet e liberando recursos no banco ----// ----//
rs.close();
//----
//---- Fechando o PreparedStatement e liberando recursos no banco ----// ----//
comando.close();
}
catch(SQLException
catch(SQLException sqle) sqle) {
System.out.
System.out.println
println((“Erro na consulta:
consulta: " + sqle.
sqle.getMessage(
getMessage( ) );
}
32

Consulta
• Statement
– Generalizaç
Generalização de PreparedStatement.
PreparedStatement. Ao executar o comando, deveremos sempre
passar a uma String pronta com o comando SQL.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• <referência p/ Statement>.executeQuery(
executeQuery(stringSQL)
stringSQL)
– Método que executará
executará uma consulta no banco. Se for PreparedStatement,
PreparedStatement, não há

necessidade do parâmetro pois o comando foi preparado previamente.
previamente. Devolve uma
referência para um ResultSet.
ResultSet.
• ResultSet
– Suas instâncias representam o resultado de uma consulta. Funciona
Funciona como um cursor
sobre as tuplas retornadas pela consulta. Para a navegaç navegação podemos utilizar os
métodos: boolean next()
next(),, boolean first()
first(),, boolean last()
last(),, boolean absolute(posi
absolute(posiçção),
ão),
entre outros (ver Javadoc)
Javadoc)

• <referência p/ ResultSet>.get_____(posi
get_____(posiçção)
– Retorna o campo da tupla referenciada correntemente pelo ResultSet dada a sua
posiç
posição. Há
Há també
também a implementaç
implementação do mé
método
<ref_ResultSet>.
ref_ResultSet>.get_____
get_____((nomeCampo)
nomeCampo) que utiliza o nome do campo ao invé
invés de
sua posiç
posição na tupla.
tupla.

• <referência p/ ResultSet>.close( )
– Libera recursos no banco associados ao ResultSet
33

Parâmetros Avançados para a


Criação de Statements
• CONCUR_READ_ONLY
Indica que modo de concorrência para o ResultSet não pode ser atualizado.
atualizado.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• CONCUR_UPDATABLE
Indica que modo de concorrência para o ResultSet pode ser atualizado.
atualizado.
• FETCH_FORWARD
Indica que as tuplas no ResultSet serão processadas da primeira para a última.
ltima.
• FETCH_REVERSE
Indica que as tuplas no ResultSet serão processadas da última para a primeira.
primeira.
• FETCH_UNKNOWN
Indica que as tuplas no ResultSet serão processadas em um modo desconhecido.
desconhecido.
• TYPE_FORWARD_ONLY
Indica que o processo de navegaç
navegação sobre as tuplas será
será sempre para frente.
frente.
• TYPE_SCROLL_INSENSITIVE
Indica que o ResultSet é rolá
rolável mas não é sensí
sensível às mudanç
mudanças de outros usuá
usuários.
rios.
• TYPE_SCROLL_SENSITIVE
Indica que o ResultSet é rolá
rolável e sensí
sensível às mudanç
mudanças de outros usuá
usuários.
rios.
34
Mapeamento dos Tipos ANSI SQL
para Java
SQL  Java Java  SQL

• CHAR String • String  VARCHAR or LONGVARCHAR


• VARCHAR  String • java. math.BigDecimal  NUMERIC
java.math.
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

• LONGVARCHAR  String • boolean  BIT


• NUMERIC  java.
java.math.
math.BigDecimal • byte  TINYINT
• DECIMAL  java.
java.math.
math.BigDecimal • short  SMALLINT
• BIT  boolean • int  INTEGER
• TINYINT  byte
• long  BIGINT
• SMALLINT  short
• INTEGER  int • float  REAL
• BIGINT  long • double  DOUBLE
• REAL  float • byte[]  VARBINARY ou
• FLOAT  double LONGVARBINARY
• DOUBLE  double • java.sql.Date  DATE
java.sql.Date
• BINARY  byte[] • java.sql.Time  TIME
java.sql.Time
• VARBINARY  byte[] • java.sql.Timestamp  TIMESTAMP
java.sql.Timestamp
• LONGVARBINARY  byte[]
• DATE  java.sql.Date
java.sql.Date
• TIME  java.sql.Time
java.sql.Time
• TIMESTAMP  java.sql.
java.sql.Timestamp
Timestamp
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007 35

• Pool de Conexões
36

Hibernate
• Modelo de Dados  Conjunto de conceitos e mecanismos
utilizados para representação de domínios através de dados.
– Um modelo de dados nos fornece uma maneira de como
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

estruturar os dados que são manipulados por um sistema.

• Apesar do Modelo OO e o Modelo Relacional


apresentarem conceitos diferentes, é possível rearranjar
os dados estruturados com o uso de um modelo para o
outro através de um mapeamento (especificação que
indica quais as transformações que devem ser
promovidas para a conversão).
• Uma das questões-chave para o desenvolvimento de
aplicações OO é como resolver o problema da
persistência.
37

Hibernate
• A forma mais fácil de resolver o problema é a utilização
dos Sistemas Gerenciadores de Bancos de Dados
Orientados a Objetos (SGBDOO), pois nestes os
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

objetos são transparentemente transientes quanto


persistentes
– Ex: O2, Ontos, ObjectStore, Jasmine, Caché, etc.
– Problema:
Problema: SGBDOOs são caros e não tem o mesmo
desempenho que SGBDs Relacionais

• Problema: Através de todo ciclo de vida


(principalmente durante a implementação) trabalhamos
com o Modelo OO, entretanto continuamos a utilizar
SGBD Relacionais para realizar a persistência dos
dados, o que nos obriga a trabalhar com
mapeamentos.
38

Hibernate
• Hibernate é um toolkit de persistência open source
cujo propósito é prover para desenvolvedores Java
um mecanismo para persistência através do
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

mapeamento OO  Relacional.
– NHibernate para .NET

• Hibernate não é um padrão JSR (Java Standard) mas


é o mais utilizado
– Outros:
Outros: JDO, EJB, Prevayler

• Com o Hibernate, a impressão que temos durante a


codificação é que estamos trabalhando com um
SGBDOO, apesar de estarmos trabalhando com um
SGBD Relacional.
39

Hibernate
• Esquema de Funcionamento do Hibernate
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

Aplicação

Objetos Persistentes

Hibernate
Hibernate.
Hibernate. Mapeamento
cfg.
cfg.xml XML

Banco de Dados
Relacional
40

Hibernate
• Configuração da Biblioteca no Eclipse
– +lib
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

– antlr.jar
– cglib.jar
– asm.jar
– asm-attrs.jars
– commons-collections.jar
– commons-logging.jar
– hibernate3.jar
– jta.jar
– dom4j.jar
– log4j.jar
41

Hibernate – Primeiro Exemplo


• Primeiro Exemplo
package events;
import java.util.Date;
public class Event {
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

private Long id;


private String title;
private Date date;
public Event() {}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007 42
43

Passos para Utilização do Hibernate


1. Preparação das Classes
• Toda classe deve ter um atributo “Id”; ou seja,
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

um atributo que sirva de identificador de um


objeto e que não apareça duplicado em outro
objeto da classe. Se a classe não tiver
naturalmente este atributo, deve-se criar um
“artificialmente”.

2. Construção do Banco Relacional


1. Dado um esquema de classes existente, é
necessário fazer o seu mapeamento em um BD.
As regras a serem seguidas são as seguintes:
1. Para cada classe instanciável
44

• (1) Escrever o arquivo hibernate.cfg.xml


– Para que o Hibernate possa entrar em contato com
Persistência com Arquivos e JDBC - Alessandro Cerqueira - 20/8/2007

o banco é necessário informar alguns dados Indica


qual base de dados, vamos utilizar,

Vous aimerez peut-être aussi