Upload
layon91
View
8
Download
2
Embed Size (px)
Citation preview
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', [email protected]', '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
Configurando o web.xml DB Connection jdbc/fa7 javax.sql.DataSource Container
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);