37
Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC Aplicação Java com Acesso a um SGBD Ricardo Terra rterrabh [at] gmail.com Java JDBC 1

2010palestrajavajdbc 150128114002 Conversion Gate02

Embed Size (px)

DESCRIPTION

Palestra

Citation preview

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Java JDBC Aplicao Java com Acesso a um SGBD

    Ricardo Terra rterrabh [at] gmail.com

    Java JDBC 1

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    CV

    Java JDBC 2

    Nome: Ricardo Terra Email: rterrabh [at] gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868

    Ph.D. (UFMG/UWaterloo), Post-Ph.D. (INRIA/Universit Lille 1) Background Acadmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos) Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano)

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 3

    Conexo Java com SBGD

    n No faria sentido um SGBD se no existisse a conexo entre uma linguagem de programao e um banco de dados q Em Java, existe o Java Database Connectivity (JDBC)

    n JDBC uma biblioteca vinculada a API da linguagem de programao Java que define como um cliente pode acessar um banco de dados. Inclusive prov mtodos para consulta e atualizao

    n JDBC direcionado a banco de dados relacionais

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 4

    JDBC

    n A API JDBC j est vinculada ao JDK do Java, porm necessrio baixar as API especficas para o Oracle q So conhecidas como connectors

    n O connector Oracle pode ser facilmente baixado em: q http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

    n O connector MySql pode ser facilmente baixado em: q http://dev.mysql.com/downloads/connector/j/

    n O connector a implementao das interfaces JDBC. Ela possui a extenso JAR e deve ser adicionada ao "Build Path" do projeto que a utilizar, conforme demonstrado no prximo slide

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 5

    Importando Bibliotecas Externas...

    n Clique com o boto direito no projeto, v em "Build Path" e depois em "Add External Archives..."

    Java JDBC

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 6

    Importando Bibliotecas Externas...

    n Selecione a biblioteca (extenso JAR) desejada onde ela estiver

    Java JDBC

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 7

    Importando Bibliotecas Externas...

    n Observe que a biblioteca aparecer em "Referenced Libraries"

    Java JDBC

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 8

    Conexo Java com SGBD

    n Para exemplos, utilizaremos o seguinte modelo relacional: CONTATO (cpf, nome, sexo, data_nascimento, telefone)!! !dom(cpf) = numrico(11) NN!! !dom(nome) = alfabtico(60) NN, com nome nico!! !dom(sexo) = char(1) NN, pode ser 'M' ou 'F'!! !dom(data_nascimento) = data NN!! !dom(telefone) = numrico(10) NN!

    q Por didtica, todos os campos sero no-nulos (not null)

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 9

    Conexo Java com Oracle

    n Criao do modelo relacional proposto no Oracle:

    create table CONTATO( CPF number(11) not null, NOME varchar2(60) not null, SEXO char(1) not null, DATA_NASCIMENTO date not null, TELEFONE number(10) not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) );

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 10

    Conexo Java com MySql

    n Criao do modelo relacional proposto no MySql:

    create table CONTATO( CPF bigint not null, NOME varchar(60) not null, SEXO char(1) not null, DATA_NASCIMENTO date not null, TELEFONE int not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) );

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 11

    JDBC

    n As classes e interfaces JDBC esto contidas no pacote java.sql!

    n Veremos nos prximos slides a classe e as interfaces deste pacote. q A nica classe a DriverManager que responsvel pelo

    gerenciamento de conectores (connectors ou drivers)

    q Todos os outros tipos so interfaces, pois a implementao deles encontra-se na biblioteca (connector) que foi adicionado ao projeto e que deve ser registrado pela classe DriverManager

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 12

    JDBC

    n Arquitetura JDBC:

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 13

    JDBC java.sql.DriverManager!

    n DriverManager a classe responsvel por: q Registrar o connector q Abrir conexo

    n Os principais mtodos so: q registerDriver(driver: Driver) : void!

    n Utilizado para o registro de um connector (ou driver). a primeira atividade a ser realizada DriverManager.registerDriver(!! !new oracle.jdbc.driver.OracleDriver());!

    q getConnection(url: String, user : String, pword: String) : Connection!n Utilizado para criar uma conexo a um SGDB. Deve ser passado a url de acesso ao

    SGBD, o nome e a senha do usurio Connection conn = DriverManager.getConnection(!! "jdbc:oracle:thin:@localhost:1521:xe","user,"pw");!

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 14

    JDBC java.sql.Connection!

    n Connection a interface responsvel por: q Realizar commit ou rollback de uma transao q Criar instrues

    n Qualquer DML ou DDL, como insert, select, create view etc

    n Os principais mtodos so: q setAutoCommit(autoCommit: boolean) : void!

    n Configura se a conexo ser "auto-comitada" ou no q conn.setAutoCommit(false);

    q commit() : void!n Realiza o commit da conexo

    q conn.commit();!

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 15

    JDBC java.sql.Connection

    q rollback() : void!n Realiza o rollback da conexo

    q conn.rollback();

    q createStatement() : java.sql.Statement!n Cria uma instruo para que seja enviado algum SQL ao banco de dados

    q Statement st = conn.createStatement();!

    q prepareStatement(sql : String) : java.sql.PreparedStatement!n Cria uma instruo parametrizada para que seja enviado algum SQL ao

    banco de dados n PreparedStatement ps =

    conn.prepareStatement("select * from CONTATO where CPF = ?");!

    q close() : void!n Realiza o encerramento da conexo. Sempre ao abrir uma conexo, a

    mesma dever ser encerrada n conn.close();!

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 16

    JDBC java.sql.Statement

    n Statement a interface responsvel por: q Executar instrues q Realizar consultas

    n Os principais mtodos so: q executeUpdate(sql : String) : int!

    n Realiza a execuo de um insert, update, delete ou qualquer instruo SQL que no retorne nada, por exemplo, instrues DDL q st.executeUpdate("delete from CONTATO where SEXO='M'");

    q executeQuery(sql : String) : java.sql.ResultSet!n Realiza uma consulta

    q ResultSet rs = st.executeQuery("select * from CONTATO");

    q close() : void!

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 17

    JDBC java.sql.PreparedStatement

    n PreparedStatement a interface com as mesmas responsabilidades da Statement, porm possui mtodos para inserir os parmetros

    n Alguns destes mtodos de insero de parmetros: q setInt(paramIndex : int, x : int) : void!

    q setLong(paramIndex : int, x : long) : void!

    q setString(paramIndex : int, x : String) : void!

    q setDate(paramIndex : int, x : java.sql.Date) : void!

    q setNull(parameterIndex : int, sqlType : int) : void!n Ex.: ps.setNull(5, java.sql.Types.NULL);

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 18

    JDBC java.sql.PreparedStatement

    n Exemplo: q ...!!PreparedStatement ps = !! !conn.prepareStatement(!! ! ! !"insert into CONTATO values (?,?,?,?,?)");!!!!ps.setLong(1, 12345678903L);!!ps.setString(2, "Marcos");!!ps.setString(3, "M");!!ps.setDate(4, new java.sql.Date(500000000000L));!!ps.setLong(5, 3134181010L);!

    !!ps.executeUpdate();!!...!

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 19

    JDBC java.sql.ResultSet

    n ResultSet a interface responsvel por: q Manipular o conjunto de resultados de uma consulta

    n Os principais mtodos so: q next() : boolean!

    n Move o cursor para a prxima posio do conjunto de resultados, retornando um booleano dizendo se a prxima posio vlida ou no q rs.next();

    q close() : void!

    q Mtodos de recuperao de valores das colunas que ser abordado no prximo slide

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 20

    JDBC java.sql.ResultSet

    n Possui mtodos para recuperao dos valores das colunas: q Os valores podero ser recuperados pelo nome da coluna ou mesmo

    pela posio em que a coluna se encontra no resultado

    n Alguns destes mtodos de recuperao de valores das colunas: q getInt( [columnName : String | columnIndex : int ] ) : int!

    q getLong( [columnName : String | columnIndex : int ] ) : long!

    q getString( [columnName : String | columnIndex : int ] ) : String!

    q getDate([columnName : String | columnIndex : int]) : java.sql.Date!n Somente a data

    q getTimestamp([columnName : String | columnIndex : int]) : java.sql.Date!n Data e hora

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 21

    Utilizando JDBC

    n A programao usando JDBC pode ser descrita em um fluxo de atividades que ser descrita em Diagrama de Atividade da UML no prximo slide

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 22

    Utilizando JDBC

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 23

    JDBC - Exemplos

    n Os slides a seguir apresentam alguns exemplos da utilizao do JDBC em um SGBD MySql

    n Os primeiros trs exemplos esto focados na utilizao, ignorando completamente qualquer exceo que possa ocorrer

    n O ltimo exemplo apresenta um tratamento de exceo adequado

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 24

    Exemplos Utilizando Instruo Simples

    public static void insert() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false);

    Statement st = conn.createStatement(); st.executeUpdate( "insert into CONTATO values (12345678903,'Marcos','M',to_date('04/11/1985','dd/MM/yyyy'),3132501111)"); st.close();

    conn.commit(); conn.close(); }

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 25

    Exemplos Utilizando Instruo Preparada

    public static void insertPreparado() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false);

    PreparedStatement ps = conn.prepareStatement( "update CONTATO set NOME = ?, SEXO = ?, DATA_NASCIMENTO = ?, TELEFONE = ?" +

    "where CPF = ?"); ps.setString(1, "Carla"); ps.setString(2, "F"); ps.setDate(3, new java.sql.Date(500000000000L)); ps.setLong(4, 3132501111L); ps.setLong(5, 12345678904L); ps.executeUpdate(); ps.close();

    conn.commit(); conn.close(); }

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 26

    Exemplos Conjunto de Resultados

    public static void select() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false);

    Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * from CONTATO"); while (rs.next()) { System.out.println("CPF: " + rs.getLong("CPF")); System.out.println("NOME: " + rs.getString("NOME")); System.out.println("SEXO: " + rs.getString("SEXO")); System.out.println("DATA DE NASCIMENTO: " + rs.getDate("DATA_NASCIMENTO")); System.out.println("TELEFONE: " + rs.getLong("TELEFONE")); System.out.println("========================================"); }

    rs.close(); st.close(); conn.commit(); conn.close(); }

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 27

    Exemplos Bloco Transacional

    public static void blocoTransacional() { Connection conn = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); /* AQUI VEM O CDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceo de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexo estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceo ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexo estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceo ao fechar a conexo. Causa: " + e.getMessage()); } } } }

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 28

    Exemplos Bloco Transacional

    public static void blocoTransacional() { Connection conn = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver() ()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); /* AQUI VEM O CDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceo de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexo estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceo ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexo estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceo ao fechar a conexo. Causa: " + e.getMessage()); } } } }

    PreparedStatement ps = conn.prepareStatement( "insert into CONTATO values (?,?,?,?,?)"); ps.setLong(1, 12345678905L); ps.setString(2, "Clodovil"); ps.setString(3, "I"); ps.setDate(4, new java.sql.Date(500000000000L)); ps.setLong(5, 3132501111L); ps.executeUpdate(); ps.close();

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 29

    Importante

    n Prefira a utilizao de transaes. q Isto , opte por conn.setAutoCommit(false)!

    n Encerre tudo que tiver sido aberto. q Invoque o mtodo close() de conexes, instrues e conjunto de

    resultados

    n Sempre faa o acesso a um banco de dados utilizando um tratamento de exceo adequado q Isto , fazer rollback em caso de erro, fechar sempre a conexo

    independente de sucesso ou falha na transao etc

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Desenvolvendo uma Aplicao Completa

    n Com toda a teoria absorvida e entendida, vamos agora criar uma aplicao Java completa com acesso uma base de dados

    n Para isso, utilizaremos: q Eclipse q Oracle XE ou MySql q Connector para Oracle ou MySql q Biblioteca TerraUtil!

    n Disponvel em: www.ricardoterra.com.br/palestras

    n A aplicao a ser desenvolvida ser explicada nos prximo slides

    Java JDBC 30

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Desenvolvendo uma Aplicao Completa

    n Inicialmente, o usurio poder escolher dentre uma das opes abaixo. Cada opo ser implementada em um mtodo especfico

    ========================! CADASTRO DE CONTATOS !========================!1 SALVAR!2 ATUALIZAR!3 EXCLUIR!4 PESQUISAR!5 LISTAR!6 ENCERRAR!!DIGITE A OPO DESEJADA: !

    Java JDBC 31

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Desenvolvendo uma Aplicao Completa

    1. Salvar q Pedir ao usurio todas as informaes do contato e gravar no SGBD q Retornar ao menu de opes

    2. Atualizar q Pedir ao o usurio para digitar o cpf do contato

    n Caso exista, pedir todas as informaes do contato novamente com a exceo do cpf e atualizar no SGBD. Caso no exista, isso dever ser avisado ao usurio

    q Retornar ao menu de opes

    3. Excluir q Pedir para o usurio digitar o nmero da matrcula

    n Caso exista, excluir-se- e avisar ao usurio que a excluso foi efetuada com sucesso. Caso no exista, isto dever ser avisado ao usurio

    q Retornar ao menu de opes

    Java JDBC 32

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Desenvolvendo uma Aplicao Completa

    4. Pesquisar q Pedir para o usurio digitar o cpf do contato q Caso exista, ir exibir as informaes do contato. Caso no exista, isto

    dever ser avisado ao usurio q Retornar ao menu de opes

    5. Listar q Se existir algum contato, exibir as informaes de todos. Caso no

    exista nenhum, isso dever ser avisado ao usurio q Retornar ao menu de opes

    6. Encerrar

    q Dever encerrar o aplicativo

    Java JDBC 33

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

    Desenvolvendo uma Aplicao Completa

    n Teremos uma classe do tipo Contato!

    n Teremos uma classe de busca de conexo (DBLocator) n Teremos um ContatoDAO!

    n Teremos a classe Aplicacao!q que far toda a interao com o usurio atravs da biblioteca TerraUtil!

    Java JDBC 34

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 35

    Dvidas?

    ???

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 36

    Obrigado!

    Ricardo Terra rterrabh [at] gmail.com

    Apresentao e projeto Java disponveis em:

    www.ricardoterra.com.br/palestras

  • Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 37

    Referncia Bibliogrfica

    n DEITEL, H. M; DEITEL, P. J. Java, como programar. 6 ed. So Paulo: Prentice-Hall, 2005.

    n DAWES, Chip; THOMAS, Biju. OCA/OCP: Introduction to Oracle9i SQL. So Francisco: Sibex, 2002.