acesso a banco de dados com jdbc 130430174230 phpapp02

42
Acesso a Banco de Dados JDBC Técnicas de Programação FA7 Prof.º Eduardo Mendes

Upload: layon91

Post on 23-Nov-2015

8 views

Category:

Documents


2 download

TRANSCRIPT

  • 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);