JDBC - Guia Rápido

O que é JDBC?

JDBC significa Java Database Conectivity, que é uma API Java padrão para conectividade independente de banco de dados entre a linguagem de programação Java e uma ampla variedade de bancos de dados.

A biblioteca JDBC inclui APIs para cada uma das tarefas comumente associadas ao uso do banco de dados:

  • Fazendo uma conexão com um banco de dados

  • Criação de instruções SQL ou MySQL

  • Execução de consultas SQL ou MySQL no banco de dados

  • Visualizando e modificando os registros resultantes

Pré-requisito:

Você precisa ter um bom conhecimento dos dois assuntos a seguir para aprender JDBC:

JDBC - Configuração do ambiente:

Certifique-se de ter feito a seguinte configuração:

  • Instalação de núcleo JAVA

  • Instalação de banco de dados SQL ou MySQL

Além do acima, você precisa configurar um banco de dados que você usaria para o seu projeto. Supondo que este seja o EMP e você criou na tabela Employees no mesmo banco de dados.

Criação de aplicativo JDBC:

Existem seis etapas envolvidas na construção de um aplicativo JDBC que irei resumir neste tutorial:

Importe os pacotes:

Isso requer que você inclua os pacotes contendo as classes JDBC necessárias para a programação do banco de dados. Na maioria das vezes, usar import java.sql. * Será suficiente da seguinte forma:

//STEP 1. Import required packages
import java.sql.*;

Registre o driver JDBC:

Isso requer que você inicialize um driver para que possa abrir um canal de comunicação com o banco de dados. A seguir está o snippet de código para conseguir isso:

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

Abra uma conexão:

Isso requer o uso do método DriverManager.getConnection () para criar um objeto Connection, que representa uma conexão física com o banco de dados da seguinte maneira:

//STEP 3: Open a connection
//  Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

Execute uma consulta:

Isso requer o uso de um objeto do tipo Statement ou PreparedStatement para construir e enviar uma instrução SQL para o banco de dados da seguinte maneira:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

Se houver uma instrução SQL UPDATE, INSERT ou DELETE necessária, o seguinte snippet de código será necessário:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);

Extraia dados do conjunto de resultados:

Esta etapa é necessária caso você esteja buscando dados do banco de dados. Você pode usar o método ResultSet.getXXX () apropriado para recuperar os dados do conjunto de resultados da seguinte maneira:

//STEP 5: Extract data from result set
while(rs.next()){
    //Retrieve by column name
    int id  = rs.getInt("id");
    int age = rs.getInt("age");
    String first = rs.getString("first");
    String last = rs.getString("last");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
}

Limpe o meio ambiente:

Você deve fechar explicitamente todos os recursos do banco de dados em vez de depender da coleta de lixo da JVM da seguinte maneira:

//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();

Primeiro programa JDBC:

Com base nas etapas acima, podemos ter o seguinte código de amostra consolidado que podemos usar como um modelo ao escrever nosso código JDBC:

Este código de amostra foi escrito com base na configuração do ambiente e do banco de dados feita no capítulo Ambiente.

//STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end FirstExample

Agora, vamos compilar o exemplo acima da seguinte maneira:

C:\>javac FirstExample.java
C:\>

Quando você corre FirstExample, produz o seguinte resultado:

C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

Métodos SQLException:

Uma SQLException pode ocorrer no driver e no banco de dados. Quando tal exceção ocorrer, um objeto do tipo SQLException será passado para a cláusula catch.

O objeto SQLException passado tem os seguintes métodos disponíveis para recuperar informações adicionais sobre a exceção:

Método Descrição
getErrorCode () Obtém o número do erro associado à exceção.
getMessage () Obtém a mensagem de erro do driver JDBC para um erro tratado pelo driver ou obtém o número do erro Oracle e a mensagem para um erro do banco de dados.
getSQLState () Obtém a string XOPEN SQLstate. Para um erro do driver JDBC, nenhuma informação útil é retornada deste método. Para um erro de banco de dados, o código XOPEN SQLstate de cinco dígitos é retornado. Este método pode retornar nulo.
getNextException () Obtém o próximo objeto Exception na cadeia de exceções.
printStackTrace () Imprime a exceção atual, ou lançável, e seu backtrace para um fluxo de erro padrão.
printStackTrace (PrintStream s) Imprime este lançável e seu backtrace para o fluxo de impressão que você especificar.
printStackTrace (PrintWriter w) Imprime este lançável e seu backtrace para o escritor de impressão que você especificar.

Utilizando as informações disponíveis no objeto Exception, você pode capturar uma exceção e continuar seu programa de maneira apropriada. Esta é a forma geral de um bloco try:

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

JDBC - Tipos de dados:

A tabela a seguir resume o tipo de dados JDBC padrão para o qual o tipo de dados Java é convertido quando você chama o método setXXX () do objeto PreparedStatement ou CallableStatement ou o método ResultSet.updateXXX ().

SQL JDBC / Java setXXX updateXXX
VARCHAR java.lang.String setString updateString
CARACTERES java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
MORDEU boleano setBoolean updateBoolean
NUMÉRICO java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT byte setByte updateByte
SMALLINT baixo setShort updateShort
INTEIRO int setInt updateInt
BIGINT grandes setLong updateLong
REAL flutuador setFloat updateFloat
FLUTUADOR flutuador setFloat updateFloat
EM DOBRO em dobro setDouble updateDouble
VARBINÁRIO byte [] setBytes updateBytes
BINÁRIO byte [] setBytes updateBytes
ENCONTRO java.sql.Date setDate data de atualização
TEMPO java.sql.Time definir tempo tempo de atualização
TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
BLOB java.sql.Blob setBlob updateBlob
ARRAY java.sql.Array setARRAY updateARRAY
REF java.sql.Ref SetRef updateRef
ESTRUTURA java.sql.Struct SetStruct updateStruct

O JDBC 3.0 aprimorou o suporte para tipos de dados BLOB, CLOB, ARRAY e REF. O objeto ResultSet agora possui os métodos updateBLOB (), updateCLOB (), updateArray () e updateRef () que permitem que você manipule diretamente os respectivos dados no servidor.

Os métodos setXXX () e updateXXX () permitem converter tipos específicos de Java em tipos de dados JDBC específicos. Os métodos, setObject () e updateObject (), permitem mapear quase qualquer tipo Java para um tipo de dados JDBC.

O objeto ResultSet fornece o método getXXX () correspondente para cada tipo de dados para recuperar o valor da coluna. Cada método pode ser usado com o nome da coluna ou por sua posição ordinal.

SQL JDBC / Java setXXX getXXX
VARCHAR java.lang.String setString getString
CARACTERES java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
MORDEU boleano setBoolean getBoolean
NUMÉRICO java.math.BigDecimal setBigDecimal getBigDecimal
TINYINT byte setByte getByte
SMALLINT baixo setShort getShort
INTEIRO int setInt getInt
BIGINT grandes setLong getLong
REAL flutuador setFloat getFloat
FLUTUADOR flutuador setFloat getFloat
EM DOBRO em dobro setDouble getDouble
VARBINÁRIO byte [] setBytes getBytes
BINÁRIO byte [] setBytes getBytes
ENCONTRO java.sql.Date setDate getDate
TEMPO java.sql.Time definir tempo consiga tempo
TIMESTAMP java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
BLOB java.sql.Blob setBlob getBlob
ARRAY java.sql.Array setARRAY getARRAY
REF java.sql.Ref SetRef getRef
ESTRUTURA java.sql.Struct SetStruct getStruct

JDBC - Processamento em lote:

O processamento em lote permite agrupar instruções SQL relacionadas em um lote e enviá-las com uma chamada para o banco de dados.

Ao enviar várias instruções SQL para o banco de dados de uma vez, você reduz a sobrecarga de comunicação, melhorando assim o desempenho.

  • Os drivers JDBC não são necessários para suportar esse recurso. Você deve usar o método DatabaseMetaData.supportsBatchUpdates () para determinar se o banco de dados de destino oferece suporte ao processamento de atualização em lote. O método retorna true se seu driver JDBC suportar este recurso.

  • o addBatch()o método de Statement, PreparedStatement e CallableStatement é usado para adicionar instruções individuais ao lote. oexecuteBatch() é usado para iniciar a execução de todas as instruções agrupadas.

  • o executeBatch() retorna uma matriz de inteiros e cada elemento da matriz representa a contagem de atualização para a respectiva instrução de atualização.

  • Assim como você pode adicionar instruções a um lote para processamento, você pode removê-las com o clearBatch()método. Este método remove todas as instruções que você adicionou com o método addBatch (). No entanto, você não pode escolher seletivamente qual declaração remover.

JDBC - Streaming de dados:

Um objeto PreparedStatement tem a capacidade de usar fluxos de entrada e saída para fornecer dados de parâmetro. Isso permite colocar arquivos inteiros em colunas de banco de dados que podem conter grandes valores, como tipos de dados CLOB e BLOB.

Existem os seguintes métodos que podem ser usados ​​para transmitir dados:

  • setAsciiStream(): Este método é usado para fornecer grandes valores ASCII.

  • setCharacterStream(): Este método é usado para fornecer grandes valores UNICODE.

  • setBinaryStream(): Este método é usado para fornecer grandes valores binários.

O método setXXXStream () requer um parâmetro extra, o tamanho do arquivo, além do espaço reservado para o parâmetro. Este parâmetro informa ao driver quantos dados devem ser enviados para o banco de dados usando o stream.

Para obter detalhes sobre todos esses conceitos, você precisa seguir o tutorial completo.