Anda di halaman 1dari 21

Acesso a dados com JDBC

Acessando dados em Java com JDBC


Prof. Manuel Trindade mantrin@hotmail.com

Acesso a dados com JDBC


Objetivos
O que JDBC? Arquitetura da API Detalhes e uso da API

Acesso a dados com JDBC


O que JDBC?
Diferentes bancos de dados relacionais possuem diferentes formas de se comunicar com uma aplicao que necessite acessar os seus dados.

Isto causa um grande problema de codificao e manuteno nas aplicaes que precisam trabalhar com diversos banco de dados e tambm requer o aprendizado de uma nova API para cada BD diferente. Isso no torna a aplicao flexvel.

Acesso a dados com JDBC


O que JDBC?
A Sun desenvolveu a API JDBC, com a inteno de uniformizar os acessos aos diferentes bancos de dados relacionais, dando maior flexibilidade aos sistemas.

JDBC = Java DataBase Connectivity

Com JDBC as chamadas ao BD so padronizadas, apesar de que os comandos SQL podem variar de banco para banco, se no for usado o SQL padro.

Acesso a dados com JDBC


O que JDBC?
A biblioteca da JBDC prov um conjunto de interfaces de acesso ao BD. Uma implementao em particular dessas interfaces chamada de driver.

Os prprios fabricantes dos bancos de dados (ou terceiros) so quem implementam os drivers JDBC para cada BD, pois so eles que conhecem detalhes dos BDs. Cada BD possui um Driver JDBC especfico (que usado de forma padro - JDBC).
A API padro do Java j vem com o driver JDBC-ODBC, que uma ponte entre a aplicao Java e o banco atravs da configurao de um recurso ODBC na mquina. O drivers de outros fornecedores devem ser adicionados ao CLASSPATH da aplicao para poderem ser usados. Desta maneira, pode-se mudar o driver e a aplicao no muda.

Acesso a dados com JDBC


Arquitetura do JDBC?
pacote: java.sql

Acesso a dados com JDBC


Arquitetura do JDBC?
As principais classes e interfaces do pacote java.sql so: DriverManager - gerencia o driver e cria uma conexo com o banco. Connection - a classe que representa a conexo com o bando de dados. Statement - controla e executa uma instruo SQL . PreparedStatement - controla e executa uma instruo SQL. melhor que Statement. ResultSet - contm o conjunto de dados retornado por uma consulta SQL. ResultsetMetaData - a classe que trata dos metadados do banco. A interface Connection possui os mtodos para criar um Statement, fazer o commit ou rollback de uma transao, verificar se o auto commit est ligado e poder (des)lig-lo, etc. As interfaces Statement e PreparedStatement possuem mtodos para executar comandos SQL. ResultSet possui mtodo para recuperar os dados resultantes de uma consulta, alm de retornar os metadados da consulta. ResultsetMetaData possui mtodos para recuperar as meta informaes do banco.

Acesso a dados com JDBC


Utilizando O JDBC?
Para a aplicao Java se comunicar com um banco de dados e acessar os seus dados, uma conexo com o BD deve ser estabelecida. A conexo estabelecida de seguinte forma: Carregamento do driver JDBC especfico Criao da conexo com o BD A partir da conexo possvel interagir com o BD, fazendo consultas, atualizao e busca s meta informaes da base e das tabelas.

Acesso a dados com JDBC


Utilizando O JDBC?
Carregamento do driver JDBC especfico: Class.forName("org.postgresql.Driver); A String passada ao mtodo forName() o nome completo qualificado (fully qualified name) da classe que implementa o Driver JDBC de cada banco de dados. No exemplo usado o nome do driver da ponte JDBC-ODBC. Cada driver possui um nome diferente, consulte a documentao do fabricante. Desta forma o carregamento do driver feito de forma dinmica (via Class.forName), dando flexibilidade ao cdigo. Para maior flexibilidade, o nome poderia estar contido em um arquivo de configurao externo, podendo ser alterado sem a necessidade de recompilar o fonte Java.

Acesso a dados com JDBC


Utilizando O JDBC?
Criao da conexo com o BD: Connection conn = DriverManager.getConnection( url, usuario, senha );
Aps o carregamento do driver, a classe DriverManager a responsvel por se conectar ao banco de dados e devolver um objeto Connection, que representa a conexo com o BD. O parmetro url tambm especfico de cada fornecedor de driver, consulte a documentao. Geralmente, na url so informados o IP ou nome do servidor, porta e o nome da base de dados (database ou instncia). Os outros argumentos so o nome do usurio do banco e sua senha de acesso.

Acesso a dados com JDBC


Utilizando O JDBC?
Com a conexo estabelecida j possvel interagir com o BD de vrias formas: Criar tabelas e outros elementos Inserir, Alterar e Remover registros Buscar registros Buscar as meta informaes do banco

As trs primeira interaes se do por meio das interfaces Statement ou PreparedStatement, que veremos a seguir.
Todos os exemplos esto baseados no uso do driver JDBC fornecido pela Postgres sql. Porm, os mesmo exemplos podem ser usados com qualquer banco de dados relacional que possua um driver JDBC, necessitando apenas trocar o nome do driver e a URL de conexo.

Lembrando que o JAR do driver JDBC, fornecido pelo fabricante, precisa ser disponibilizado no CLASSPATH da aplicao.

Acesso a dados com JDBC


Statement
O exemplo abaixo se conecta ao banco de dados local, na instncia Agenda e cria uma tabela chamada AGENDA, com os campos ID e NOME. String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://localhost:5432/Agenda"; String user = "usuario"; String password = "senha"; Class.forName( driver ); Connection conn = DriverManager.getConnection( url, user, password ); String sql = CREATE TABLE AGENDA ( ID NUMBER, NOME VARCHAR2(100) )"; Statement st = conn.createStatement(); st.executeUpdate( sql ); st.close(); conn.close(); Atravs do mtodo createStatement() de Connection retornado um objeto Statement, que usado para executar um comando SQL no BD. O mtodo executeUpdate() de Statement recebe o SQL que ser executado. Este mtodo deve ser usado para DDLs e comandos SQL de INSERT, UPDATE ou DELETE. Depois os mtodos close() de Statement e Connection so invocados para liberar os recursos.

Acesso a dados com JDBC


Statement
O objeto Statement criado pode ser reusado vrias vezes para executar diferentes comandos SQL. Isto at recomendado.
String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://localhost:5432/Agenda"; String user = "usuario"; String password = "senha"; Class.forName( driver ); Connection conn = DriverManager.getConnection( url, user, password ); Statement st = conn.createStatement(); String sql = INSERT INTO PESSOA VALUES (1,Manuel Trindade)"; st.executeUpdate( sql ); sql = INSERT INTO PESSOA VALUES (2,LUS INCIO)"; st.executeUpdate( sql ); sql = INSERT INTO PESSOA VALUES (3,ANTNIO CARLOS)"; st.executeUpdate( sql ); st.close(); conn.close();

Acesso a dados com JDBC


Statement
O exemplo abaixo se conecta ao banco de dados local, na instncia Agenda e cria uma tabela chamada AGENDA, com os campos ID e NOME. String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://localhost:5432/Agenda"; String user = "usuario"; String password = "senha"; Class.forName( driver ); Connection conn = DriverManager.getConnection( url, user, password ); String sql = CREATE TABLE AGENDA ( ID NUMBER, NOME VARCHAR2(100) )"; Statement st = conn.createStatement(); st.executeUpdate( sql ); st.close(); conn.close(); Porm, o Statement s pode ser liberado com o mtodo close() ao final das execues de todos os comandos SQL.

Acesso a dados com JDBC


Resultset
A recuperao de dados do BD trivial e feita atravs da execuo de uma query SQL, e os dados podem ser recuperados atravs da interface ResultSet, retornada na execuo da query. Connection conn = ... String sql = "SELECT ID, NOME FROM PESSOA"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( sql ); while( rs.next() ) { System.out.println( rs.getString("ID") ); System.out.println( rs.getString("NOME") ); } O mtodo executeQuery() de Statment executa uma consulta (query) rs.close(); SQL e retorna um objet ResultSet, que contm os dados st.close(); recuperados. conn.close(); Atravs do mtodo next() de ResultSet, o cursor interno movido para o prximo registro. O mtodo retorna false caso no existam mais registros ou true caso contrrio. Os valores dos registros podem ser recuperados como o mtodo getString(), que recebe o nome do campo ou seu alias.

Acesso a dados com JDBC


Resultset
Alm do mtodo getString(), a interface ResultSet dispe de outros mtodos para recuperar os dados do BD diretamente nos tipos mais adequados. Os tipos relacionados so os mais indicados, porm outros tipos podem ser usados. Todos os mtodo recebem o nome do campos (ou alias) ou o nmero do campo no select, comeando por 1 (um)..

Acesso a dados com JDBC


Resultset Exemplo:
String sql = "SELECT ID, NOME FROM AGENDA"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( sql ); while( rs.next() ) { System.out.println( rs.getInt("ID") ); System.out.println( rs.getString("NOME") ); } rs.close(); st.close(); conn.close(); String sql = "SELECT ID, NOME FROM AGENDA"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( sql ); while( rs.next() ) { System.out.println( rs.getInt(1) ); System.out.println( rs.getString(2) ); } rs.close(); st.close(); conn.close();

Acesso a dados com JDBC


Adicionando Parametros
Geralmente os comandos SQL recebem valores externos para que trabalhem com dados dinmicos na aplicao. Com o uso de Statement, isso feito simplesmente concatenando o valor ao comando SQL a ser executado. String id = "1"; String sql = "SELECT ID, NOME FROM PESSOA WHERE ID=" + id; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( sql ); String sql = "INSERT INTO PESSOA VALUES(" + id + "," + nome + ")"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( sql ); Esta forma, apesar de ser correta, no a melhor e nem a mais indicada, pois torna o trabalho de concatenao extremamente chato e passvel de erros na montagem do comando SQL, alm de permitir que outros comandos SQL sejam embutidos e executados maliciosamente. A melhor maneira , certamente, trocar o uso de Statement por PreparedStatement.

Acesso a dados com JDBC


PreparedStatment
PreparedStatement tem vantagens sobre Statement, pois ela cria instrues SQL prcompiladas, economizando recursos do prprio banco de dados, otimizando o programa. Alm da facilidade de se adicionar parmetros aos comandos SQL.
String sql = "INSERT INTO AGENDA VALUES ( ?, ? )"; PreparedStatement pst = conn.prepareStatement( sql ); pst.setInt(1, 4); pst.setString(2, "Mrio"); pst.executeUpdate(); pst.close(); conn.close(); String sql = "SELECT ID, NOME FROM AGENDA WHERE NOME LIKE ?"; PreparedStatement pst = conn.prepareStatement( sql ); pst.setString(1, "%Fer%"); ResultSet rs = pst.executeQuery(); while( rs.next() ) { System.out.println( rs.getInt(1) + " / " + rs.getString(2) ); } rs.close(); pst.close(); conn.close();

Acesso a dados com JDBC


PreparedStatment
Os parmetros, com PreparedStatement, podem ser passados diretamente com o prprio tipo que o dado foi definido, evitando assim ter que ficar formatando ou convertendo campos de data e decimais, alm de poder passar inclusive valores nulos (NULL). Integer id = new Integer(5); String nome = null; String sql = "INSERT INTO PESSOA VALUES ( ?, ? )"; PreparedStatement pst = conn.prepareStatement( sql ); pst.setObject(1, id, java.sql.Types.NUMERIC ); pst.setString(2, nome, java.sql.Types.VARCHAR ); pst.executeUpdate(); pst.close(); conn.close();

Acesso a dados com JDBC

EXEMPLO DE PROJETO

Anda mungkin juga menyukai