16
Java e Conexão Java e Conexão com Banco de Dados com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java A Plataforma Java Programação Orientada a Objetos em Java Programação Orientada a Objetos em Java Conexão com Banco de Dados n JDBC: Java Database Connectivity n Acesso a Bando de Dados SQL Independente da Plataforma e do Banco de Dados; Disponível no pacote J2SDK n Vários Drivers disponíveis 100% Puro Java Diversos drivers disponíveis

Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Embed Size (px)

Citation preview

Page 1: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Java e Conexão Java e Conexão com Banco de Dadoscom Banco de Dados

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma JavaA Plataforma JavaProgramação Orientada a Objetos em JavaProgramação Orientada a Objetos em Java

Conexão com Banco de Dados

n JDBC: Java Database Connectivityn Acesso a Bando de Dados SQL

• Independente da Plataforma e do Banco de Dados;

• Disponível no pacote J2SDKn Vários Drivers disponíveis

• 100% Puro Java• Diversos drivers disponíveis

Page 2: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

JDBC

n Bancos de dados em Java – JDBCn Java DataBase Connectivity é a API que nos

permite acessar bancos de dados através de nossa querida e amada linguagem Java.

n A idéia é simples, existem diferentes tipos de drivers para bancos de dados, mas para os programadores as chamadas são uniformes.

JDBC

n Estabelece conexão com o Banco de Dados

n Envia requisições SQLn Processa os resultados

Page 3: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

JDBCnModelo de desenvolvimento de

aplicações com BD

Recursos on-line sobre JDBC

n Site da sun sobre JDBCn http://java.sun.com/products/jdbc/n Tutorial sobre JDBCn http://java.sun.com/docs/books/tutorial/jdbc/n JDBC Drivers disponíveisn http://industry.java.sun.com/products/jdbc/drivers

Page 4: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

JDBC – Detalhes de Conexão

Tipos de Dados Suportados

Page 5: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Acessando um banco

n Primeiro deve haver um banco de dados configurado e disponível

n Criando um banco Access...

Uso de um Banco de Dados

nDuas opções• Acessar o Banco via ponte JDBC-ODBCüNecessidade de configurar um DSN do

usuário no ODBC.

n Via driver JDBC direto para o Banco• Necessidade de se obter o driver

adequado.

Page 6: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Configuração ODBC

Configuração ODBC

Page 7: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Passos básicos para Conexão JDBC

n Importar java.sql.*n Carregar driver JDBCn Especificar BDn Abrir conexão com BDn Criar um objeto comando (statement)n Submeter o comando SQLn Receber o resultadon Utilizar os resultados no programa

Passos básicos para Conexão JDBC

n 1. Importar java.sql.*import java.sql*;

n 2. Carregar driver JDBCtry {Class.forName(" sun.jdbc.odbc.JdbcOdbcDriver");

}catch { ClassNotFoundException cnfe) {System.out.println(“Erro no carregamento do driver: " cnfe);}

Obs: toda tentativa de conexão com driver de BD tem que tratar possíveis exceções.

n a JVM deve poder encontrar estas classes: para aplicações, a variável de ambiente CLASSPATH deve incluir os drivers

Page 8: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

n A abertura da conexão é feita pelo método getConnection, que recebe uma URL (Universal Resource Location) como argumento

n JDBC URLs são formadas por: um protocolo (normalmente jdbc), um subprotocolo (normalmente é o tipo de driver) e informações para o SGBD.Connection conn = DriverManager.getConnection("jdbc:odbc:Empresa", "login", "senha");

n 3. Especificar BDString host = “jdbc:odbc:Empresa";

n 4. Abrir conexão com BDString nomeUsuario = “giuliano";String senha = "secreta";Connection connection = DriverManager.getConnection(host,nomeUsuario, senha);

Passos básicos para Conexão JDBC

n Opcionalmente, podemos obter algumas informações sobre o Banco.

DatabaseMetaData dbMetaData = connection.getMetaData();String nomeBanco = dbMetaData.getDatabaseProductName();System.out.println("Database: " + nomeBanco);String versaoBanco =dbMetaData.getDatabaseProductVersion();System.out.println("Version: " + versaoBanco);

Page 9: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

import java.sql.*;class BDConexao {

public static void main (String args[]) {try {

String url = "jdbc:odbc:Empresa";String usuario = "";String senha = "";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection con;con = DriverManager.getConnection(url,usuario,senha);

System.out.println("Conexão realizada com sucesso.");

con.close();}

catch(Exception e){ System.out.println("Problemas na conexão."); }

}}

Conectando...

Statements

n Uma vez conectado queremos executar statements

n Assim podemos utilizar • executeUpdate(String str) – para executar

create table, insert, update• executeQuery(String str) – para executar

consultas (retorna ResultSet).

Page 10: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

n 5. Criar um objeto comando (statement)Statement statement =connection.createStatement();

n 6. Submeter o comando SQLString consulta ="SELECT col1, col2, col3 FROM

algumaTabela";ResultSet resultado =statement.executeQuery(consulta);

– Para modificar o banco, usar executeUpdate ou invés deexecuteQuery,tendo como parâmetro um string contendocomandos UPDATE, INSERT,ou DELETE

– Usar setQueryTimeout para especificar o tempo máximo de espera pelo resultado da consulta.

Criando uma tabelastmt = cnt.createStatement();try {

stmt.executeUpdate("CREATE TABLE LIVRO " +"(TITULO VARCHAR(50), ISBN VARCHAR(30), “+“AUTOR VARCHAR(50), PAGINAS INTEGER)");

}catch (SQLException e) {System.out.println(e);

}

Page 11: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

import java.sql.*;class BDConsulta{

public static void main (String args[]) {try {String url = "jdbc:odbc:Empresa";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection con = DriverManager.getConnection(url, " ", " ");

Statement st = con.createStatement();st.executeUpdate("INSERT INTO Pedidos (CodPedido, CodCli,

Descricao, Valor, DataPedido) VALUES (1001,1230,'Dicionário Aurélio Século XXI.',36.50,#16-03-2002#)");

,

System.out.println("Operação realizada com sucesso.");

st.close();con.close();}catch(Exception e){ System.out.println("Problemas na conexão."); }

}}

Inserindo Dados

Consultando dados// conexão estabelecida

Statement st = con.createStatement();ResultSet rs = st.executeQuery("SELECT * FROM Pedidos");

while (rs.next()){System.out.print(rs.getString("CodPedido") + " ");System.out.print(rs.getString("CodCli") + " ");System.out.print(rs.getString("Descricao") + " ");System.out.print(rs.getString("Valor") + " ");System.out.println(rs.getString("DataPedido"));

}

System.out.println("Operação realizada com sucesso.");

st.close();con.close();}

catch(Exception e){ System.out.println("Problemas na conexão. "); }

}}

Page 12: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

Uso de driver JDBC direto

n Colocar o arquivo com os drivers do Banco de Dados no diretório• WEB-INF/lib *criar o diretório lib emüGeralmente é um arquivo .jar.

Passos básicos para Conexão JDBC Direto

n 1. Importar java.sql.*import java.sql*;

n 2. Carregar driver JDBCtry {Class.forName("com.mysql.jdbc.Driver").newInstance(); //ou

//Class.forName("oracle.jdbc.driver.OracleDriver");}catch { ClassNotFoundException cnfe) {System.out.println(“Erro no carregamento do driver: " cnfe);}

Page 13: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

n 3. Especificar BDString host = “//localhost";String dbName = “livraria";String mysqlURL = "jdbc:mysql:”+host +“/" +dbName;

n 4. Abrir conexão com BDString nomeUsuario = “root";String senha = “admin";Connection connection =

DriverManager.getConnection(mysqlURL,nomeUsuario, senha);

Passos básicos para Conexão JDBC Direto

PreparedStatements

n Também podemos usar PreparedStatements para ter um resultado mais rápido...

Page 14: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

PreparedStatements...PreparedStatement prep = cnt.prepareStatement(

"SELECT * FROM LIVRO WHERE ISBN = ?");

prep.setString(1,"123456789");

ResultSet rs = prep.executeQuery();while (rs.next()) {

String s = rs.getString("TITULO");String i = rs.getString("ISBN");String a = rs.getString("AUTOR");int pa = rs.getInt("PAGINAS");System.out.println(s + " " + i + " " + a + " " + pa);

}

n Prepared Statementsn Cada vez que se executa um comando SQL passado por meio

de uma String, este String deve ser analisado pelo processador de SQL do SGBD que irá, no caso da String estar sintaticamente correta, gerar um código binário que será executado para atender à solicitação.

n Todo esse processo é caro e sua execução repetidas vezes terá um impacto significativo sobre o desempenho da aplicação e do SGBD como um todo. Prepared Statement é indicado nos casos onde um comando será executado várias vezes em uma aplicação.

n Neste caso é melhor compilar o comando uma única vez e toda vez que for necessário executá-lo basta enviar o comando compilado.

n Além disso, o comando pré-compilado pode ser parametrizado, tornando-o mais genérico e, portanto, apto a expressar um maior número de consultas.

n Para criar um Prepared Statement é necessário:PreparedStatement pstmt = con.prepareStatement(“INSERT INTO usuarios(login,senha) VALUES(?, ? )”);

Page 15: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

n O comando anterior insere uma nova linha na tabela usuarios com os valores das colunas logine senha passados por parâmetro. O caractere ‘?’ representa o parâmetro. Este tipo de comando só possui valor tendo parâmetros, caso contrário teria pouca chance de ser reutilizado.

n Para executar o comando devemos especificar o valor dos parâmetros e executar o comando, como mostrado no exemplo abaixo:

pstmt.clearParameters();pstmt.setInt(1,8);pstmt.setString(2,”Clara Maria”);pstmt.executeUpdate();

Setando os Parâmetros

n Receber o resultadowhile(resultadot.next()){

System.out.println(resultado.getString(1)+""+resultado.getString(2) +""+ resultado.getString(3));

}– A primeira coluna tem índice 1, não 0n A classe ResultSet oferece à aplicação a tabela resultante de

um Select e• mantém um cursor posicionado em uma linha da tabela. Inicialmente

este cursor está antes da primeira linha e a mensagem next() movimenta o cursos para frente.

• Permite à aplicação pegar os dados das colunas da linha correnteatravés de mensagem getXXX(<cloluna>).ü XXX é o tipo da colunaü <coluna> é o nome da coluna ou sua posição (a partir de 1)

ResultSet rs = stmt.executeQuery("select a, b, c from table1");

while (rs.next()) {int x = rs.getInt("a");String s = rs.getString(2);float f = rs.getFloat("c");}

Page 16: Java e Conexãxãoo com Banco de Dados · com Banco de Dados Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos em Java Conexão com

n Permite obter informações sobre o tipo de tabela que resultou o select.• Quais os nomes e os tipos das colunas• Se a coluna do tipo é numérico com sinal

ResultSet result = stmt.executeQuery("SELECT * FROM TabEx ORDER BY id DESC");

ResultSetMetaData meta = result.getMetaData();int columns = meta.getColumnCount();for (int i=1;i<=columns;i++) {System.out.println (meta.getColumnLabel(i) + "\t"+ meta.getColumnTypeName(i)); }

Outros métodos da interface ResultSet

isFirst(): retorna verdadeiro se o curso está posicionado sobre oprimeiro registro da tabela resultanteisLast(): retorna verdadeiro se o curso está posicionado sobre oultimo registro da tabela resultantenext(): posiciona o cursor da tabela sobre o próximo registro.

Transaçõesn Uma transação é um conjunto de Statements que

são validados no BD com commit ou cancelados com rollbabk

n Por default, todos os comandos no JDBC são auto-commit.

connection.setAutoCommit(false); // muda o defaultStatement s = con.createStatement();try {

s.executeUpdate("SQL statement 1");s.executeUpdate("SQL statement 2");connection.commit(); // valida os 2 updates

} catch (Exception e) {connection.rollback(); // senão, desfaz os updates}