Acesso a banco de dados com JDBC

1.442 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.442
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
68
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Acesso a banco de dados com JDBC

  1. 1. Acesso a Banco de DadosJDBCTécnicas de ProgramaçãoFA7Prof.º Eduardo Mendes
  2. 2. Trabalhandocom Banco de Dados  Nesta aula  Criar um banco de dados e uma tabela de alunos  Configurar a aplicação para acessar o banco dedados  JNDI, server.xml, web.xml  Criar uma classe que acesse o banco com aconfiguração realizada
  3. 3. Conceitos  Tabelas  Linhas  Campos  Chaves primárias
  4. 4. Tabela típica de dados:Agenda Telefônica
  5. 5. Cursos da FA7
  6. 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. 7. Inserindo ValoresINSERT INTO agendaTelefonicaVALUES(0, ‘Eduardo, ‘Mendes,‘eduardo@fa7.edu.br, 123567‘);
  8. 8. Recuperando os dados  Eu quero visualizar todos os registrode uma tabelaSELECT * FROM nomeDaTabela;
  9. 9. No MySQLSELECT * FROM agendaTelefonica;
  10. 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 dadosnão importando quem é o distribuidor  Utilização de “driver”
  11. 11. Java Name and Directory InterfaceJNDIAPI Java padrãopara acessardiretóriosLocalcentralizadoAplicação Javapode recuperarrecursosexternos atravésde um nome
  12. 12. Java Name and Directory Interface  Principais estruturas:  Principal método de Context:lookup(“[recurso]”)
  13. 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 aplicação deve acessar no arquivo server.xmldo tomcat.  Este arquivo se encontra na pasta conf  Configure sua aplicação para acessar o recursoJNDI.  Faça isto no web.xml
  14. 14. Instalando o driver
  15. 15. 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>
  16. 16. 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>
  17. 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 método chamado:  public void getAlunos() throws Exception
  18. 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. 19. JDBCPrincipais Classes  javax.sql.DataSource  Abrange os detalhes de como obter uma conexão para obanco de dados  java.sql.Connection  Representa uma conexão com um banco de dados  java.sql.Statement  Fornece métodos para o desenvolvedor executar instruçõesSQL  java.sql.ResultSet  Representa o resultado de uma instrução SQL de Pesquisa
  20. 20. javax.sql.DataSource  Uma interface definida na API  Modo recomendado para um desenvolvedor obterum objeto Connection  Após obter uma instância de DataSource  É possível recuperar o objeto Connection  Como?  Chamar o método getConnection() em uma instânciade DataSource
  21. 21. Recuperando DataSource  O contexto JNDI abstrai os detalhes de conexãocom o recurso  Utilize o nome com o qual DataSource foiconfiguradods = (DataSource) envCtx.lookup("jdbc/fa7");  Uma vez que se tenha uma instância DataSourceválida, obter uma conexão é:Connection conn = ds.getConnection();
  22. 22. Obtendo um DataSourcee a conexãoinitCtx = new InitialContext();envCtx = (Context) initCtx.lookup("java:comp/env");ds = (DataSource) envCtx.lookup("jdbc/fa7");conn = ds.getConnection();
  23. 23. java.sql.Connection  Objetos da classe java.sql.Connection  Representam conexões atuais para o banco dedados  A partir deste objeto é possível criar a classeStatement
  24. 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. 25. java.sql.Statement  Métodos  executeQuery  Executa comandos SELECT, retornando o resultadode operações como um objeto ResultSet  executeUpdate  Executa comandos INSERT, UPDATE ou DELETE,retornando o número de colunas afetadas como umtipo int
  26. 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. 27. java.sql.ResultSet  Resultados de uma consulta no banco de dados  Um objeto ResultSet pode ser visualizado comouma tabela  A informação é recuperada uma linha por vez  O objeto ResultSet mantém a linha corrente  Para percorrer as linhas da tabela em ResultSet,usamos o método next()
  28. 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. 29. Liberando Recursos do Sistema  Este é um passo muito importante quefreqüentemente é negligenciado após ter sidocompletada  Deve ser feita explicitamente e é umaresponsabilidade do programador  Sem executar tal liberação, os recursos tomadospela operação não podem ser usadas no futuro  Para aplicações muito grandes, isto rapidamenteresulta na perda de conexões disponíveis
  30. 30. Liberando Recursos do Sistema  Executada chamando o método close() disponíveis emcada objeto das classes Connection, Statement, eResultSet  Existem uma ordem específica envolvida  O método close está definido para lançar umaSQLException  Erros comuns dos desenvolvedores: colocarsimplesmente os métodos dentro do corpo do programa  Somente recorrer a condições de bem sucedidas  O código deve ser colocado dentro de uma cláusulafinally
  31. 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. 32. Prepared Statement  Classe que deriva de Statement  Tem performance melhor  Uma consulta pré-compilada  O Banco de Dados executa direto, sem ter quecompilar  É preferível usá-la quando a consulta deve serusada mais que uma vez
  33. 33. Criando um ObjetoPreparedStatement  Cria-se através de uma conexão, assim como oStatement  Parâmetros são fornecidos em forma de “?”  Posteriormente serão substituídos por valores
  34. 34. Criando um ObjetoPreparedStatementPreparedStatement teste =conn.prepareStatement(“UPDATE alunos SET nome = ? WHERE id = ?”);
  35. 35. Fornecendo os valores daconsulta  Os valores representados por “?” devem serinformados  Métodos setXXX  Para int, setInt()  Para String setString()  Existe um método para cada tipo primitivodeclarado na linguagem JAVA
  36. 36. Fornecendo os valores daconsultaPreparedStatement teste =conn.prepareStatement(“UPDATE alunos SET nome = ? WHERE id= ?”);teste.setString(1, “Dudu”);teste.setInt(2, 1);
  37. 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. 38. Usando um laço 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. 39. Transações  Algumas vezes é necessário que certas consultassó executem caso outras tenham sucesso  Uma transação pode ser vista como um conjuntode consultas dependentes
  40. 40. Transaçõescon.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);

×