Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Manejo de BLOB: Escritura y lectura de archivos

Manejo de BLOB: Escritura y lectura de archivos

Autor jc mouse lunes, abril 29, 2019

Un BLOB en SQL es un tipo incorporado que almacena un Objeto Binario Grande como un valor de columna en una fila de una tabla de base de datos. Por defecto, los controladores implementan Blob usando un localizador de SQL (BLOB), lo que significa que un objeto Blob contiene un puntero lógico a los datos de BLOB de SQL en lugar de los datos en sí.

Este tipo de dato se utiliza cuando se quiere almacenar grandes cantidades de datos como videos, audio, imagenes, etc.  Los cuatro tipos de BLOB son TINYBLOB, BLOB, MEDIUMBLOB y LONGBLOB. Estos difieren solo en la longitud máxima de los valores que pueden contener. Los valores BLOB se tratan como cadenas binarias es decir como cadenas de bytes.

En este post se muestra cómo insertar un nuevo registro BLOB (que almacenara un archivo PDF) en la base de datos y posteriormente leer la cadena binaria y convertirlo nuevamente en un archivo PDF.

Necesitamos:

  • Netbeans 8.x o sup.
  • XAMPP o similares
  • Conector JDBC para MariaDB
  • Conocimientos de base de datos y java

Nivel: Intermedio – Avanzado

Tiempo: 10 minutos

Paso 1: Base de da datos

Creamos una base de datos, por ejemplo «tutorialjava» y procedemos a agregar una tabla con el nombre de «reportes» y en este agregamos dos campos, el ID (auto incrementable) y otro llamado «archivo» de tipo BLOB como se ve a continuación.

blob type

Paso 2: Conexión a la Base de datos

Creamos un nuevo proyecto java en Netbeans junto a una clase Main.

En la clase Main, declaramos 2 métodos para abrir y cerrar la conexión a nuestra base de datos.

    public static Connection conectar(String url, String user, String pass) {
        try {
            Connection connection = DriverManager.getConnection(url, user, pass);
            System.out.println("> Conectado a la base de datos");
            return connection;
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return null;
    }

    public static void cerrarConexion(Connection conn) {
        try {
            conn.close();
            System.out.println("> Desconectado de la base de datos");
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
    }

Paso 3. Registro de archivo PDF

Declaramos un método para que dado el nombre de un archivo PDF, registre este en la base de datos

    public static boolean registrarArchivoPDF(Connection conn, String file) {
        FileInputStream input = null;
        PreparedStatement stmt = null;
        try {
            String sql = "INSERT INTO reportes(archivo) VALUES(?);";
            stmt = conn.prepareStatement(sql);
            input = new FileInputStream(new File(file));
            stmt.setBinaryStream(1, input);
            stmt.executeUpdate();
            System.out.println("> Archivo '" + file + "' registrado en la base de datos");
            return true;
        } catch (FileNotFoundException | SQLException ex) {
            System.err.println(ex.getMessage());
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (IOException | SQLException ex) {
                System.err.println(ex.getMessage());
            }
        }
        return false;
    }

Paso 4. Lectura de un registro BLOB

Para terminar  declaramos un método para leer el ultimo registro insertado en nuestra tabla «reportes». Al leer los binarios, creara el archivo PDF en la misma carpeta del proyecto.

    public static void leerUltimoArchivoRegistrado(Connection conn) {
        Statement stmt = null;
        InputStream input = null;
        FileOutputStream output = null;
        try {
            String sql = "SELECT archivo FROM reportes ORDER BY id DESC LIMIT 1 ;";
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            File file = new File("reporte_db.pdf");
            output = new FileOutputStream(file);

            if (rs.next()) {
                input = rs.getBinaryStream("archivo");
                System.out.println("Leyendo archivo desde la base de datos...");
                byte[] buffer = new byte[1024];
                while (input.read(buffer) > 0) {
                    output.write(buffer);
                }
                System.out.println("> Archivo guardado en : " + file.getAbsolutePath());
            }
        } catch (SQLException | IOException ex) {
            System.err.println(ex.getMessage());
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (output != null) {
                    output.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (IOException | SQLException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }

Finalmente el código completo de toda la clase Main.java.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @see https://www.jc-mouse.net
 * @author mouse
 */
public class Main {

    public static void main(String[] args) {

        Connection connection = conectar("jdbc:mariadb://localhost:3306/TutorialJava", "root", "");
        if (connection != null) {
            if (registrarArchivoPDF(connection, "recursividad.pdf")) {
                leerUltimoArchivoRegistrado(connection);
                cerrarConexion(connection);
            }
        }
    }

    public static Connection conectar(String url, String user, String pass) {
        try {
            Connection connection = DriverManager.getConnection(url, user, pass);
            System.out.println("> Conectado a la base de datos");
            return connection;
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return null;
    }

    public static void cerrarConexion(Connection conn) {
        try {
            conn.close();
            System.out.println("> Desconectado de la base de datos");
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
    }

    public static boolean registrarArchivoPDF(Connection conn, String file) {
        FileInputStream input = null;
        PreparedStatement stmt = null;
        try {
            String sql = "INSERT INTO reportes(archivo) VALUES(?);";
            stmt = conn.prepareStatement(sql);
            input = new FileInputStream(new File(file));
            stmt.setBinaryStream(1, input);
            stmt.executeUpdate();
            System.out.println("> Archivo '" + file + "' registrado en la base de datos");
            return true;
        } catch (FileNotFoundException | SQLException ex) {
            System.err.println(ex.getMessage());
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (IOException | SQLException ex) {
                System.err.println(ex.getMessage());
            }
        }
        return false;
    }

    public static void leerUltimoArchivoRegistrado(Connection conn) {
        Statement stmt = null;
        InputStream input = null;
        FileOutputStream output = null;
        try {
            String sql = "SELECT archivo FROM reportes ORDER BY id DESC LIMIT 1 ;";
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            File file = new File("reporte_db.pdf");
            output = new FileOutputStream(file);

            if (rs.next()) {
                input = rs.getBinaryStream("archivo");
                System.out.println("Leyendo archivo desde la base de datos...");
                byte[] buffer = new byte[1024];
                while (input.read(buffer) > 0) {
                    output.write(buffer);
                }
                System.out.println("> Archivo guardado en : " + file.getAbsolutePath());
            }
        } catch (SQLException | IOException ex) {
            System.err.println(ex.getMessage());
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (output != null) {
                    output.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (IOException | SQLException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }

}

Ejecutando obtenemos por consola:

mariadb binary

Y en la carpeta del proyecto podemos ver el archivo original junto al archivo leído desde la base de datos.

stream data sql

Conclusión

Si bien los tipo de datos BLOB te permite almacenar grandes cantidades de datos por lo general este tipo de almacenamiento no es muy utilizado, lo que no quiere decir que no se haga o este mal hecho hacerlo. Lo más común en este tipo de caso es guardar una referencia al archivo en cuestión y el archivo ni siquiera tiene que estar en el mismo servidor, pudiendo utilizarse otros servicios en la nube lo cual trae muchos beneficios a nuestro servidor ya que se libera de utilizar recursos de procesador, RAM e incluso espacio de disco.

enjoy!!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Búsqueda binaria (Binary Search)

Búsqueda binaria (Binary Search)

Un algoritmo de búsqueda binaria se emplea para buscar un valor en particular en un arreglo previamente ordenado. Para i...

base de datos multiple – parte II

base de datos multiple – parte II

Continuación del tutorial «Utiliza 2 bases de datos diferentes en una aplicación» La Interfaz frmSelected.java: Haciendo...

DOM4J: Creación de archivos XML

DOM4J: Creación de archivos XML

DOM4J es una de las librerías para java más populares para el trabajo con XML ya que nos permite crea, editar y leer doc...

Crear Miniaturas Thumbnails de Videos (Código Fuente)

Crear Miniaturas Thumbnails de Videos (Código Fuente)

VLC Media Player es un reproductor multimedia de código abierto muy popular desarrollado por el proyecto VideoLAN. VLCJ ...

iReport: Reportes con imágenes de la base de datos

iReport: Reportes con imágenes de la base de datos

Este post esta dedicado a la creación de reportes con imágenes usando el programa iReport Designer. Cuando se desarrolla...

Crea tu blog con el patrón MVC y php

Crea tu blog con el patrón MVC y php

En post anteriores se vio algunos conceptos y ejemplos de lo que es el patrón MVC,  dando un paso más adelante ahora con...

Comparte lo que sabes

Categorias

Últimas entradas

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

FFmpeg es una colección de software libre capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtr...

The Age of AI o «La era de la Inteligencia Artificial»,  es una serie de 8 documentales de Youtube Original, presentados...

La comunidad 3D Buzz  era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos...

Herramientas

Generador de Enlaces a Whatsapp