Curso Java - Básico - JDBC

O que é JDBC?

  • É um conjunto de classes e interfaces escritas em Java que tornam possível escrever aplicações qque acessem bancos de dados.
  • Faz parte do pacote java.sql .
  • É semelhante a tecnologia ODBC (Open Data Base Connectivity), da Microsoft.
  • Utilizando um driver JDBC, pode-se conectar a aplicação a um ou mais servidores de banco de dados, executar consultas SQL e operar com o resultado, se for o caso.

JDBC URL

  • O JDBC usa uma URL (Uniform Resource Locator) para identificar a conexão ao banco de dados.
  • O JDBC URL permite que o desenvolvedor do driver especifique o que deve ser incluído na URL.
    • Cada URL é diferente para cada banco de dados.

    ./images/URL1.jpg

    • jdbc é o protocolo utilizado e todas as URLs iniciarão com esse protocolo.
    • subprotocolo é o nome do driver ou mecanismo de conexão ao banco de dados.
    • subnome identifica efetivamente o banco de dados. É passada uma String que é de implementação dos desenvolvedores de driver.
  • Exemplos

    ./images/URL2.jpg

Registrar o driver JDBC

  • O driver pode se registrar junto ao DriverManager (java.sql), usando o método registerDriver() .
    • A classe DriverManager mantém uma lista de drivers que se regitram automaticamente na chamada desse método.

    ./images/driver1.jpg

  • Ou através do método forName() da classe Class (java.lang).

    ./images/driver2.jpg

    • O método Class.forName() lança uma exceção do tipo ClassNotFoundException se a classe passada não for encontrada.
    • Exemplo

    ./images/driver3.jpg

Conectar ao banco de dados

  • Estando o driver carregado na memória, chame o método getConnection() do DriverManager para tentar uma conexão com a URL.
    • Se não conseguir, será disparado uma SQLException .
  • O método getConnection() retorna um objeto do tipo Connection , que será visto adiante.
  • Exemplo

    ./images/bancodedados.jpg

SQL Exception

  • Quando estamos usando JDBC, todos os métodos que fazem acesso à base de dados lançam a exceção SQLException .
    • Ela é do tipo checked exception , logo é filha de Exception .
  • Principais métodos:
    • getMessage() : retorna uma String descrevendo o erro ocorrido.
    • getErrorCode() : retorna o código específico do banco de dados que está sendo utilizado.
    • getSQLState() : retorna a instrução SQL que deu erro.

A interface Connection

  • Representa uma conexão ao banco de dados.
  • Através de um objeto do tipo Connection podemos criar comandos SQL que poderão ser enviados para o banco de dados.
  • A informação sobre a conexão pode ser obtida usando o método getMetaData() .
  • Oferece suporte a transações.

Interface Statement

  • Envia comandos SQL para o banco de dados.
  • Para ser criado, necessita de uma conexão ativa para que possamos executar o método createStatement() da conexão desejada.

    ./images/statement.jpg

  • O objeto Statement existe, mas ainda não possui nenhum comando SQL associado.
  • Só aceita comandos de SQL simples, sem parâmetros.

Método executeQuery()

  • Usado para consultas que podem retornar registros como resultado (como SELECT).
  • É do tipo Statement .
  • O resultado dessa consulta vem dentro de um objeto ResultSet , que será visto adiante.

    ./images/resultSet.jpg

Método executeUpdate()

  • Usado para executar comandos SQL que atualizem (UPDATE), insiram (INSERT), apaguem (DELETE) ou criarem objetos no banco de dados (comandos DDL, como CREATE TABLE).
  • É do tipo Statement .
  • O resultado dessa consulta retorna um int , cujo valor é o número de linhas afetadas.

    ./images/executeUpdate.jpg

Método execute()

  • Usado quando, em tempo de complicação, não sabemos qual será o comando SQL executado.
  • Usando quando a consulta retorna mais de um ResultSet , ou mais de um indicador de linhas afetadas, ou quando pode retornar ambos
  • Retorna um valor booleano, que indica o tipo de resultado, e por conseguinte, qual é o tratamento que devemos dar.
    • Se o retorno for igual a true , significa que há um objeto do tipo ResultSet disponível e que temos que utilizar o método getResultSet() do objeto Statement para recuperá-lo.
    • Se o retorno é igual a false , indica que a consulta retornou o número de linhas afetadas e que temos que utilizar o método getUpdateCount() do objeto Statement para recuperá-lo.

    ./images/metodoexecute.jpg

Interface PreparedStatement (1)

  • É mais eficiente do que Statement , pois ele é compilado uma única vez, no momento da preparação do objeto.
  • É filho de Statement .
  • Usado para declarações que serão executadas mais de uma vez, alterando apenas valores da consulta.
    • Os parâmetros são passados cada vez que a consulta vai ser executada, sendo cada um deles indicados por um sinal de interrogação.

    ./images/preparedStatement.jpg

Interface PreparedStatement (2)

  • Depois de preparada, devemos passar os valores para cada um dos parâmetros.
  • Existem vários métodos setXXX para fornecer valores a cada uma das variáveis da nossa PreparedStatement , sendo XXX substituída pelo tipo da variável em questão.

    ./images/preparedstatement2.jpg

  • Repare que o índice começa a contar da posição 1 e não da posição zero como nos arrays e outras estuturas em Java.
  • Se fecharmos um PreparedStatement , deveremos prepará-lo novamente antes de usá-lo.

Interface CallableStatement (1)

  • Usado para passar parâmetros e executar stored precedures.
  • É filho de PreparedStatement .

    ./images/callablestatement1.jpg

  • A string passada para o método preparedCall pode ser escrita de duas maneiras:

Interface CallableStatement (2)

  • Devemos registrar os parâmetros de saída usando o método registerOutParameter .
  • Parâmetros de saída

    ./images/callablestatement2.jpg

  • Parâmetros de entrada

    ./images/parametrosentrada.jpg

  • Depois devemos executar a stored procedure e recuperar os seus valores.

    ./images/parametrosentrada2.jpg

Interface ResultSet (1)

  • Armazena os resultados das consultas realizadas.
  • Mantém o cursor apontando para o registro de dados atual.
  • Com o método next() podemos andar pelo conjunto resultado linha a linha.
  • Utilizamos os métodos getXXX() para recuperar os valores.
  • O método findColumn() retorna o número de uma coluna dado o seu nome.

Interface ResultSet (2)

./images/interfaceresultset.jpg

  • Tipos primitivos não podem receber nulos.
    • Se a coluna na table puder ser receber valores nulos, não devemos usá-los.
    • Para resolver essa questão, usamos o método wasNull() .

    ./images/interfaceresultset2.jpg

Fechando a conexão.

  • Após o uso, devemos fechar todos os objetos ResultSet e Statement a fim de limpar a memória e liberar cursores do banco de dados.

    ./images/fechando.jpg