lunes, 6 de mayo de 2013

JDBC: Conexión a Bases de datos Mysql

Buenas amigos, en este tutorial vamos a hablar de uno de los temas mas potentes que tiene java, y a los que a muchos nos interesa, una conexión a una base de datos mysql. Mencionar que aunque podríamos conectar  cualquier otro motor de base de datos (sqlite, oracle, access, sqlserver....) yo lo voy a realizar con mysql, más que nada porque ya lo tengo instalado. Así pues, explicaremos:
    • Conectar nuestra aplicación java a la base de datos.
    • Recorrer las tablas de la base de datos.
*ESTE CÓDIGO ES PARA JAVA SE, NO FUNCIONA PARA ANDROID. SI QUIERES HACER UNA CONEXIÓN MYSQL CON ANDROID PINCHA AQUÍ

Bien, no voy a explicar en este tema como montar un servicio mysql, ya que me quedaría demasiado extenso, más adelante es posible que me anime, pero por el momento vamos a ver solamente el código necesario para conectarnos a nuestra base de datos y recorrer sus tablas. Podéis buscar en Google como montar un servicio mysql, hay tutoriales a patadas.

Lo primero de todo es descargarnos la librería o conector para poder trabajar con mysql:

[descargar conector]

Es imprescindible para poder conectar nuestra base de datos. Así pues, para cada tipo de motor de base de datos necesitaremos su librería o conector, lo cual, normalmente, se ofrece en la página principal del fabricante que utilicemos. Es algo muy común.

una vez descargado el conector, lo agregamos en nuestro proyecto, para ello hacemos lo siguiente:

  • Pulsamos sobre nuestro proyecto con el botón derecho del ratón y pulsamos, al final de la lista desplegable, en propiedades.
  • Una vez hecho esto se nos abrirá una ventana donde elegiremos la opción "vía de construcción":

  • En la siguiente ventana que se nos abre, elegiremos la pestaña "Biblioteca" y pulsaremos sobre la opción "Añadir JAR externo...", donde nos permitirá elegir nuestro conector descargado:
  • Una vez elegido nuestro conector, se nos mostrará en la vía de construcción  y habremos agregado a nuestro proyecto una nueva librería.

Bien, ya tenemos nuestra librería dentro de nuestro proyecto. Antes de nada me gustaría agregar que voy a trabajar sobre una base de datos llamada empresa con una tabla llamada empleados. Dicha tabla constara de 3 columnas:
    • ID
    • Nombre
    • Departamento

Bueno, ahora lo que nos toca crear es una clase capaz de establecer una conexión. Esta clase constará de 4 atributos:
  • private static String servidor: Aquí colocaremos la ruta de nuestra base de datos.
  • private static String user: El nombre de usuario de mysql
  • private static String pass: La clave de usuario de mysql
  • private static String driver: Nuestra librería mysql.
Y crearemos un objeto de la clase Connection del paquete java.sql para crear la conexión:
  • private static Connection conexion: Nos devuelve la conexión.

Como veis, establezco la ruta del servidor, utilizo el usuario y el pass que viene por defecto en mysql, indico la posición del driver y creo el objeto Connection.

En el constructor levantaremos la conexión y la obtendremos, para ello seguiremos 2 sencillos pasos:

      1. Levantar el driver.
      2. Establecer la conexión.

Bien, con el método estático de la clase "class" levanto el driver que le paso por argumentos:
    • Class.forName(driver);
Con el objeto Conecction obtengo la conexión por medio del método estático getConnection de la clase DriverManager, pasándole por argumentos el servidor, el usuario y el pass:
    • conexion=DriverManager.getConnection(servidor,user,pass);
Finalmente creamos un método para obtener el objeto de la clase Connection con la conexión establecida:


Aquí os dejo la clase entera.


Bien, esta clase establece la conexión, ahora vamos a crear otra clase que se encargue de:
    • Insertar valores
    • Seleccionar valores
    • Borrar valores
    • Modificar valores
Nuestra clase tendrá 5 atributos:
      1. Un objeto de la clase escaner para leer desde teclado.
      2. Un objeto Connection para obtener la conexión a la base de datos.
      3. Un objeto tipo String para el nombre.
      4. Un objeto de tipo String para el departamento.
      5. Una variable de tipo int para las opciones del menú.

Bueno, ahora crearemos una sentencia condicional switch, dentro de un bucle do/while, para que vaya dándonos las opciones que queramos realizar hasta salir de la aplicación, y todo esto, dentro del método MAIN:

Bueno, aquí podéis ver las opciones que tendrá nuestro menú:

      • Insertar
      • Modificar
      • Eliminar
      • Mostrar
      • Salir
En el blucle do/while establecemos que no se saldrá del menú hasta que la opción 5 sea elegida. Ahora vamos a ir explicando los métodos realizados para completar todas las funciones del menú:

INSERTAR:


Por pasos:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Pedimos los datos por pantalla y por medio del objeto teclado de la clase Scanner, leemos los datos que deseemos agregar. Una cosa antes de continuar, es que, aunque mi tabla consta de 3 campos, yo tengo establecido el primero (ID) como primary key, y he establecido que se auto-incremente, por lo tanto no tengo que introducirselo.
    • Una vez introducido los datos, creamos la sentencia sql para insertarlos en nuestra base de datos.
      • String sql="insert into empleados(nombre,departamento) values ('"+nombre+"','+departamento+"')";
      • Hay que darse cuenta que los "values" que le pasamos han de estar entre comillas simples ''.
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();
Con esto ya podremos insertar filas en nuestra base de datos.

Modificar:


Por pasos:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Pedimos por teclado el número de ID del registro a modificar y se lo asignamos a una variable tipo int llamada "n", posteriormente volvemos a pedir el nombre y el departamento para modificarlos.
    • Creamos nuestra sentencia sql:
      • String sql="update empleados set nombre='"+nombre+"', departamento='"+departamento+"' where id="+n;
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();
Esta vez le he puesto una sentencia "if" para que me avise de si se modifico con éxito o no. Con esto podremos modificar nuestros registros.

Eliminar:

Lo mismo que anteriormente:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Introducimos por teclado el registro a eliminar.
    • Creamos nuestra sentencia sql:
      • String sql="delete from empleados where id="+n;
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le indicamos que ejecute la actualización de la tabla y le pasamos por argumentos nuestra sentencia sql:
      • st.executeUpdate(sql);
    • Cerramos las conexiones, en orden inverso a su apertura:
      • st.close();
      • con.close();

Llegados a este punto, ya te deberías de dar cuenta de que lo único que cambio es la sentencia sql, el resto es un copy/paste, para que veas que no es tan complicado como parece.

Mostrar:

Esta varía un poco con respecto a las otras:
    • Cargamos nuestra conexión.
      • conexion=new Conexion();
    • Pasamos al objeto Connection de esta clase la conexión de la clase "Conexion" por medio de nuestro método getConnection():
      • Connection con=conexion.getConnection();
    • Creamos un objeto de la clase Statement, la cual será la encargada de procesar la sentencia sql que le pasemos e interactuar con nuestra base de datos.
      • Statement st;
    • Creamos un objeto de la clase ResultSet que será la encargada de devolvernos los resultados de los registros:
      • ResultSet rs;
    • Creamos nuestra sentencia sql:
      • String sql="select * from empleados";
    • Establecemos la comunicación entre nuestra aplicación java y la base de datos:
      • st=con.createStatement();
    • Le pasamos al objeto de ResultSet el resultado de ejecutar la sentencia sql:
      • rs=st.executeQuery(sql);
      • En este caso no actualizamos la tabla (executeUpdate()), sino que realizamos una consulta (executeQuery());
    • Por medio de un bucle while vamos recorriendo valores mientras existan (rs.next()) y por medio de los métodos getInt y getString obtenemos los valores de las diferentes columnas, tened en cuenta de que le tenemos que pasar el número de columna:
      • while (rs.next){
      • System.out.println("ID:"+rs.getInt(1));
      • System.out.println("Nombre: "+rs.getString(2));
      • System.out.println("Departamento: "+rs.getString(3));
      • System.out.println("**************************");
      • }
    • Cerramos las conexiones, en orden inverso a su apertura:
      • rs.close();
      • st.close();
      • con.close();
Bien, con esto doy por terminada la entrada, mencionar que esto es algo muy básico del JDBC pero suficiente para empezar a explorarlo. Un saludo a todos.

23 comentarios:

  1. hola .oye ya hice todo como en el tutorial pero no me realiza la conexión . me quedo de esta forma
    private static String servidor="jdbc:mysql://10.0.2.2/empresa";
    private static String user="root";//nombre del usuario
    private static String pass="vertrigo";//claves
    private static String driver="com.mysql.jdbc.Driver";
    private static Connection conexion;

    ResponderEliminar
    Respuestas
    1. Buenas Omar.

      Así tal cual me lo muestras no se decirte que te falla. ¿Te salta alguna excepción o algún error?, ¿el user y el pass son correctos?. puedes probar a cambiar la ip por "127.0.0.0" si estas ejecutando la conexión en la misma red que tu base de datos....

      Necesito más datos para poder evaluar tu problema.

      Un saludo.

      Eliminar
    2. falta el puerto en la URl 10.0.2.2:3306/.. para mysql

      Eliminar
  2. Según la documentación de android, no es posible realizar conexiones directas con bases de datos en versiones de android superiores a la 3, sobre un hilo principal, para poderlo hacer es necesario iniciar un hilo adicional. Ese codigo funciona para la version 2.3.

    ResponderEliminar
    Respuestas
    1. Buenas Dario, veo que te has leído la documentación android, eso está bien, pero déjame que te corrija en una cosa, este código está escrito para JAVA SE, es decir, para crear aplicaciones de escritorio, no móviles. Ya sé que es posible usar este código para versiones anteriores a la versión 3 de Android, pero harías de tu App un colador en lo que a seguridad se refiere.

      Para este tipo de conexiones en android necesitas:

      1. Una base de datos corriendo en un servidor.
      2. Un WebService que se comunique con el servidor y con tu app.
      3. Una conexión por medio de la clase HttpClient de la API de Apache.
      4. Correrlo todo en una clase que herede de AsyncTask (Esta clase maneja los hilos en android).

      Si necesitas ayuda con el código y/u orientación en algún aspecto, puedes mandarme un email personal a bartolomeabellan@gmail.com

      Un saludo.

      Eliminar
  3. Buenisimo, pero, disculpa, soy nuevo en Java, ¿cómo lo hago por ejemplo para invocar esta clase y abrir la conexión en el menú principal de mi aplicación que es un formulario MDI?, ya tengo agregada la clase al proyecto. En NetBeans

    ResponderEliminar
    Respuestas
    1. Buenas Mauricio; si te refieres a que ya has copiado la clase "conexión ", con hacer
      Conexión conexión= new Conexion();
      Connection connection= conexion.getConnection();
      Con esto, en tu clase principal, ya tendrías tu conexión establecida, ya solo te faltaría utilizar la clase statment y resultset para el manejo de datos.

      Espero haber resuelto tu duda. Un saludo

      Eliminar
  4. Buenas cuando ejecuto el programa me dice que se corrio en 4 segundos pero no me muestra el mensaje de conexion estsblecida,

    ResponderEliminar
    Respuestas
    1. Buenas Oscar;

      ¿Te salta alguna exception? Si no te salta ninguna exception es posible que sea problema del servidor. Si estas completamente seguro de que no es problema del servidor, necesito más datos. Si no deseas que la gente vea tu código o tu log, puedes enviarme la información a bartolomeabellan@gmail.com. Pero ya te digo, que si no te salta ninguna exception, es muy posible que sea problema de tu servidor mysql, o del cortafuegos de tu pc (algún problema me dio el cortafuegos en alguna ocasión). Suerte.

      Eliminar
    2. Buen día Bartolomé,me podría auxiliar como detecto si es problema es del servidor, estoy jalando mi base desde mysql comand line, pero eso no tiene nada que ver o si??,, o como detecto el problema si esta en el cortafuegos

      Eliminar
  5. hola está muy bueno e tuutorial gracs me sirvió de algo gracs

    una consulta tambien utilizas IDE netbeans??

    ResponderEliminar
    Respuestas
    1. Utilizo principalmente Eclipse, no por nada, simplemente me gusta más, pero si, tengo Netbeans y alguna vez lo he utilizado. Su paleta de desarrollo es muy buena, mejor incluso que la de eclipse, pero Netbeans genera código por si solo que no puedes modificar, y es muy pesado, de ahí que me guste más eclipse.

      Eliminar
  6. hola que tal, muy buena explicacion, pero solo tengo una pregunta, a que clase pertenece la declaracion de la funcion Scanner?
    gracias!

    ResponderEliminar
    Respuestas
    1. Buenas, no se si te he entendido bien, pero ¿te refieres a la linea private static Scanner teclado=new Scanner(System.in)? La clase es Scanner, no hay ninguna función, que yo haya entendido.

      La clase Scanner es una clase que nos proporciona java desde su versión 5 que nos permite leer datos por teclado, por ejemplo, y que podamos manejarlos a nuestro antojo. Le paso por constructor "System.in" para indicarle el tipo de entrada y que va a obtener datos por consola. Aunque en este ejemplo la utilizo para leer datos desde teclado, tiene otras utilidades.

      No se si he respondido a tu duda.

      Un saludo.

      Eliminar
  7. Saludos amigo. llegue a tu tutorial... pero me pregunto, en que momento haces la selecciona de la base de datos?...

    ResponderEliminar
    Respuestas
    1. En la clase Conexion hay una String llamada servidor que pone: "jdbc:mysql://localhost/Empresa", ahí pongo la ruta de mi DB. Posteriormente ,en el constructor, le paso los parámetros (servidor, user, pass) por medio de DriverManager.getConnection a la clase Connection, que es la que hace la conexión:

      conexion=Drivermanager.getConnection(servidor, user, pass).

      En esa linea realizo la conexión a mi BD y posteriormente en las sentencias sql realizo las consultas a las tablas de mi BD.

      Un saludo.

      Eliminar
  8. Hola, me ha encantado el tutorial, muchas gracias! Veo que trabajas sobre una base de datos que ya tenías previamente creada, pero ¿cómo hago para crear una nueva base y sus tablas en JDBC?

    ResponderEliminar
    Respuestas
    1. Buenas marc;

      No se pueden crear bases de datos en un proyecto, es decir, no con java; te explico

      Mysql, por ejemplo, es un programa externo a tu programa java, al cual tu haces conexiones por medio de un driver, es decir, se comunican entre ellos y se pasan información, pero son independientes, si tu instalas tu proyecto en varios equipos, esos equipos tendrán que tener una base de datos en cada pc exactamente igual, por lo que la mejor opción, que yo utilizo, es montar un servidor apache con mysql con lo puedes instalar tu proyecto en cientos de equipos y una base de datos sirviendo a todo el mundo.

      Otra opción, seria con sqlite, crear una base de datos, estas bases de datos van en archivos que se crean sqlite, por lo que solo tendrías que agregar ese archivo a tu proyecto como un archivo normal y copiarlo en la carpeta de instalación.

      Si te decantas por mysql, busca en google "Tutorial Apache+Mysql" y si te decides por sqlite "Crear BAse de daatos Sqlite", te pondria yo mismo los links pero no se si violo la nueva ley de propiedad intelectual :S

      Un saludo.

      Eliminar
  9. Saludos Bartolomé, te hago una pregunta, mira
    He desarrollado una aplicacion de escritorio en java con conexion a una bd en mysql por medio de xampp como servidor local.

    me puedes explicar como alojar una base de datos a un servidor web donde mi aplicacion se comunica a la base de datos desde cual quier computador ??

    gracias , espero pronto alguna respuestaaaa

    ResponderEliminar
    Respuestas
    1. jajajajaja "espero pronto alguna respuesta", esas respuestas no las esperes pronto. Bueno, mira Angel Reyes, si ya montaste un servidor xampp puedes registrar un DNS de alguna compañia que se dedique como DynDns, la mayoria de los routers traen configuración para el mismo y poder configurar usuario y contraseña y tener un subdominio. habria que configurar cortafuegos del router y del computador. si no te la quieres quebrar puedes rentar un servidor que tenga instalado MySql e igual habria que configurar. te recomiendo investigar paso por paso ahorita la ventaja es que san google lo dice todo. saludos atte. Alejandro

      Eliminar
  10. Hola saludos:

    Estoy haciendo un programa que en primera instancia debo ingresar una dirección IP, el puerto y presionar un botón CONTECAR para establecer una conexión con un software de computadora llamado Hércules SETUP Utility, este debe mandar un mensaje pequeño () dando a conocer que realmente se llevo a cabo una conexión.

    Pero no se como realizar dicha conexión. La verdad no había trabajado con programas que usaran Sockets TCP/IP.

    ¿Me podría ayudar por favor?

    De antemano muchas gracias, quedo en espera de su respuesta, Saludos cordiales

    ResponderEliminar
  11. muchas gracias, esta muy claro todo y paso a paso, te lo agradezco. Saludos.

    ResponderEliminar
  12. Hola.

    Soy estudiante, y me gustaria saber la forma de realizar un metodo main, para comprobar la conexion.
    Estoy tratando de conectar mi programa Java a un hosting.
    Pero no encuentro la forma de comprobar la conexion.

    Seria de gran ayuda, que supieras como. Muchas Gracias.





    public class Conexion {

    //no se si falta el puerto :3306
    private static String servidor = "jdbc:mysql://mysql.hostinger.mx/u433066093_santa";
    private static String user = "u433066093_shaw"; //nombre del usuario
    private static String pass = "Break"; //contraseña
    private static String driver = "con.mysql.jdbs.Driver";
    private static Connection con;


    public Conexion(){

    try {

    Class.forName(driver); //Levato el driver
    con = DriverManager.getConnection(servidor, user, pass); //Establezco conexion
    JOptionPane.showMessageDialog(null, "Conexion realizada con exito");

    } catch (ClassNotFoundException | SQLException e){

    // TODO Auto-generated catch block
    JOptionPane.showMessageDialog(null, "Conexion fallida");

    }

    }

    public Connection getConnection(){
    return con; //Devuelvo el objeto con
    }

    }

    ResponderEliminar