Guardar imagen en MySQL desde Java

Siguiendo con algo más de MySQL en java vamos a guardar una imagen en la base de datos desde una aplicación hecha en java.  La idea es hacer la conexión básica siguiendo con los pasos acontinuación:

1. crear la conexión
2. Cargar la imagen la imagen a partir de FIeInputStream
3. Pasar la imagen a un flujo binario
4. Guardar la imagen

Lo primero es crear la conexión que comúnmente hacemos para conectarse con MySQL. Para ello necesitamos los datos elementales: hostnombre de la base de datosusuario y la contraseña. Veamos como quedaría:

1 Class.forName("org.gjt.mm.mysql.Driver");
2 Connection conn = DriverManager.getConnection("jdbc:mysql://host/nombre-base-de-datos", "usuario", "contrasena");

Preparamos la consulta a partir de la conexión creada, esta es una instruccion en SQL que el motor de mysql va a procesar, el único detalle que hay que tomar es que vamos a usar le signo? (signo de interrogación) que sirve para informarle al objeto consulta que, ese valor será asigando mas adelante, pues primero hay que cargar la imagen y luego guardarla como bytes:

1 PreparedStatement ps = conn.prepareStatement("insert into fotos(id_foto, nombre, imagen) values (001, 'name', ?)");

Seguidamente hay que cargar el archivo con un objeto FileInputStream para que la imagen quede como un objeto de tipo File y por último pasar los bytes de la imagen al valor faltante de la consula:

1 File file = new File("logo.jpg");
2 FileInputStream fis = new FileInputStream(file);
3 ps = conn.prepareStatement(insertar_imagen);
4 ps.setBinaryStream(1, fis, (int) file.length());

En el código anterior se carga la imagen llamada logo.jpg que esta en nuestra pc. Con el objetoFileInputStream ya podemos procesar esa imagen para que al usar el métodosetBinaryStream() el objeto File que contiene la imagen pueda se convierta en un flujo de bytes que se almacenará en la base de datos.
Y por últmimo ejecutamos la consulta ya totalmente completa:

1 ps.executeUpdate();
2 conn.commit();

El código completo se debería ver algo así:

01 public class GuardarImagen {
02
03 public static void main(String[] args) throws Exception, IOException, SQLException {
04
05 Class.forName("org.gjt.mm.mysql.Driver");
06 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/myjsp", "root","adminadmin");
07
08 PreparedStatement ps = conn.prepareStatement("insert into fotos(id_foto, nombre, imagen) values (001, 'name', ?)");
09 try {
10 conn.setAutoCommit(false);
11 File file = new File("logo.jpg");
12 FileInputStream fis = new FileInputStream(file);
13 ps.setBinaryStream(1, fis, (int) file.length());
14 ps.executeUpdate();
15 conn.commit();
16 } finally {
17 ps.close();
18
19 }
20
21 }
22 }

Acá dejo la estructura de la tabla donde se guarda la imagen:

//MySql database

create table fotos (

id_foto INT not null PRIMARY KEY,

nombre VARCHAR(40) not null,

imagen BLOB not null);