martes, 22 de septiembre de 2015

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.


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();

No hay comentarios:

Publicar un comentario