Resumo : Este tutorial mostra como escrever e ler dados BLOB do MySQL usando a API JDBC.
Usaremos a candidates
tabela no banco de dados de amostra mysqljdbc . Para fins de demonstração, adicionaremos mais uma coluna nomeada resume
à candidates
tabela. O tipo de dados desta coluna pode MEDIUMBLOB
conter até 16 MB.
A instrução ALTER TABLE a seguir adiciona uma coluna de currículo à candidates
tabela.
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 resume
coluna da candidates
tabela 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 Connection
objeto.
Connection conn = DriverManager.getConnection(url,username,password);
Linguagem de código: Java ( java )
Em seguida, construa uma instrução UPDATE e crie uma PreparedStatement
a partir do Connection
objeto.
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 FileInputStream
um 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 PreparedStatement
objeto.
pstmt.executeUpdate();
Linguagem de código: Java ( java )
Finalmente, feche os objetos PreparedStatement
e Connection
chamando os close()
métodos.
Para simplificar o Connection
processo de criação, utilizamos a MySQLJDBCUtil
classe 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.
Agora verificamos a candidates
tabela do candidato com id 122.
SELECT * FROM candidates WHERE id = 122;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como você pode ver, temos dados BLOB atualizados na coluna de currículo da candidates
tabela 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 PreparedStatement
a partir do Connection
objeto.
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 ResultSet
e 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 PreparedStatment
e Connection
objetos. 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.pdf
criado.
Neste tutorial, mostramos como trabalhar com dados MySQL BLOB do JDBC.