lunes, 3 de junio de 2013

Ejemplo Conectando Java con MySql

En esta entrada vamos a tocar uno de los puntos fundamentales en el desarrollo de software, no vamos a entrar en detalles de que es una BD, ni los tipos existentes ni como crearlas entre muchos otros temas en torno a esto, solamente muestro una pequeña aplicación (muy básica) donde veremos de forma fácil como conectarnos a una BD para consultar y registrar información
....además daremos paso a futuras entradas sobre los Patrones de Diseño, ya que en esta aplicaremos los Patrones VO (Value Object) y DAO (Data Access Objetc).

Requisitos.
  • Ambiente de desarrollo (En este caso Eclipse)
  • JDK instalado.
  • MySql Instalado
  • mysql-connector-java-5.0.8-bin (lo pueden bajar desde aquí)
  • Conocimientos Basicos de Programación.
  • Ganas de Continuar.

En Marcha.

Bueno, vamos a hacer una aplicación simple, la idea de este tutorial es ver como conectarnos a MySql desde Java, por eso no nos preocuparemos tanto en como se presentaran nuestra información, ni los tipos de datos, ni que tan óptimo sea nuestro código, simplemente vamos a crear una base desde donde podamos trabajar.

La Aplicación.

El siguiente diagrama muestra la estructura de nuestra aplicación (Ojo no es un diagrama de clases completo, es mas usado para dar claridad al sistema, por eso no nos enfocaremos en asociaciones, tipos de datos o etc)


Como vemos la aplicación es básica, nos conectaremos a una BD donde tenemos una única tabla y mediante Java vamos a acceder a dicha BD para poder registrar y consultar información, la idea es poder registrar y consultar personas, en la aplicación tendremos un Menú principal con estas opciones.....

La Base de Datos.

Nuestra base de datos solo tendrá la tabla persona con los datos básicos de registro (si se desea se puede dar otro enfoque a la tabla o trabajar con muchas mas), el Script para la creación es el siguiente:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `codejavu`;

/*Table structure for table `persona` */

DROP TABLE IF EXISTS `persona`;

CREATE TABLE `persona` (
  `id` int(10) NOT NULL,
  `nombre` varchar(30) default NULL,
  `edad` int(3) default NULL,
  `profesion` varchar(30) default NULL,
  `telefono` decimal(10,0) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `persona` */

Empecemos!!!

Para iniciar vamos a crear un proyecto java en Eclipse, por cuestiones de organización crearemos las clases de nuestro diagrama separándolas por paquetes, esto con el fin de tener nuestro proyecto mas estructurado y fácil de entender, así.



Como vemos tenemos un paquete por cada clase, en estos momentos la aplicación es pequeña por lo tanto no nos da problemas de organización, sin embargo a medida que vaya creciendo se hace importante tener nuestras clases agrupadas facilitando así el trabajo futuro y la mantenibilidad de nuestro sistema.

Clase DbConnection.

Esta clase será nuestra cadena de conexion, aquí definiremos los parámetros requeridos para conectarnos a la BD creada anteriormente.
package prueba.connection;
import java.sql.*;

/**
 * Clase que permite conectar con la base de datos
 * @author chenao
 *
 */
public class DbConnection {
   /**Parametros de conexion*/
   static String bd = "codejavu";
   static String login = "root";
   static String password = "";
   static String url = "jdbc:mysql://localhost/"+bd;

   Connection connection = null;

   /** Constructor de DbConnection */
   public DbConnection() {
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         connection = DriverManager.getConnection(url,login,password);

         if (connection!=null){
            System.out.println("Conexión a base de datos "+bd+" OK\n");
         }
      }
      catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }catch(Exception e){
         System.out.println(e);
      }
   }
   /**Permite retornar la conexión*/
   public Connection getConnection(){
      return connection;
   }

   public void desconectar(){
      connection = null;
   }
}


En la clase estamos aplicando el manejo de excepciones, tema tratado en el articulo anterior, vemos como se tiene contemplada la jerarquía de excepciones pertinente.


Clase PersonaVO. 

Esta clase nos permite dar un manejo mucho mas organizado y seguro a nuestra información, en ella estamos aplicando el patrón VO (Value Object) con el cual nos aseguramos que los datos viajen en un solo objeto, evitando no solo el envió de gran cantidad de parámetros sino también un mayor control............Debemos saber que por cada tabla de nuestra BD se tiene que construir su equivalente clase VO.
package prueba.vo;


/**
 * CLase VO con los atributos del campo empleado
 * @author chenao
 *
 */
public class PersonaVO{
 
 private Integer idPersona;
 private String nombrePersona;
 private Integer edadPersona;
 private String profesionPersona;
 private Integer telefonoPersona;
 
 /**
  * @return the idPersona
  */
 public Integer getIdPersona() {
  return idPersona;
 }
 /**
  * @param idPersona the idPersona to set
  */
 public void setIdPersona(Integer idPersona) {
  this.idPersona = idPersona;
 }
 /**
  * @return the nombrePersona
  */
 public String getNombrePersona() {
  return nombrePersona;
 }
 /**
  * @param nombrePersona the nombrePersona to set
  */
 public void setNombrePersona(String nombrePersona) {
  this.nombrePersona = nombrePersona;
 }
 /**
  * @return the edadPersona
  */
 public Integer getEdadPersona() {
  return edadPersona;
 }
 /**
  * @param edadPersona the edadPersona to set
  */
 public void setEdadPersona(Integer edadPersona) {
  this.edadPersona = edadPersona;
 }
 /**
  * @return the profesionPersona
  */
 public String getProfesionPersona() {
  return profesionPersona;
 }
 /**
  * @param profesionPersona the profesionPersona to set
  */
 public void setProfesionPersona(String profesionPersona) {
  this.profesionPersona = profesionPersona;
 }
 /**
  * @return the telefonoPersona
  */
 public Integer getTelefonoPersona() {
  return telefonoPersona;
 }
 /**
  * @param telefonoPersona the telefonoPersona to set
  */
 public void setTelefonoPersona(Integer telefonoPersona) {
  this.telefonoPersona = telefonoPersona;
 }
}


Como vemos cada campo de la tabla persona es reflejado en la Clase PersonaVO, tambien aplicamos un poco el concepto de Encapsulación tratado en un articulo anterior mediante la creación de metodos setter y getter por cada dato privado.

Clase PersonaDAO. 

Esta clase sera la encargada de gestionar el acceso a los datos, con ella aplicamos un patrón DAO (Data Access Objetc) no entraremos en detalle (mas adelante se presentara una entrada sobre este Patrón) ya que básicamente necesitamos saber que este patrón nos enseña la forma de obtener información de la BD mediante métodos CRUD (Create, Read, Update y Delete), así que por cada tabla de nuestra BD debemos tener una clase DAO que la represente!!!
package prueba.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import prueba.connection.DbConnection;
import prueba.vo.PersonaVO;


/**
 * Clase que permite el acceso a la base de datos
 * @author chenao
 *
 */
public class PersonaDAO 
{

 /**
  * Permite registrar un empleado
  * @param persona
  */
 public void registrarPersona(PersonaVO persona) 
 {
  DbConnection conex= new DbConnection();
  try {
   Statement estatuto = conex.getConnection().createStatement();
   estatuto.executeUpdate("INSERT INTO persona VALUES ('"+persona.getIdPersona()+"', '"
     +persona.getNombrePersona()+"', '"+persona.getEdadPersona()+"', '"
     +persona.getProfesionPersona()+"', '"+persona.getTelefonoPersona()+"')");
   JOptionPane.showMessageDialog(null, "Se ha registrado Exitosamente","Información",JOptionPane.INFORMATION_MESSAGE);
   estatuto.close();
   conex.desconectar();
   
  } catch (SQLException e) {
            System.out.println(e.getMessage());
   JOptionPane.showMessageDialog(null, "No se Registro la persona");
  }
 }
   
/**
 * permite consultar el empleado asociado al documento enviado
 * como parametro 
 * @param documento 
 * @return
 */
public ArrayList< personavo> consultarPersona(int documento) {
  ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
  DbConnection conex= new DbConnection();
    
  try {
   PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona where id = ? ");
   consulta.setInt(1, documento);
   ResultSet res = consulta.executeQuery();
   
  if(res.next()){
    PersonaVO persona= new PersonaVO();
    persona.setIdPersona(Integer.parseInt(res.getString("id")));
    persona.setNombrePersona(res.getString("nombre"));
    persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
    persona.setProfesionPersona(res.getString("profesion"));
    persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
    miEmpleado.add(persona);
          }
          res.close();
          consulta.close();
          conex.desconectar();
   
  } catch (Exception e) {
   JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);
  }
  return miEmpleado;
 }

/**
 * permite consultar la lista de empleados
 * @return
 */
public ArrayList< personavo> listaDePersonas() {
  ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
  DbConnection conex= new DbConnection();
    
  try {
   PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona");
   ResultSet res = consulta.executeQuery();
   while(res.next()){
    PersonaVO persona= new PersonaVO();
    persona.setIdPersona(Integer.parseInt(res.getString("id")));
    persona.setNombrePersona(res.getString("nombre"));
    persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
    persona.setProfesionPersona(res.getString("profesion"));
    persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
    miEmpleado.add(persona);
          }
          res.close();
          consulta.close();
          conex.desconectar();
   
  } catch (Exception e) {
   JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);
  }
  return miEmpleado;
 }

}
Por cuestiones de tiempo no realizaremos todo el CRUD, tan solo vamos a trabajar con los métodos de registro y consulta (Los métodos de actualización y eliminación serán una buena tarea en casa ;) )

Cada método usa la cadena de conexión creada anteriormente y se enfoca en una tarea en especifico, además en cada uno hacemos uso de un objeto de tipo PersonaVO, mediante el cual asignamos la información de nuestra tabla persona, tanto para el registro como para la consulta de información.

Clase Principal.

En esta clase vamos a hacer el llamado a todos los procesos de nuestra aplicación, tendremos un menú en el cual presentamos todas las opciones del sistema, así mismo se validaran las entradas del usuario para evitar posibles inconsistencias y posteriormente se hace el llamado a la clase DAO que permite ejecutar los procesos de conexión con la BD.
package prueba.principal;

import java.util.ArrayList;
import javax.swing.JOptionPane;
import prueba.dao.PersonaDAO;
import prueba.vo.PersonaVO;


public class Principal {
 
 PersonaDAO miPersonaDAO;

 /**
  * Método principal, hace el llamado al menú donde se
  * presentan todas las opciones del sistema
  * @param args
  */
 public static void main(String[] args) {
  
  Principal miPrincipal = new Principal();
  miPrincipal.verMenu();
 }

 /**
  * Método que permite presentar las opciones del sistema.
  * solicita el ingreso de un numero y se envia a su 
  * correspondiente proceso
  */
 private void verMenu() {
  
  String textoMenu="Menú Principal\n\n";
  textoMenu+="Ingrese alguna de las opciones del Menú    \n";
  textoMenu+="1. Registrar Persona\n";
  textoMenu+="2. Consultar Persona\n";
  textoMenu+="3. Ver Lista Personas\n";
  textoMenu+="4. Salir.\n\n";
  
  try {
  int seleccion= Integer.parseInt(JOptionPane.showInputDialog(textoMenu));
  defineSeleccion(seleccion);
  } catch (NumberFormatException e) {
   JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
     "solo se permiten valores númericos","ERROR",JOptionPane.ERROR_MESSAGE);
   verMenu();
  } catch (Exception e) {
   JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
     "solo se permiten valores númericos","ERROR",JOptionPane.ERROR_MESSAGE);
   verMenu();
  }
 }

 /**
  * Permite determinar que accion ejecutar dependiendo del parametro de 
  * ingreso correspondiente a las opciones del sistema
  * @param seleccion
  */
 private void defineSeleccion(int seleccion) {
  
   System.out.println("Selecciona "+seleccion);
   
   switch (seleccion) {
   case 1:
     registrarPersona();
     verMenu();
    break;
   case 2:
    int doc=Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero" +
      " de documento de la persona"));
    buscarPersona(doc);
    verMenu();
    break;
   case 3:
    obtenerRegistros();
    verMenu();
    break;
   case 4:
    System.exit(0);
    break;
   default:
    JOptionPane.showMessageDialog(null, "Ingrese un " +
      "numero valido","ADVERTENCIA",JOptionPane.WARNING_MESSAGE);
    verMenu();
    break;
   }
 }
 
 /**
  * Permite solicitar los datos de la persona a registrar, se solicitan mediante
  * una ventana de ingreso y se almacenan en un arreglo con toda la informacion usando
  * para esto un ciclo for, posteriormente estos datos son almacenados en el
  * atributo correspondiente del objeto persona para ser enviado al metodo de registro
  * en la clase DAO
  */
 private void registrarPersona() {
  miPersonaDAO = new PersonaDAO();
  PersonaVO miPersona=new PersonaVO();
  
  String mensajeIngreso="Ingrese\n\n";
  
  String datosSolicitados[] = {"Documento : ","Nombre : ",
          "Edad: ","Profesión: ","Telefono: "};
  String datosPersona[] = new String[5];
  for (int i = 0; i < datosSolicitados.length; i++) {
   //solicita el ingreso del dato y se almacena en el arreglo de datosPersona
   datosPersona[i]=JOptionPane.showInputDialog(null, mensajeIngreso+
      datosSolicitados[i],"Datos Persona",JOptionPane.INFORMATION_MESSAGE);
   
   System.out.println(datosSolicitados[i]+datosPersona[i]);
  }
  
  miPersona.setIdPersona(Integer.parseInt(datosPersona[0]));
  miPersona.setNombrePersona(datosPersona[1]);
  miPersona.setEdadPersona(Integer.parseInt(datosPersona[2]));
  miPersona.setProfesionPersona(datosPersona[3]);
  miPersona.setTelefonoPersona(Integer.parseInt(datosPersona[4]));
  
  miPersonaDAO.registrarPersona(miPersona);
  
 }

 /**
  * Permite obtener la lista de personas almacenada en la tabla persona
  * si la lista se encuentra vacia quiere decir que no hay personas registradas
  * acto seguido se presenta un mensaje en pantalla, sino se imprime la lista de 
  * todas las personas registradas en la BD
  */
 private void obtenerRegistros() {
  miPersonaDAO = new PersonaDAO();
  PersonaVO miPersona;
  
  //Se obtiene la lista de personas
  ArrayList< personavo> listaPersonas = miPersonaDAO.listaDePersonas();
  //se valida si se obtubo o no informacion
  if (listaPersonas.size()>0) {
   int numeroPersona=0;
   //se recorre la lista de personas asignandose cada posicion en un objeto persona
   for (int i = 0; i < listaPersonas.size(); i++) {
    numeroPersona++;
    miPersona=listaPersonas.get(i);
    System.out.println("****************Persona "+numeroPersona+"**********************");
    System.out.println("Id Persona: "+miPersona.getIdPersona());
    System.out.println("Nombre Persona: "+miPersona.getNombrePersona());
    System.out.println("Edad Persona: "+miPersona.getEdadPersona());
    System.out.println("Profesión Persona: "+miPersona.getProfesionPersona());
    System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());
    System.out.println("*************************************************\n");
   }
  }else{
   JOptionPane.showMessageDialog(null,"Actualmente no " +
     "existen registros de personas","INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
  }
  
 }
 
 /**
  * Permite la consulta de una persona en especifico mediante el envio de
  * su documento de identidad como parametro, en caso de que no se retorne
  * informacion se presenta un mensaje en pantalla, sino entonces se imprimen los
  * datos de la persona encontrada
  * @param documento
  */
 private void buscarPersona(int documento) {
  miPersonaDAO = new PersonaDAO();
  PersonaVO miPersona;
  ArrayList< personavo> personasEncontrada = miPersonaDAO.consultarPersona(documento);
  //se valida que se encuentre la persona
  if (personasEncontrada.size()>0) {
   //se recorre la lista y se asignan los datos al objeto para imprimir los valores
   for (int i = 0; i < personasEncontrada.size(); i++) {
    miPersona=personasEncontrada.get(i);
    System.out.println("****************Persona*************************");
    System.out.println("Id Persona: "+miPersona.getIdPersona());
    System.out.println("Nombre Persona: "+miPersona.getNombrePersona());
    System.out.println("Edad Persona: "+miPersona.getEdadPersona());
    System.out.println("Profesión Persona: "+miPersona.getProfesionPersona());
    System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());
    System.out.println("*************************************************\n");
   }
  }else{
   JOptionPane.showMessageDialog(null,"El documento ingresado " +
     "no corresponde a ninguna persona","INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
  }
 }
}

Como se ve, tenemos la clase principal dividida en metodos para cada proceso, eso hace que podamos darle un tratamiento individual a cada uno, asi en caso de algun error facilmente podremos identificar en que metodo sucedio....... tambien vemos que en el método verMenu() validamos por medio de bloques try - catch los posibles errores en el ingreso de datos por parte del usuario.

Ejecutando la Aplicación.

Al ejecutar la aplicación se presenta el menú principal donde ingresamos las opciones correspondientes, pero hay que tener presente que previamente debimos haber agregado el mysql-connector al build path del proyecto, sino nos aparecera algo como esto :

Para solucionarlo sobre el proyecto damos clic derecho/configure Build path... , buscamos al jar desde la ruta donde lo descargamos y damos ok


después de esto ya tendremos nuestra aplicación en funcionamiento


Como se mencionó al principio, es una aplicación básica y no nos enfocamos en muchos detalles.........tan solo en la logica de conexión que nos servira como base para futuros desarrollos....

Mas adelante continuaremos con otros temas de interes donde aplicaremos los conceptos vistos en esta entrada!!!

Hace tiempo hice un ejemplo un poco mas largo creando una aplicaciòn login con privilegios en la que se realiza una conexion a Base de Datos, les comparto un enlace para la lista de reproducciòn que les puede servir para complementar el tema...

Para consultar la lista presiona aquì. 


También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó, te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

62 comentarios:

  1. Buen material gracias bro. me sirvio de mucho....

    ResponderEliminar
  2. Excelente::::muy bn explicado me aclaro muchas dudas, ya lo implemente y me encuentro implementando el UD del CRUD.....Gracias saludos desde Bogotá... :P

    ResponderEliminar
    Respuestas
    1. Es con mucho gusto, y esa es la idea, que pueda servir y aclarar dudas (Y) Saludos desde Armenia ;)

      Eliminar
  3. Por fin alguien que pone un ejemplo explicado y con código de diagrama de clases :/ eres el primero que lo hace después de 4h de busqueda
    Ánimo !

    ResponderEliminar
    Respuestas
    1. jejeje Muchas Gracias, yo se lo que es eso, buscar y buscar.... por eso la idea de este blog, ayudar facil y rapidamente ;) Un Saludo

      Eliminar
  4. Muy bueno el programa me sirvió de referencia, este men por que no haces un vídeo explicándolo seria genial debido a que he visto incontables vídeos de java en youtube y no he encontrado el primero que explique esto que acabas de hacer y la verdad se entendería mejor. Yo como soy nuevo en JAVA no entendí mucho solo me sirvió de referencia

    ResponderEliminar
    Respuestas
    1. Hola Victor, gracias por comentar, y te cuento que si tengo pensado hacer algunos videotutoriales, solo que por cuestiones de tiempo no me he metido de lleno, sin embargo hace poco empece con unos sobre la creación de proyectos web (No soy muy constante pero ahi vamos), apenas terminé esa secuencia inicio con temas varios, entre esos este ;) Un saludo y te dejo el enlace de uno de los videos ;)

      http://www.youtube.com/watch?v=SAfGl7XbFNI

      Eliminar
  5. Y para cuando más sobre patrones de diseño?. Estaría bien uno sobre el patrón DAO que me ha quedado un poco difuso. El patrón VO si parece sencillo, hacer una clase por cada tabla de la BD. Pero el DAO se me resiste.

    Un saludo y un gran trabajo.

    ResponderEliminar
    Respuestas
    1. Hola, en estos momentos tengo problemas con mi PC pero tengo preparadas unas entradas para subir muy pronto, gracias por comentar un saludo

      Eliminar
  6. Statement estatuto = conex.getConnection().createStatement(); Hola, esa línea que hace precisamente? los Statement no los entiendo mucho. Gracias

    ResponderEliminar
  7. Gracias, muy buena entrada. Te agradezco que compartas el conocimiento.

    ResponderEliminar
  8. Muy bueno, me acaró muchas dudas!! muchas gracias, sería genial si pudieras explicar sobre el DAOFactory... intento entender eso pero me parece muy confuso n_n

    ResponderEliminar
  9. Hi, Sensei.
    Una consulta ... select * from tb_pregunta; jejejejejeje XD
    Esta revisando la clase PersonaDao y veo que el objeto conex (DbConnection conex = new DbConnection();) se usa en cada método por obvias razones. Así que aquí nace mi duda. No seria mejor declarar la de manera global en de declarar de manera local. O es que estoy hablando piedras
    (-_-;)

    ResponderEliminar
    Respuestas
    1. Hola Erick, fresco tienes razón, solo que el tema es que hay que tener mucho cuidado cuando se realizan conexiones a la base de datos por temas de rendimiento, pues es peligroso dejar una BD abierta por eso lo recomendable es siempre despues de realizar el proceso, volverla a cerrar por eso se pone estatuto.close(); y conex.desconectar(); ......... o si te refieres a repetir esa linea.... podria hacerse un solo metodo y llamarlo cada vez.... (que pena la demora)

      Eliminar
  10. Hola Cristian, por favor si me podrías ayudar con la conexión remota a mysql. Es decir aparte de cambiar el localhost por una ip en la url que mas tengo que hacer, me explico, ya tengo en red el servidor de base de datos y el servidor de aplicación, según a lo que investigue tengo que crear un usuario en mysql y darle permiso para la conexión remota, editar el contenido del archivo my.ini en mysql (bind-address=127.0.0.1 por bind-address=0.0.0.0) y otros sugieren configurar el firewall de windows para la escucha del puerto 3306 que hace uso myqsl... Ya lo intente y aun no logro la conexión remota, le estaré muy agradecido por su pronta respuesta.

    ResponderEliminar
    Respuestas
    1. Mola, me gusta!!

      Eliminar
    2. Hola NJ NC que pena no haber podido responder, solo que por cuestiones de tiempo me ausenté.......espero dentro de poco publicar lo q me solicitas aunque tambn espero que ya lo solucionaras... un saludo

      Eliminar
  11. Hola Cristian,

    para realizar la prueba de tu tutorial de forma rapida he copiado el codigo en eclipse siguiendo las instrucciones que has comentado. Aún así me aparece un error referente a 'ArrayList< personavo>' en las classes Principal y PersonaDAO, donde Eclipse me da el error 'personavo cannot be resolved to a type'...

    ¿Podrias indicarme a que se debe este error y como solucionarlo?

    Muchas gracias
    Ric

    ResponderEliminar
  12. Hola,

    Tengo el mismo problema que Cristian;

    "Anónimo4 de agosto de 2014, 9:06
    Hola Cristian,

    para realizar la prueba de tu tutorial de forma rapida he copiado el codigo en eclipse siguiendo las instrucciones que has comentado. Aún así me aparece un error referente a 'ArrayList< personavo>' en las classes Principal y PersonaDAO, donde Eclipse me da el error 'personavo cannot be resolved to a type'...

    ¿Podrias indicarme a que se debe este error y como solucionarlo?"

    Gracias.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. tenia el mismo problema. lo que tienes que hacer es cambiar "personavo" por "PersonaVO" en el arraylist ... suerte!

      Eliminar
  13. Muy buena explicación, gracias lo felicito y siga adelante difundiendo conocimiento. !Éxitos!

    ResponderEliminar
  14. a mi no me sirvió, cuando voy a ingresar el teléfono me sale "Solo se permiten datos numéricos", y no entiendo que pasa

    ResponderEliminar
    Respuestas
    1. A mi me paso lo mismo y era por la conexion a la base de datos, comprueba la contraseña y el puerto

      Eliminar
  15. Enhorabuena por tan claro tutorial! Animo y muchas gracias!

    ResponderEliminar
  16. Gracias por compartir el conocimiento con la red de programadores.

    Éxito y un abrazo.

    ResponderEliminar
  17. Excelente aporte, muchas gracias!!!

    ResponderEliminar
  18. me saco de una duda que tenia !!
    excelente aporte !!
    Muchas gracias !!

    ResponderEliminar
  19. Exelentee! Después de mucho buscar me acabas de sacar de muchas dudas ! Muchas gracias

    ResponderEliminar
  20. Excelente, muchas gracias

    Tendrás algún ejemplo donde utilices un ORM en una aplicación de Escritorio.

    ResponderEliminar
  21. la base de datos la creaste en eclipse o la tenias previamente creada en my sql

    ResponderEliminar
    Respuestas
    1. La puedes crear facilmente con XAMPP y olvidarte de Eclipse.

      Eliminar
  22. Tengo un problema cuando intento realizar la consulta, utilizando la opcion 2 del menú.
    He comprobado que he conseguido añadir distintos usuarios a la BD, pero al hacer la busqueda introduciendo el número del campo "documento" me aparece el siguiente error.

    no se pudo consultar la Persona
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unkown column 'id' in 'where clause'

    Gracias anticipadas

    ResponderEliminar
    Respuestas
    1. Bueno pasado estos días he encontrado cuál es el problema, y lo publico por si alguien está interesado.

      En la BD creada, y mas concretamente en la tabla "persona" los campos son:
      "Documento", "Nombre", "Edad", "Profesión", "Telefono"

      En resumen, lo que hay que hacer es cambiar en la consulta SQL la palabra "id" por "Documento" e ir comprobando que en el codigo de las funciones de consulta hacemos una referencia correcta a los campos de la tabla. (Es decir, que los nombres de la tabla sean los que aparezcan en nuestro código)

      Saludos y espero haber ayudado a quién se le haya presentado el mismo problema

      Eliminar
  23. Te felicito. Excelente documento en lo pedagógico y lo didáctico.

    ResponderEliminar
  24. Cristian saludos desde Bogota, con lluvia y frio hoy sábado. Gracias por el ejemplo DAO-VO. Podría por favor colocar el mismo ejemplo usando POJO, o enviarme alguna guia básica para hacerlo. He buscado pero nada. Usted daría asesorías pagas por internet, algo de Jdev 11, ejb 3, ADF, Data source, y otras cositas.

    ResponderEliminar
    Respuestas
    1. Hola, acabo de verlo, le cuento que me es imposible el tema de las asesorias por cuestiones de tiempo, y sobre las preguntas DTO, Pojo y VO se puede decir que son lo mismo, tal vez a nivel conceptual cambien algunas cositas pero en la practica viene siendo lo mismo, aunque si no estoy mal el VO ya es se puede decir que el termino oficial para el transporte de datos por medio de un objeto, siendo este un patron de diseño muy usado, el DTO y el Pojo tambien son objetos que cumplen basicamente la misma funcion, aunque el pojo es un termino que se diò a un objeto simple pero no tiene mayor connotaciòn (no hay una diferencia significativa en la practica).

      a nivel empresarial aun se habla de los 3 pero muchas veces dependiendo del proyecto, por ejemplo yo hace tiempo trabajè en un proyecto viejo donde se hablaba de DTO's porque las clases las crearon asì desde el principio (PersonaDTO) pero luego cuando pasè a otro proyecto ese manejaba los VO (PersonaVO), entonces en mi ignorancia puedo decir que es practicamente el mismo concepto, lo importante està en que aplique bien el porque de su creaciòn.

      La verdad ultimamente he estado corto de tiempo por eso he descuidado el blog y el canal, espero poder ponerme al dia y retomar.

      un saludo.

      Le comparto este enlace que tal vez le puede aclarar mas los terminos.
      http://java-base.com/javabean-vs-dto-vs-pojo-jknb/

      Eliminar
    2. BIen muchas gracias por la aclaración, saludos. Piense lo de la asesoría, yo estoy adquiirendo conocimientos para prepararme para un proyecto el próximo año, no las necesito cada semana o cada quince días. La idea en una guía de como hacer algo yendo al grano, y en un tiempo prudencial. saludos

      Eliminar
  25. Otra cosita, entonces VO, DTO, y Transfer Object, es lo mismo?. gracias

    ResponderEliminar
  26. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  27. Muy buena explicacion. A mi me paso lo mismo que Cynthia Esparza, donde ingreso el numero de telefono y luego me salta error de datos numericos. Me fije el tema del puerto y lo cambie a 3306 y el local host tambien, pero sigue pasando lo mismo. Alguna idea?

    ResponderEliminar
  28. Es bastante bueno el ejercicio, para complementarlo te recomendaría usar una base de datos de pruebas en mysql, para los posteriores ejercicios.

    Por cierto, seria bueno que explicaras con esta base de datos, las tablas, ademas de eventos en cada fila para eliminar o refrescar al seleccionar una fila. Saludos :D

    Espero te sea de utilidad.

    ResponderEliminar
  29. Muy buen articulo, muchas gracias me sirvio muchismo tu explicacion. Estoy siguiendo tu blog, tus redes sociales y viendo tus videos. Explicas muy bien.

    Fernanda.

    ResponderEliminar
  30. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  31. Gracias por este post Cristian pero tengo un problea solo me regsitra datos de tipo numerico por la exception puesta en el metodo verMenu();
    --> try {
    int seleccion= Integer.parseInt(JOptionPane.showInputDialog(textoMenu));
    defineSeleccion(seleccion);
    } catch (NumberFormatException e) {
    JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
    "solo se permiten valores númericos","ERROR",JOptionPane.ERROR_MESSAGE);
    verMenu();
    }<--
    Que me recomienda

    ResponderEliminar
  32. Muy bien, pero ¿cómo puedo crear los botones de borrar y actualizar? Gracias.

    ResponderEliminar
  33. Gracias Cristian por este post, tengo una consulta, tienes algún ejemplo realizando conexiones con un pool de conexiones. He revisado varias ejemplos en internet pero no he podido solucionar mi incoveniente. Gracias

    ResponderEliminar
  34. Saludos Cristian, No me queda claro que debo hacer con el script para la base datos. Como y donde lo ejecuto.

    ResponderEliminar
    Respuestas
    1. Hola, en el minuto 5:40 explico lo de importar, sin embargo puedes simplemente copiar y pegar el codigo ahí en la consola y ejecutar el script.

      https://www.youtube.com/watch?v=rygrZueNArU

      Eliminar
  35. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  36. Saludos Cristian, esta muy bueno gracias.

    Noto que repites varias veces esta linea DbConnection conex= new DbConnection();

    Seria bien si creas una variable global y en el constructor la instancias.

    ¿Quedaría bien?

    Saludos.!

    ResponderEliminar
    Respuestas
    1. Hola Johan, si señor se podria hacer sin problemas, es mas, si usas el patrón Singleton para la conexión, nos ahorrariamos las instancias.

      Eliminar
  37. Estimado, me alegra haber encontrado esta WEB, por el alto contenido académico existente, si se quiere. Me gustaría saber como funcioanrían estos patrones cuando, por ejemplo, en las consutlas intervienen mas de una Tabla.
    Un gran abrazo.

    ResponderEliminar
  38. Exelente me ha ayudado mucho muchas gracias,tambien los video de android del canal de youtube :)

    ResponderEliminar
  39. Tienes algún ejemplo pero realizando la conexion con un pool de conexiones.

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!