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

Acesso a banco de dados com JDBC

Embed Size (px)

Citation preview

  • 1. Acesso a Banco de DadosJDBCTcnicas de ProgramaoFA7Prof. Eduardo Mendes

2. Trabalhandocom Banco de Dados Nesta aula Criar um banco de dados e uma tabela de alunos Configurar a aplicao para acessar o banco dedados JNDI, server.xml, web.xml Criar uma classe que acesse o banco com aconfigurao realizada 3. Conceitos Tabelas Linhas Campos Chaves primrias 4. Tabela tpica de dados:Agenda Telefnica 5. Cursos da FA7 6. No MySQLCREATE 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; 7. Inserindo ValoresINSERT INTO agendaTelefonicaVALUES(0, Eduardo, Mendes,[email protected], 123567); 8. Recuperando os dados Eu quero visualizar todos os registrode uma tabelaSELECT * FROM nomeDaTabela; 9. No MySQLSELECT * FROM agendaTelefonica; 10. Java Database Connectivity Conectividade a Bancos de Dados Java Biblioteca Acesso a bancos de dados por meio de Java Desenvolvedores podem acessar bancos de dadosno importando quem o distribuidor Utilizao de driver 11. Java Name and Directory InterfaceJNDIAPI Java padropara acessardiretriosLocalcentralizadoAplicao Javapode recuperarrecursosexternos atravsde um nome 12. Java Name and Directory Interface Principais estruturas: Principal mtodo de Context:lookup([recurso]) 13. Configurando o acesso ao bancovia JNDI Instale o driver JDBC do MySQL na pasta lib doTomcat Configure um nome JNDI para o banco de dadosque aplicao deve acessar no arquivo server.xmldo tomcat. Este arquivo se encontra na pasta conf Configure sua aplicao para acessar o recursoJNDI. Faa isto no web.xml 14. Instalando o driver 15. Configurando o server.xml 16. Configurando o web.xmlDB Connectionjdbc/fa7javax.sql.DataSourceContainer 17. Preparando uma classe paraacessar o Banco de Dados Crie uma classe chamada AlunoDAO, no pacotedao DAO Data Access Object Dentro da classe crie um mtodo chamado: public void getAlunos() throws Exception 18. 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"); 19. JDBCPrincipais Classes javax.sql.DataSource Abrange os detalhes de como obter uma conexo para obanco de dados java.sql.Connection Representa uma conexo com um banco de dados java.sql.Statement Fornece mtodos para o desenvolvedor executar instruesSQL java.sql.ResultSet Representa o resultado de uma instruo SQL de Pesquisa 20. javax.sql.DataSource Uma interface definida na API Modo recomendado para um desenvolvedor obterum objeto Connection Aps obter uma instncia de DataSource possvel recuperar o objeto Connection Como? Chamar o mtodo getConnection() em uma instnciade DataSource 21. Recuperando DataSource O contexto JNDI abstrai os detalhes de conexocom o recurso Utilize o nome com o qual DataSource foiconfiguradods = (DataSource) envCtx.lookup("jdbc/fa7"); Uma vez que se tenha uma instncia DataSourcevlida, obter uma conexo :Connection conn = ds.getConnection(); 22. Obtendo um DataSourcee a conexoinitCtx = new InitialContext();envCtx = (Context) initCtx.lookup("java:comp/env");ds = (DataSource) envCtx.lookup("jdbc/fa7");conn = ds.getConnection(); 23. java.sql.Connection Objetos da classe java.sql.Connection Representam conexes atuais para o banco dedados A partir deste objeto possvel criar a classeStatement 24. Obtendo um objeto StatementinitCtx = new InitialContext();envCtx = (Context) initCtx.lookup("java:comp/env");ds = (DataSource) envCtx.lookup("jdbc/fa7");conn = ds.getConnection();stmt = conn.createStatement(); 25. java.sql.Statement Mtodos executeQuery Executa comandos SELECT, retornando o resultadode operaes como um objeto ResultSet executeUpdate Executa comandos INSERT, UPDATE ou DELETE,retornando o nmero de colunas afetadas como umtipo int 26. Executando uma consultainitCtx = 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"); 27. java.sql.ResultSet Resultados de uma consulta no banco de dados Um objeto ResultSet pode ser visualizado comouma 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() 28. Percorrendo os resultadosrs = 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);} 29. Liberando Recursos do Sistema Este um passo muito importante quefreqentemente negligenciado aps ter sidocompletada Deve ser feita explicitamente e umaresponsabilidade do programador Sem executar tal liberao, os recursos tomadospela operao no podem ser usadas no futuro Para aplicaes muito grandes, isto rapidamenteresulta na perda de conexes disponveis 30. Liberando Recursos do Sistema Executada chamando o mtodo close() disponveis emcada objeto das classes Connection, Statement, eResultSet Existem uma ordem especfica envolvida O mtodo close est definido para lanar umaSQLException Erros comuns dos desenvolvedores: colocarsimplesmente os mtodos dentro do corpo do programa Somente recorrer a condies de bem sucedidas O cdigo deve ser colocado dentro de uma clusulafinally 31. 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) {}} 32. Prepared Statement Classe que deriva de Statement Tem performance melhor Uma consulta pr-compilada O Banco de Dados executa direto, sem ter quecompilar prefervel us-la quando a consulta deve serusada mais que uma vez 33. Criando um ObjetoPreparedStatement Cria-se atravs de uma conexo, assim como oStatement Parmetros so fornecidos em forma de ? Posteriormente sero substitudos por valores 34. Criando um ObjetoPreparedStatementPreparedStatement teste =conn.prepareStatement(UPDATE alunos SET nome = ? WHERE id = ?); 35. Fornecendo os valores daconsulta Os valores representados por ? devem serinformados Mtodos setXXX Para int, setInt() Para String setString() Existe um mtodo para cada tipo primitivodeclarado na linguagem JAVA 36. Fornecendo os valores daconsultaPreparedStatement teste =conn.prepareStatement(UPDATE alunos SET nome = ? WHERE id= ?);teste.setString(1, Dudu);teste.setInt(2, 1); 37. Como executar a consulta?PreparedStatement teste =conn.prepareStatement(UPDATE alunos SET nome = ? WHERE id= ?);teste.setString(1, Dudu);teste.setInt(2, 1);teste.executeUpdate(); 38. Usando um lao para alterarPreparedStatement 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();} 39. Transaes Algumas vezes necessrio que certas consultass executem caso outras tenham sucesso Uma transao pode ser vista como um conjuntode consultas dependentes 40. Transaescon.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);