Como guardar la ruta de un archivo en tabla MySQL y java

A veces en algun programa necesitamos guardar la ruta de un archivo. Por ejemplo si es un programa para llevar el control de empleados tal vez sera necesario guardar las fotografias de los empleados o una imagen de un producto, o la ruta de un archivo de documento, etc. Es por eso que se me ocurrio mostrar como se puede guardar la ruta de un archivo en una tabla de MySQL y recuperarla.

Parece facil, pero tiene su chiste, bueno para mostrar voi a diseñar una sencilla BD con una sola tabla que se llame productos con 3 unicos campos: el Id, el nombre del producto y su imagen (imagen muestra del producto). Los comandos SQL para crear la BD y la tabla son los siguientes:

CREATE DATABASE pruebaRuta;
USE pruebaRuta;
CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

Observe que el id es auto_increment y por lo tanto el DBMS lo genera automaticamente, el campo imagen guarda una cadena que sera la ruta donde esta la imagen del producto.

Ahora imaginemos que las imagenes las tenemos almacenadas en la siguiente ruta del disco duro: c:\imagenes\productos. Podria pensarse que para realizar una insercion para registrar un nuevo producto en la tabla se haria con el comando:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\imagenes\productos\chipoles_100gr.jpg');

y de hecho si ese comando lo ejecutamos en la consola de MySQL nos dice que se inserto con exito:

 

insercion mal

insercion mal

bien, ahora hagamos un SELECT de la tabla para mostrar si se inserto…

 

select mal

select mal

…pero hooo! sorpresaa faltan las diagonales (slash). al parecer el DBMS las toma como secuencias de escape y las omite, no las guarda pues, desconozco sinceramente por que no guarda las diagonales pero e ideado una clase java que agrega doble diagonal o cualquier otro caracter para reemplazar los separadores de carpetas por unos que si son validos. La forma correcta de registrar un nuevo producto es esta:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\\imagenes\\productos\\chipoles_100gr.jpg');

ahora muestro como MySQL no manda error:

insert bien

insert bien

y ahora otra vez el SELECT y vemos como ahora si se guardo correctamente

 

select bien

select bien

aahh esta vez si se inserto bien la ruta del producto. Obviamente que las inserciones aqui hechas se han hecho desde la linea comandos del cliente de MySQL pero esta operaciones de INSERT se hacen mediante un programa java con una interfaz de usuario y esas cosas.
Para ilustrar todo esto con un ejemplo practico he creado 3 clases: JfrPrincipal.java, JfrAltaProductos.java, JfrVisorProductos.java, los cuales voi a ir explicando poco a poco a continuacion. No olvidar que el objetivo de este ejemplo es la de mostrar como mandar correctamente la ruta de un archivo a una tabla de MySQL y como recuperarla para mostrar el archivo (p. ej. imagenes, .txt) o abrirlo. A continuacion muestro el diagrama de clases del ejemplo:

Clases del ejemplo Corregir Ruta Archivo

Clases UML del ejemplo Corregir Ruta Archivo

Como se puede observar la clase que nos interesa la e resaltado en otro color, esta clase se instancia desde la clase JfrAltaProductos.java que es la que nos permite dar de alta a un nuevo producto, se llama desde aqui por que antes de dar de alta un producto (INSERT) se debe correguir la ruta.

JfrPrincipal.java
Este archivo es la clase principal y unicamente tiene la funcion de mostrar una GUI con dos botones para que el usuario elija abrir el visor de imagenes o agregue un nuevo producto. En el codigo hay algunos comentarios para describir brevemente que es lo que se hace:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana principal del ejemplo, desde esta interfaz el usuario puede
					elegir entre ver las imagenes o dar de alta un nuevo producto.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo JfrPrincipal.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.*;

public class JfrPrincipal extends JFrame
{
	//Constructor
	JfrPrincipal(String titulo, int ancho, int alto)
	{
		//Establecer titulo, tamanio y posicion en la pantalla
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);	//centrado
		//Rotulo principal de la ventana
		JLabel lblTitulo = new JLabel("Ventana principal");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		//Crear el boton nuevo
		JButton btnNuevo = new JButton("Nuevo");
		JPanel panNuevo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panNuevo.add(btnNuevo);
		//Crear el boton para abrir el visor de imagenes
		JButton btnVisorImagenes = new JButton("Visor de imagenes");
		JPanel panVisor = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panVisor.add(btnVisorImagenes);
		
		//Todos los componentes estan en un Box Vertical
		//para alinear los controles
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
		boxVertical.add(panNuevo);
		boxVertical.add(panVisor);
		//Agregar el Box a la ventana
		add(boxVertical);
		setResizable(false);	//No maximizar ni cambiar tamanio
		//Al dar en la X terminar todo el programa
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    	// ########### ESCUCHADOR BOTON NUEVO   ##########
    	ActionListener escuchadorAlta = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrAltaProductos ejemplo = new JfrAltaProductos("Alta de un nuevo producto",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnNuevo.addActionListener(escuchadorAlta);

    	// ########### ESCUCHADOR PARA BOTON VISOR DE IMAGENES   ##########
    	ActionListener escuchadorVisor = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrVisorProductos ejemplo = new JfrVisorProductos("Visor de imagenes de productos",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnVisorImagenes.addActionListener(escuchadorVisor);
    	
	}	//Fin del constructor

	//hace visible la ventana	
	public void mostrar()
	{
		setVisible(true);
	}

	public static void main(String[] args) 
   {
		JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
		ejemplo.mostrar();
   }
}

Ahora muestro imagen de la ventana que genera el codigo anterior:

Ventana principal del ejemplo.

Ventana principal del ejemplo.

Como se puede ver es una interfaz muy sencilla y es el punto de entrada del programa.

JfrAltaProductos.java
Esta clase permite dar de alta un nuevo producto, es decir permite hacer un INSERT en la tabla de productos con el nombre del producto y la ruta que corresponde a una imagen previa de dicho producto. En el codigo se muestra los comentario correspondientes explicando el codigo:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para dar de alta a un nuevo producto, antes de dar de alta
			un producto se debe corregir la ruta del archivo de imagen del producto.
Autor:  	Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrAltaProductos.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.Color;
import java.awt.event.*;
//Para usar la clase File con el FilesChooser
import java.io.*;
//Para usar operacion con BD (JDBC)
import java.sql.*;

public class JfrAltaProductos extends JFrame
{
	
	 //Script SQL para crear la tabla productos:
	 //CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

   JTextArea jtaRutaImagen;
   JTextField jtfNombre;

	private static Connection con = null;
	Statement st;

	//Constructor
	JfrAltaProductos(String titulo, int ancho, int alto)
	{
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);
		JLabel lblTitulo = new JLabel("Datos del producto");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		
		//Crear una etiqueta y su campo de texto correspondiente para capturar el
		//nombre del producto
		JLabel lblNombre = new JLabel("Nombre: ");
		jtfNombre = new JTextField(20);
		JPanel panNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panNombre.add(Box.createHorizontalStrut(15));
		panNombre.add(lblNombre);
		panNombre.add(jtfNombre);
		//Crear el boton examinar
		JButton btnExaminar = new JButton("Examinar...");
      btnExaminar.addActionListener(new seleccionarImagen());
		
		//Crear el area de texto para mostrar la ruta absoluta del archivo
      JPanel panRutaImagen = new JPanel(new FlowLayout(FlowLayout.LEFT));
         jtaRutaImagen = new JTextArea(4,20);
         jtaRutaImagen.setDisabledTextColor(Color.BLUE);
         jtaRutaImagen.setLineWrap(true);
         jtaRutaImagen.setEnabled(false);
         JScrollPane scrollRutaImagen = new JScrollPane(jtaRutaImagen);
         scrollRutaImagen.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         scrollRutaImagen.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      panRutaImagen.add(Box.createHorizontalStrut(15));
      panRutaImagen.add(scrollRutaImagen);
      panRutaImagen.add(btnExaminar);
		//Crear el boton Guardar
		JButton btnGuardar = new JButton("Guardar");
		JPanel panGuardar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panGuardar.add(btnGuardar);
		//Crear el boton Cancelar
		JButton btnCancelar = new JButton("Cancelar");
		JPanel panCancelar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panCancelar.add(btnCancelar);
		//Alinear los botones Guardar y Cancelar en forma horizontal
      Box boxGuardarCancelar = Box.createHorizontalBox();
      boxGuardarCancelar.add(btnGuardar);
      boxGuardarCancelar.add(Box.createHorizontalStrut(30));
      boxGuardarCancelar.add(btnCancelar);

		//Agregar todos los controles de usuario al Box Horizontal principal
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
      boxVertical.add(Box.createVerticalStrut(50));
      boxVertical.add(panNombre);
      JPanel panEtiquetaRuta = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panEtiquetaRuta.add(Box.createHorizontalStrut(15));
      panEtiquetaRuta.add(new JLabel("Imagen previa del producto"));
      boxVertical.add(panEtiquetaRuta);      
		boxVertical.add(panRutaImagen);
      boxVertical.add(Box.createVerticalStrut(10));
      boxVertical.add(boxGuardarCancelar);
      boxVertical.add(Box.createVerticalStrut(100));
		//Agregar el Box principal a este JFrame
		add(boxVertical);
		//No permitir maximizar ni redimensionar este JFrame
		setResizable(false);

// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
		this.addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON CANCELAR   ##########
    	ActionListener escuchadorCancelar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
            setVisible(false);
        	}
   	};
    	btnCancelar.addActionListener(escuchadorCancelar);

    	// ########### ESCUCHADOR BOTON GUARDAR   ##########
    	ActionListener escuchadorGuardar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
        		//Validar que NO haya campos vacios
            if(hayCamposVacios())
            {
            	JOptionPane.showMessageDialog(null,"Debes escribir el nombre y elegir la ruta de la imagen, hay campos vacios");
            	return;
            }

            if( conectarBaseDatos() )
            {
               if( altaProducto() )
               {
               	JOptionPane.showMessageDialog(null,"Producto guardado con exito");
               	jtfNombre.setText("");
               	jtaRutaImagen.setText("");
               }                  
               else
                  JOptionPane.showMessageDialog(null,"No se pudo guardar");
            }
            else
               JOptionPane.showMessageDialog(null,"No se pudo Conectar la BD");

        	}
   	};
    	btnGuardar.addActionListener(escuchadorGuardar);
    	
	}  	//Fin del costructor

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         //Preparar conexion para ejecutar una sentencia SQL
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

	//Realiza un ALTA en la tabla de productos
   //devuelve true solo si se pudo realizar con exito el INSERT en la tabla
   public boolean altaProducto()
   {
      try
      {
         String strRutaImagen;
         //Instanciamos la clase que corrige la ruta del archivo
         CorregirRuta ruta1 = new CorregirRuta(jtaRutaImagen.getText(),"\\", "\\\\");
         //CORREGIR LA RUTA
         strRutaImagen = ruta1.obtenerRutaCorregidaWindows();
         //Hacer el insert con la ruta corregida
         int res = st.executeUpdate("INSERT INTO productos(nombre,imagen) VALUES('"+jtfNombre.getText()+"','"+strRutaImagen+"')");
         
         if(res==1)
            return true;
         else
            return false;

      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

   //Comprueba true si alguno de los 2 campos esta vacios
   public boolean hayCamposVacios()
   {
      if( jtfNombre.getText().isEmpty() || jtaRutaImagen.getText().isEmpty() )
         return true;
      return false;
   }

   //hace visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

	//Clase interna
	class seleccionarImagen implements ActionListener
	{
	  public void actionPerformed(ActionEvent ae)
	  {
	   String strSeleccionado;
	   JFileChooser jfcSeleccionarArchivo = new JFileChooser();
	   //Asignar el filtro para que solo se vean imagenes en la ventana abrir
	   jfcSeleccionarArchivo.addChoosableFileFilter(new FiltroImagenes());
	   //Filtro a usarse por defecto
	   jfcSeleccionarArchivo.setFileFilter(jfcSeleccionarArchivo.getChoosableFileFilters()[1]);
	
	      // Abre el cuadro de dialogo Abrir
	      int retval = jfcSeleccionarArchivo.showOpenDialog(JfrAltaProductos.this);
	      if (retval == JFileChooser.APPROVE_OPTION)
	      {
	          //... Si el usuario selecciono un archivo, entonces usarlo
	          File filSeleccionado = jfcSeleccionarArchivo.getSelectedFile();
	          //Obtener ruta absoluta del archivo seleccionado
	          strSeleccionado = filSeleccionado.getAbsolutePath();
	          //Mostrar la ruta al usuario en el area de texto correspondiente
	          jtaRutaImagen.setText(strSeleccionado);
	      }
	  }
	}		//fin de clase interna


}		//Fin de la clase

A continuacion muestro una imagen de la ventana que se genera:

Ventana para dar de Alta un producto.

Ventana para dar de Alta un producto.


Dejando campos vacios…
Mensaje de error al dejar Campos vacios en alta de producto.

Mensaje de error al dejar Campos vacios en alta de producto.

Como se observa e insertado un producto de ejemplo para ilustrar como funciona la ventana. El usuario una vez que escribe el nombre y elije un archivo de imagen (con el Boton Examinar…) debe dar clic en el Boton Guardar; al hacer esto el programa realiza una pequeña validacion de campos vacios y si se logra satisfacer se hace el INSERT. Una vez que se realizo el INSERT el programa limpia los campos para que el usuario siga dando de alta mas productos. Si el usuario ya termino debe dar click en el Boton Cancelar para volver a la ventana principal del ejemplo.

Como se puede observar en el metodo altaProducto() se instancia a la clase CorregirRuta.java (pasandole la ruta sin corregir) y se ejecuta su metodo obtenerRutaCorregidaWindows() para obtener la ruta corregida, tambien en la clase interna seleccionarImagen se hace una instancia de la clase FiltroImagenes.java, a continuacion muestro el codigo de dichas clases:

CorregirRuta.java
Permite corregir al ruta de carpetas de un archivo para poder almacenarla correctamente en una tabla de MySQL. Creo que no necesita mucha explicacion pues en el cabezado del archivo se describe, sin tanto rodeo, el codigo es…

/*
 *		Instituto Tecnologico de Zacatepec, Mor.
 * Descripcion:
 *	Clase que eecibe una ruta de archivo y una cadena que es con la que vienen separadas los nombres de las carpetas
 *  y otra cadena mas que es el nuevo separador con el que se van a separar ahora las carpetas.
 *  Devuelve la ruta ya corregida con el nuevo separador
 * @author: Gonzalo Silverio gonzasilve@gmail.com
 * Archivo: CorregirRuta.java
 * 
 */
import java.util.StringTokenizer;

public class CorregirRuta 
{
    String ruta, separador, nuevoSeparador;	

    public CorregirRuta(String laruta, String sep, String nuevoSep)
    {
    	ruta=laruta;
    	separador=sep;
    	nuevoSeparador=nuevoSep;
    }

    public String obtenerRutaCorregidaWindows()
    {
         StringTokenizer tokens=new StringTokenizer(ruta, separador);
         //Para guardar la ruta corregida
         String rutaCorregida = new String();
         //Contar los tokens (en este caso las carpetas, contado tambien
         // el nombre del archivo seleccionado).
         int noTokens = tokens.countTokens();
         int i = 1;
         do
         {		//Agregar el nuevo separador
            rutaCorregida += tokens.nextToken()+nuevoSeparador;
            i++;
         }while(i<noTokens);
         //Agregar a la ruta corregida el ultimo token, (nombre del archivo)
         rutaCorregida += tokens.nextToken();		
         //Mostrar la ruta corregida en la consola
         System.out.println(rutaCorregida+"\n"+noTokens+ " tokens");
         return rutaCorregida;
    }
}

FiltroImagenes.java
Clase para filtrar unicamente los archivos de imagenes con extension .jpeg , .jpg , .png , .gif en la ventana de dialogo estandar Abrir.

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:
   Clase que permite mostrar unicamente los ficheros .jpeg,  .jpg,  .gif en los cuadros de dialogo.
   Un filtro es un objeto de la clase FileFilter del paquete javax.swing.filechooser.. FileFilter es una
   clase obstracta con dos metodos abstractos accept y getDescription.
Author:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo FiltroImagenes.java
*/

import javax.swing.filechooser.FileFilter;
import java.io.File;

public class FiltroImagenes extends FileFilter
{
    public boolean accept(File f)
   {
      if( f.isDirectory() )      
         return true;
      
      String nombreArchivo = f.getName().toLowerCase();
      if( nombreArchivo != null )
         if( nombreArchivo.endsWith(".jpeg") ||
            nombreArchivo.endsWith(".jpg")  ||
			nombreArchivo.endsWith(".png")  ||
            nombreArchivo.endsWith(".gif")
           )
            return true;
      
      return false;    
   }
   
   //Descripcion del filtro (se mostrara en la ventana abrir)
   public String getDescription()
   {
      return "Archivos de imagenes ( *.jpg ,  *.png ,  *.gif )";
   }
}        //Fin de la clase

JfrVisorProductos.java
Esta clase crea una ventana muy sencilla para mostrar los datos del producto, principalmente permite leer la ruta almacenada del archivo de imagen muestra del producto. En el codigo he comentado las partes mas importantes…

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para mostrar las imagenes de los productos.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrVisorProductos.java
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.sql.*;

public class JfrVisorProductos extends JFrame
{
   JPanel panelPrincipal, panelSuperior,panelInferior;

	private static Connection con = null;
	Statement st;
	ResultSet rs;
	
	int idsProductos[];    //Contiene los ID de los productos
	//Apunta al registro que se esta mostrando actualmente
	//Po defecto apuntar antes del primero
	int regActual = -1;
	int totalRegistros = 0;         //Contiene el total de registros que hay en la tabla
   JLabel lblNombreProducto = new JLabel("Nombre imagen");
   JPanel panImagen;
   JLabel lblImagen;
	Icon imagenn;
   
	JButton btnAnterior = new JButton("Anterior");
	JButton btnSiguiente  = new JButton("Siguiente");;
      
	Box boxpanSuperior;

   JfrVisorProductos(String tituloVentana, int ancho, int alto)
   {
      //Establecer titulo,tamanio, si es redimensionable y la posicion
      // de la ventana
      setTitle(tituloVentana);
      setSize(ancho,alto);
      this.setResizable(false);
      setLocationRelativeTo(null);
      
      JPanel panNombreProducto = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panNombreProducto.add(lblNombreProducto);
      
      panelPrincipal = new JPanel(new BorderLayout());
      panelSuperior = new JPanel(new BorderLayout());
      panelInferior = new JPanel(new BorderLayout());
      btnAnterior.setMnemonic(KeyEvent.VK_A);
      btnSiguiente.setMnemonic(KeyEvent.VK_S);
      imagenn = new ImageIcon();
      lblImagen = new JLabel(imagenn);

      panImagen = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panImagen.add(new JScrollPane(lblImagen), BorderLayout.CENTER);
      
      panelSuperior.add(panImagen);
      boxpanSuperior = Box.createVerticalBox();      
      boxpanSuperior.add(panNombreProducto);
      boxpanSuperior.add(panelSuperior);
      
      panelInferior.add(btnAnterior, BorderLayout.WEST);
      panelInferior.add(btnSiguiente, BorderLayout.EAST);
      panelPrincipal.add(boxpanSuperior, BorderLayout.CENTER);
      panelPrincipal.add(panelInferior, BorderLayout.SOUTH);

      add(panelPrincipal);
      inicializar();		//Cargar los IDs
      siguiente();		//Moverse al primer registro (estabamos uno antes del primero)
      
// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
	this.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON ANTERIOR   ##########
    	ActionListener escuchadorAnterior = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				anterior();				//Va al anterior registro de la tabla
        	}
   		};
    	btnAnterior.addActionListener(escuchadorAnterior);

    	// ########### ESCUCHADOR BOTON SIGUIENTE   ##########
    	ActionListener escuchadorSiguiente = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				siguiente();				//Va al siguiente registro de la tabla
        	}
   		};
    	btnSiguiente.addActionListener(escuchadorSiguiente);
    	
   }		//Fin del constructor

    //Inicializa el arreglo de IDs para que se puedan recorrer los registros 
    //y actualiza la variable que contiene el total de registros que hay en la tabla
    public void inicializar()
    {
        try
        {
            conectarBaseDatos();		//Nos conectamos con la BD
            rs = st.executeQuery("SELECT * FROM productos"); //seleccionamos todos los de la tabla productos

            //A continuacion se van a guardar en un arreglo los IDs de todos los productos
            if(! rs.first() )             //Nos movemos al primer registro
            	JOptionPane.showMessageDialog(null,"La tabla de productos esta vacia.");
	
            int contador = 0 ;
            do
                contador ++ ;           //Contar cuantos registros hay en la tabla productos
            while(rs.next());
            totalRegistros = contador-1;      //Guarda el numero de registros que hay en la tabla

            idsProductos = new int[contador];            //Crea el arreglo de IDs
            contador = 0;       //Reinicializar el contador
            rs.first();             //Nos movemos al primer registro
            do
                idsProductos[contador++]= rs.getInt("id");
            while(rs.next());

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al inicializar el arreglo de IDs");
        }

    }		//Fin del metodo
    
    //permite desplazarse al anterior registro de la tabla
    public void anterior()
    {       
        regActual = regActual - 1;
        if ( regActual < 0 )
            regActual = 0;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al registro Anterior");
    }
	
	//permite desplazarse al siguiente registro de la tabla
    public void siguiente()
    {
        regActual = regActual + 1;
        if ( regActual > totalRegistros )
            regActual = totalRegistros;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al siguiente registro");
    }

    
    //Realiza una consulta con el ID seleccionado en regActual en el arreglo idsProductos[], 
    //devuelve true si se realizo la consulta con exito, en caso contrario devuelve false
    private boolean consultarID()
    {
        try
        {
            rs = st.executeQuery("SELECT * FROM productos where id="+idsProductos[regActual] ); //seleccionamos todos los de la tabla productos
            rs.first();                 //moverse al primer registro
            poblarCampos();
            return true;                //Todo se ejecuto con exito
        }
        catch(SQLException sqlex)
        {
            return false;
        }
    }		//Fin del metodo
    
    //rellena los campos con los datos del registro apuntado actualmente
    private void poblarCampos()
    {
        try
        {            
            lblNombreProducto.setText(rs.getString("nombre"));
            panImagen.remove(lblImagen);	//Borrar la imagen anterior
            //Recuperar de la BD la ruta del archivo de imagen
            imagenn = new ImageIcon(rs.getString("imagen"));	
            lblImagen = new JLabel(imagenn); //Cargar nueva imagen
            panImagen.add(lblImagen);	
            validate();
            repaint();	
				//Mostrar en la barra de titulo el reg. actual y el total
				setTitle("Visor de imagenes [producto "+(regActual+1)+" de "+(totalRegistros+1)+"]");

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al rellenar los campos");
        }        
    }		//Fin del metodo
    

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }		//Fin del metodo
   
	//hacer visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

}	//Fin de la clase

El aspecto de la ventana que se genera es esta:

Visor de imagenes de productos

Visor de imagenes de productos



Como se puede observar en el codigo e ideado una manera de recorrrer los registros de la tabla con dos botones, me parece interesante esto; lo mas probable es que en otra entrada del blog publique algo al respecto pero ya con los 4 botones de navegacion de registros (Primero,Anterior,Siguiente,Ultimo).

Nota: La marca Sabritas, Rufles y Coca-Cola son marcas registradas y solo las e puesto aqui con propositos educativos, si el autor(es) desea que la retire basta con pedirlo.

Bueno esto creo que se alargo demasiado, el objetivo era corregir la ruta y meti varias cosas mas, jajaja pero estoy seguro que aprendi mas y espero que tu tambien. Si estas leyendo esto es por que me imagino que leiste todo lo anterior. Ya sabes si tienes dudas puedes dejar un comentario, o si quieres los .java basta con dejar tu mail… hasta pronto y gracias por pasar por aqui ;).

Acerca de gonzasilve
Freelance Web Developer.

81 Responses to Como guardar la ruta de un archivo en tabla MySQL y java

  1. Pingback: car ecu tuning

  2. Pingback: download Game slot Uang asli

  3. Pingback: Attraction marketing seminars

  4. Pingback: luggage sets cheap

  5. Pingback: electriq tv software update

  6. Pingback: Continued

  7. Pingback: visit their website

  8. Pingback: mouse click the next page

  9. Pingback: drawing tablets that don t need a computer

  10. Pingback: building toys for 6 year olds

  11. Pingback: jetset travel tote

  12. Pingback: visit Arcelia

  13. Pingback: chanel flap bag with handle

  14. Pingback: digital caliper reviews

  15. Pingback: michael kors travel tote

Replica a iscJavier Cancelar la respuesta