Está en la página 1de 42

Acesso a Banco de Dados

JDBC
Tcnicas de Programao
FA7
Prof. Eduardo Mendes
Trabalhando
com Banco de Dados
! Nesta aula
! Criar um banco de dados e uma tabela de alunos
! Configurar a aplicao para acessar o banco de
dados
! JNDI, server.xml, web.xml
! Criar uma classe que acesse o banco com a
configurao realizada
Conceitos
! Tabelas
! Linhas
! Campos
! Chaves primrias
Tabela tpica de dados:
Agenda Telefnica
Cursos da FA7
No MySQL
CREATE DATABASE modulo3;

USE modulo3;

CREATE TABLE agendaTelefonica (
id INT PRIMARY KEY,
primeiroNome VARCHAR(15),
sobreNome VARCHAR (15),
email VARCHAR(20),
telefone VARCHAR(15)
);

DESCRIBE agendaTelefonica;
Inserindo Valores
INSERT INTO agendaTelefonica
VALUES(
0, Eduardo', Mendes',
eduardo@fa7.edu.br', '123567
);
Recuperando os dados
! Eu quero visualizar todos os registro
de uma tabela
SELECT * FROM nomeDaTabela;
No MySQL
SELECT * FROM agendaTelefonica;

Java Database Connectivity
! Conectividade a Bancos de Dados Java
! Biblioteca
! Acesso a bancos de dados por meio de Java
! Desenvolvedores podem acessar bancos de dados
no importando quem o distribuidor
! Utilizao de driver

Java Name and Directory Interface
JNDI
API Java padro
para acessar
diretrios
Local
centralizado
Aplicao Java
pode recuperar
recursos
externos atravs
de um nome

Java Name and Directory Interface
! Principais estruturas:
! Principal mtodo de Context:
lookup([recurso])
Configurando o acesso ao banco
via JNDI
! Instale o driver JDBC do MySQL na pasta lib do
Tomcat
! Configure um nome JNDI para o banco de dados
que aplicao deve acessar no arquivo server.xml
do tomcat.
! Este arquivo se encontra na pasta conf
! Configure sua aplicao para acessar o recurso
JNDI.
! Faa isto no web.xml

Instalando o driver
Configurando o server.xml
<Context docBase="16102008" path="/16102008"
reloadable="true"
source="org.eclipse.jst.j2ee.server:16102008" >
<Resource name="jdbc/fa7"
auth="Container"
type="javax.sql.DataSource
maxActive="100" maxIdle="30" maxWait="10000
username="root" password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/fa7"
/>
</Context>
Configurando o web.xml
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/fa7</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Preparando uma classe para
acessar o Banco de Dados
! Crie uma classe chamada AlunoDAO, no pacote
dao
! DAO Data Access Object

! Dentro da classe crie um mtodo chamado:
! public void getAlunos() throws Exception

getAlunos()
Context initCtx = null;
Context envCtx = null;
DataSource ds = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");

JDBC
Principais Classes
! javax.sql.DataSource
! Abrange os detalhes de como obter uma conexo para o
banco de dados
! java.sql.Connection
! Representa uma conexo com um banco de dados
! java.sql.Statement
! Fornece mtodos para o desenvolvedor executar instrues
SQL
! java.sql.ResultSet
! Representa o resultado de uma instruo SQL de Pesquisa
javax.sql.DataSource
! Uma interface definida na API
! Modo recomendado para um desenvolvedor obter
um objeto Connection
! Aps obter uma instncia de DataSource
! possvel recuperar o objeto Connection
! Como?
! Chamar o mtodo getConnection() em uma instncia
de DataSource
Recuperando DataSource
! O contexto JNDI abstrai os detalhes de conexo
com o recurso
! Utilize o nome com o qual DataSource foi
configurado
ds = (DataSource) envCtx.lookup("jdbc/fa7");

! Uma vez que se tenha uma instncia DataSource
vlida, obter uma conexo :
Connection conn = ds.getConnection();
Obtendo um DataSource
e a conexo



initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/fa7");
conn = ds.getConnection();
java.sql.Connection
! Objetos da classe java.sql.Connection
! Representam conexes atuais para o banco de
dados

! A partir deste objeto possvel criar a classe
Statement
Obtendo um objeto Statement


initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/fa7");
conn = ds.getConnection();
stmt = conn.createStatement();
java.sql.Statement
! Mtodos
! executeQuery
! Executa comandos SELECT, retornando o resultado
de operaes como um objeto ResultSet
! executeUpdate
! Executa comandos INSERT, UPDATE ou DELETE,
retornando o nmero de colunas afetadas como um
tipo int
Executando uma consulta
initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/fa7");
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM alunos");
java.sql.ResultSet
! Resultados de uma consulta no banco de dados
! Um objeto ResultSet pode ser visualizado como
uma tabela
! A informao recuperada uma linha por vez
! O objeto ResultSet mantm a linha corrente
! Para percorrer as linhas da tabela em ResultSet,
usamos o mtodo next()
Percorrendo os resultados
rs = stmt.executeQuery("SELECT * FROM alunos");

while (rs.next()) {
String alunoNome = rs.getString("nome");
int alunoIdade = rs.getInt("idade");
int alunoId = rs.getInt("id");
System.out.println(alunoId);
System.out.println(alunoNome);
System.out.println(alunoIdade);
}
Liberando Recursos do Sistema
! Este um passo muito importante que
freqentemente negligenciado aps ter sido
completada
! Deve ser feita explicitamente e uma
responsabilidade do programador
! Sem executar tal liberao, os recursos tomados
pela operao no podem ser usadas no futuro
! Para aplicaes muito grandes, isto rapidamente
resulta na perda de conexes disponveis
Liberando Recursos do Sistema
! Executada chamando o mtodo close() disponveis em
cada objeto das classes Connection, Statement, e
ResultSet
! Existem uma ordem especfica envolvida
! O mtodo close est definido para lanar uma
SQLException
! Erros comuns dos desenvolvedores: colocar
simplesmente os mtodos dentro do corpo do programa
! Somente recorrer a condies de bem sucedidas
! O cdigo deve ser colocado dentro de uma clusula
finally
Liberando Recursos do Sistema
} finally {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {}

try {
if (stmt != null)
stmt.close();
} catch (SQLException e) {}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {}
}
Prepared Statement
! Classe que deriva de Statement
! Tem performance melhor
! Uma consulta pr-compilada
! O Banco de Dados executa direto, sem ter que
compilar
! prefervel us-la quando a consulta deve ser
usada mais que uma vez
Criando um Objeto
PreparedStatement
! Cria-se atravs de uma conexo, assim como o
Statement
! Parmetros so fornecidos em forma de ?
! Posteriormente sero substitudos por valores
Criando um Objeto
PreparedStatement



PreparedStatement teste =
conn.prepareStatement(
UPDATE alunos SET nome = ? WHERE id = ?);
Fornecendo os valores da
consulta
! Os valores representados por ? devem ser
informados

! Mtodos setXXX
! Para int, setInt()
! Para String setString()
! Existe um mtodo para cada tipo primitivo
declarado na linguagem JAVA
Fornecendo os valores da
consulta
PreparedStatement teste =
conn.prepareStatement(
UPDATE alunos SET nome = ? WHERE id
= ?);

teste.setString(1, Dudu);
teste.setInt(2, 1);

Como executar a consulta?
PreparedStatement teste =
conn.prepareStatement(
UPDATE alunos SET nome = ? WHERE id
= ?);
teste.setString(1, Dudu);
teste.setInt(2, 1);

teste.executeUpdate();
Usando um lao para alterar
PreparedStatement alterarAlunos;
String alterarString =
UPDATE alunos SET nome = ? WHERE id = ?";
alterarAlunos = conn.prepareStatement(alterarString);

int [] alunosIds= {175, 150, 60, 155, 90};
String [] nomes = {Eduardo", Gustavo", Odmir",
Fernando", Raphabs"};
int len = nomes.length;
for(int i = 0; i < len; i++) {
alterarAlunos.setInt(1, alunosIds[i]);
alterarAlunos.setString(2, nomes[i]);
alterarAlunos.executeUpdate();
}
Transaes
! Algumas vezes necessrio que certas consultas
s executem caso outras tenham sucesso
! Uma transao pode ser vista como um conjunto
de consultas dependentes
Transaes
con.setAutoCommit(false);
PreparedStatement alterarAluno =
con.prepareStatement( "UPDATE alunos SET nome = ?
WHERE id = ?");
alterarAluno.setInt(1,Dudu);
alterarAluno.setString(2, 1);
alterarAluno.executeUpdate();
PreparedStatement alterarIdade =
con.prepareStatement( "UPDATE alunos SET idade = idade
+ ? WHERE id LIKE ?");
alterarIdade.setInt(1, 1);
alterarIdade.setString(2, 1);
alterarIdade.executeUpdate();
con.commit();
con.setAutoCommit(true);

También podría gustarte