Académique Documents
Professionnel Documents
Culture Documents
Manipulação de Arquivos,
Serialização e JDBC
Assuntos
Manipulação de Arquivos
Serialização
JDBC
2
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());
}
}
}
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
• 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
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
• 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
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
• 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
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
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
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
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
• <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
– 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á
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
• 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
• 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
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
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
• 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