Upload
phamduong
View
221
Download
0
Embed Size (px)
Citation preview
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
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
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
JDBC – Detalhes de Conexão
Tipos de Dados Suportados
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.
Configuração ODBC
Configuração ODBC
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
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);
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).
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);
}
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. "); }
}}
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);}
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...
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(?, ? )”);
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");}
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}