Una Base de Datos puede ser algo tan sencillo como un sistema de llave-valor en un archivo de texto plano, como soluciones más complejas y modernas como por ejemplo las no relacionales, esto hace que el poder desarrollar diferentes esquemas de conexión sea una característica obligatoria.
Utilizando JDBC
JDBC son un conjunto de clases que permiten que Java establezca conexiones con motores de Bases de Datos, esto nos permite obtener los resultados de las consultas en un objeto llamado ResultSet.
Debido a que cada motor es diferente es probable que el ResultSet que recibamos sea particular al mismo, es por ello que no nos resulta conveniente estructurar nuestra aplicación alrededor de dicho objeto.
Para solventar este problema podemos utilizar lo que se llama un objeto de acceso, con el cual podemos gestionar las diferentes formas de nuestro ResultSet haciendo que su aplicación dentro de nuestro programa sea más sencilla de implementar y así el desarrollador tenga menos problemas.
Hacer nuestra primera conexión a través de JDBC
Lo primero que necesitamos hacer para poder construir una conexión JDBC es identificar cual es el motor al cual queremos hacer la conexión y luego conseguir las clases necesarias para dicha conexión, en este caso vamos a hacer una conexión MySQL, este motor es ligero, gratuito y multiplataforma, por lo que podremos instalarlo tanto en Windows, Linux o Mac.
Obtener el Connector/J
Connector/J es el conjunto de clases que nos ofrece el equipo de desarrollo de MySQL, con ellas podremos hacer que JDBC trabaje en conjunto con este manejador de Bases de Datos relacionales, para poder incorporarlo a nuestro proyecto debemos seguir los siguientes pasos.
1- Debemos descargar el archivo correspondiente a nuestra plataforma, ya sea Windows o para otras desde la página oficial de MySQL en el siguiente enlace.
2- En este tutorial trabajaremos bajo Windows por lo que para su implementación en nuestros ejemplos lo haremos en tiempo de ejecución para mayor facilidad, sin embargo al descargar el paquete lo instalamos para tener el mismo disponible en nuestro equipo.
3- Ahora procederemos a probar que todo funcione correctamente en nuestro equipo, para ello haremos un pequeño código donde veremos si connector/J fue cargado exitosamente en nuestro sistema, para ello utilizaremos el siguiente código:
public class PruebaConexion { public static void main(String[] args) { try { Class<?> c = Class.forName("com.mysql.jdbc.Driver"); System.out.println("Clase Cargada: " + c.getName()); } catch (ClassNotFoundException ex) { System.err.println(ex); } } }
4- Para ejecutar este ejemplo necesitamos incluir la dependencia, es recomendable que tengamos el .jar en la misma ruta de nuestro archivo PruebaConexion.java. Con esto cubierto pasaremos a compilar nuestro archivo, abrimos una consola y con la instrucción javac y agregando el .jar al classpath en tiempo de ejecución con el comando –cp lo podemos lograr, veamos la línea de comandos:
javac –cp mysql-connector-java-5.1.34-bin.jar PruebaConexion.java
5- Por último para ejecutar nuestro archivo solo necesitamos ejecutar la siguiente instrucción:
java –cp mysql-connector-java-5.1.34-bin.jar PruebaConexion
Si tenemos un resultado como el siguiente en nuestra consola ya podemos empezar a trabajar con operaciones a Bases de Datos:
Estableciendo una conexión
El próximo paso que necesitamos realizar es establecer una conexión efectiva a nuestra Base de Datos, para ello debemos crear una con al menos una tabla en nuestro servidor local, de esta forma podemos realizar algunas pruebas, para facilitar las cosas creamos una Base de Datos llamada test y utilizamos el siguiente script para crear la tabla e insertar unos registros de prueba, esto para acelerar el desarrollo del tutorial:
CREATE TABLE IF NOT EXISTS `usuarios` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nombre` varchar(255) NOT NULL,
`fecha` date NOT NULL,
`estado` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `usuarios` (`id`, `nombre`, `fecha`, `estado`) VALUES
(1, 'Usuario 1', '2015-01-01', 1),
(2, 'Usuario 2', '2015-01-01', 1);
Ahora en el siguiente código de Java nos vamos a enfocar en establecer la conexión con la Base de Datos, para ello con un bloque try catch validaremos que sea efectiva y sin errores, luego si la conexión fue establecida imprimiremos un mensaje de éxito, veamos:
import java.sql.Connection; import java.sql.DriverManager; public class PruebaConexion { private static final String ruta = "jdbc:mysql://localhost"; private static final String usuario = "nuestro usuario"; private static final String password = "nuestro password"; public static void main(String[] args) { try { Connection con = DriverManager.getConnection(ruta, usuario, password); System.out.println("Conexion exitosa"); } catch (Exception e) { e.printStackTrace(); } } }
De este código podemos notar que debemos importar dos librerías del paquete java.sql, una es Connection que se encarga de gestionar todas las actividades para poder comunicarnos con la Base de Datos y la otra es DeviceManager que se encarga de proporcionar la forma como nos comunicaremos con la misma. Si hemos seguido los pasos de manera correcta deberíamos ver el siguiente mensaje cuando ejecutamos nuestro ejemplo en la consola:
Realizando consultas
Ya tenemos todo listo para empezar a probar nuestras consultas, para ello vamos a necesitar varias cosas, la primera ya la tenemos que es el objeto que nos hace la conexión a la Base de Datos, luego vamos a necesitar importar los paquetes Statement y ResultSet con los cuales podremos en primer lugar enviar consultas y luego obtener la respuesta de la misma, finalmente recorremos el objeto ResultSet donde mostraremos los datos insertados en la tabla y antes de cerrar el programa tenemos que cerrar cada uno de los objetos que hemos creado, de esta manera garantizaremos la integridad de nuestros datos. Veamos el código que muestra lo explicado:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class PruebaConexion { private static final String ruta = "jdbc:mysql://localhost/test"; private static final String usuario = "nuestro usuario"; private static final String password = "nuestro password"; public static void main(String[] args) { try { Connection con = DriverManager.getConnection(ruta, usuario, password); Statement consulta = con.createStatement(); System.out.println("Conexion exitosa"); ResultSet resultado = consulta.executeQuery("SELECT * FROM usuarios"); while (resultado.next()) { String nombre = resultado.getString("nombre"); String fecha = resultado.getString("fecha"); System.out.println("Nombre: " + nombre + " Fecha Registro:" +fecha); } resultado.close(); consulta.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }
Es importante mencionar que en nuestra atributo ruta lo hemos modificado y se ha agregado luego del localhost el nombre de la Base de Datos llamada test donde debemos tener nuestra tabla usuarios creada, compilamos nuestro archivo y ejecutamos, el resultado por consola sería como se ve en la siguiente imagen:
Los Prepared Statements
Habiendo observado el ejemplo de la conexión y las consultas a la Base de Datos, podemos notar que tenemos que utilizar una figura llamada Prepare Statement que nos facilita el trabajo al dejar consultas preparadas de manera que podamos ejecutarlas múltiples veces sin tener que construirlas una y otra vez, para lograr esta dinámica sustituimos los valores que necesitamos cambiar por variables y luego al ejecutar la consulta le pasamos los valores reales que vamos a utilizar.
En el siguiente ejemplo vamos a crear una consulta con Prepared Statement, de forma que esta pueda ser utilizada varias veces durante nuestro programa. Veamos el código resultante:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.PreparedStatement; public class PreparedStatementPrueba { private static final String ruta = "jdbc:mysql://localhost/test"; private static final String usuario = "nuestro usuario"; private static final String password = "nuestro password"; public static void main(String[] args) { try { Connection con = DriverManager.getConnection(ruta, usuario, password); PreparedStatement consulta = con.prepareStatement("SELECT * FROM usuarios Where id = ?;"); System.out.println("Conexion exitosa"); consulta.setInt(1, 1); ResultSet resultado = consulta.executeQuery(); while (resultado.next()) { String nombre = resultado.getString("nombre"); String fecha = resultado.getString("fecha"); System.out.println("Nombre: " + nombre + " Fecha Registro:" +fecha); } resultado.close(); consulta.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }
Notamos que utilizando el método setInt con el objeto consulta es que podemos pasar el parámetro necesario para la consulta, con ello podemos desligar el mismo de la ejecución del query ganando así en portabilidad y facilidad de lectura. Para finalizar, compilamos y ejecutamos nuestro programa:
Con esto finalizamos este tutorial, como vemos las opciones para trabajar con Bases de Datos en Java son muy interesantes ya que nos permiten incorporar flexibilidad y versatilidad en nuestras aplicaciones, lo más importante es que si tenemos experiencia con otros lenguajes seguramente acá podrá ser aprovechada.