Escrevendo e lendo MySQL BLOB usando JDBC

Resumo : Este tutorial mostra como escrever e ler dados BLOB do MySQL usando a API JDBC.

Usaremos a candidatestabela no banco de dados de amostra mysqljdbc . Para fins de demonstração, adicionaremos mais uma coluna nomeada resumeà candidatestabela. O tipo de dados desta coluna pode  MEDIUMBLOBconter até 16 MB.

A instrução ALTER TABLE a seguir adiciona uma coluna de currículo à candidatestabela.

ALTER TABLE candidates 
ADD COLUMN resume LONGBLOB NULL AFTER email;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Usaremos um exemplo de currículo em formato PDF e carregaremos esse arquivo na resumecoluna da candidatestabela posteriormente. Você pode baixar o arquivo PDF de amostra para praticar através do seguinte link:

Baixe o currículo de John Doe em formato PDF

Escrevendo dados BLOB no banco de dados MySQL

As etapas para gravar dados BLOB no banco de dados MySQL são as seguintes:

Primeiro, abra uma nova conexão com o banco de dados criando um novo Connectionobjeto.

Connection conn = DriverManager.getConnection(url,username,password);Linguagem de código:  Java  ( java )

Em seguida, construa uma instrução UPDATE e crie uma PreparedStatementa partir do Connectionobjeto.

String updateSQL = "UPDATE candidates "
                + "SET resume = ? "
                + "WHERE id=?";

PreparedStatement pstmt = conn.prepareStatement(updateSQL);Linguagem de código:  Java  ( java )

Em seguida, leia os dados do arquivo de currículo de amostra usando FileInputStreamum setBinaryStream()método de chamada para definir parâmetros para o arquivo PreparedStatement.

// read the file
File file = new File(filename);
FileInputStream input = new FileInputStream(file);

// set parameters
pstmt.setBinaryStream(1, input);
pstmt.setInt(2, candidateId);Linguagem de código:  Java  ( java )

Depois disso, chame o executeUpdate()método do PreparedStatementobjeto.

pstmt.executeUpdate();Linguagem de código:  Java  ( java )

Finalmente, feche os objetos PreparedStatemente Connectionchamando os close()métodos.

Para simplificar o Connectionprocesso de criação, utilizamos a MySQLJDBCUtilclasse que desenvolvemos no tutorial anterior para abrir uma nova conexão . O exemplo completo de gravação de dados BLOB no banco de dados MySQL é o seguinte:

package org.mysqltutorial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 *
 * @author tutorials.acervolima.com
 */
public class Main {

    /**
     * Update resume for a specific candidate
     *
     * @param candidateId
     * @param filename
     */
    public static void writeBlob(int candidateId, String filename) {
        // update sql
        String updateSQL = "UPDATE candidates "
                + "SET resume = ? "
                + "WHERE id=?";

        try (Connection conn = MySQLJDBCUtil.getConnection();
                PreparedStatement pstmt = conn.prepareStatement(updateSQL)) {

            // read the file
            File file = new File(filename);
            FileInputStream input = new FileInputStream(file);

            // set parameters
            pstmt.setBinaryStream(1, input);
            pstmt.setInt(2, candidateId);

            // store the resume file in database
            System.out.println("Reading file " + file.getAbsolutePath());
            System.out.println("Store file in the database.");
            pstmt.executeUpdate();

        } catch (SQLException | FileNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        writeBlob(122, "johndoe_resume.pdf");

    }

}Linguagem de código:  Java  ( java )

Vamos executar o programa.

exemplo de blob mysql jdbc

Agora verificamos a   candidatestabela do candidato com id 122.

SELECT * FROM candidates WHERE id = 122;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
exemplo de blob de inserção mysql jdbc

Como você pode ver, temos dados BLOB atualizados na coluna de currículo da candidatestabela para um registro com id 122.

Lendo dados BLOB do banco de dados MySQL

O processo de leitura de dados BLOB do banco de dados é semelhante ao processo de gravação de BLOB, exceto pela parte em que escrevemos dados BLOB no arquivo.

Primeiro, abra uma nova conexão com o banco de dados.

Connection conn = MySQLJDBCUtil.getConnection(dbURL,username,password);Linguagem de código:  Java  ( java )

Em seguida, construa uma instrução SELECT e crie uma PreparedStatementa partir do Connectionobjeto.

String selectSQL = "SELECT resume FROM candidates WHERE id=?";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);Linguagem de código:  Java  ( java )

Em seguida, defina os parâmetros e execute a consulta:

pstmt.setInt(1, candidateId);
ResultSet rs = pstmt.executeQuery();Linguagem de código:  Java  ( java )

Depois disso, obtenha os dados BLOB ResultSete grave-os em um arquivo:

File file = new File(filename);
FileOutputStream output = new FileOutputStream(file);

System.out.println("Writing to file " + file.getAbsolutePath());
while (rs.next()) {
    InputStream input = rs.getBinaryStream("resume");
    byte[] buffer = new byte[1024];
    while (input.read(buffer) > 0) {
        output.write(buffer);
    }
}Linguagem de código:  Java  ( java )

Finalmente, chame os  close()métodos PreparedStatmente Connectionobjetos. Se você usar uma instrução try-with-resources, não precisará fazê-lo explicitamente.

O exemplo a seguir ilustra como ler dados BLOB do banco de dados MySQL.

package org.mysqltutorial;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Main.org
 */
public class Main {

    /**
     * Read resume of a candidate and write it into a file
     *
     * @param candidateId
     * @param filename
     */
    public static void readBlob(int candidateId, String filename) {
        // update sql
        String selectSQL = "SELECT resume FROM candidates WHERE id=?";
        ResultSet rs = null;

        try (Connection conn = MySQLJDBCUtil.getConnection();
                PreparedStatement pstmt = conn.prepareStatement(selectSQL);) {
            // set parameter;
            pstmt.setInt(1, candidateId);
            rs = pstmt.executeQuery();

            // write binary stream into file
            File file = new File(filename);
            FileOutputStream output = new FileOutputStream(file);

            System.out.println("Writing to file " + file.getAbsolutePath());
            while (rs.next()) {
                InputStream input = rs.getBinaryStream("resume");
                byte[] buffer = new byte[1024];
                while (input.read(buffer) > 0) {
                    output.write(buffer);
                }
            }
        } catch (SQLException | IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // 
        readBlob(122, "johndoe_resume_from_db.pdf");
    }

}Linguagem de código:  Java  ( java )

Após executar o programa e navegar pela pasta do projeto, você verá que existe um novo arquivo chamado johndoe_resume_from_db.pdfcriado.

exemplo de blob de leitura mysql jdbc

Neste tutorial, mostramos como trabalhar com dados MySQL BLOB do JDBC.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *