Conectando una aplicación Java con una base de datos MySQL

(In English / En Inglés: https://josemmsimo.wordpress.com/2012/08/03/connecting-a-java-application-with-a-mysql-database/)

Todo programador que se precie ha de saber manejarse mínimamente con las bases de datos. Este es, en mi caso, uno de los aspectos más “bonitos” de la programación, ya que es donde manejas lo que en el fondo es más importante: la información. La forma de representarla es infinita, y la forma de acceder y administrar dicha información también lo es. No voy a explicar demasiados detalles al respecto, pero en bases de datos grandes (con millones de registros), es sumamente importante que la base de datos esté bien diseñada.

Para la realización de esta pequeña práctica me baso en lo que yo ya tengo instalado en el sistema:

–          WAMP (Windows + Apache + MySQL + PHP), aunque sería XAMP si estuviese en entorno GNU/Linux u otro en otros sistemas… En fin, es MySQL lo que nos interesa.

–          Eclipse para escribir el programa en Java.

–          JDK y otros elementos básicos de Java.

En primer lugar, especifico como quiero que sea mi base de datos. Su nombre será “agenda”, y contendrá una sola tabla a la que llamaré “personal”. La tabla que creará tendrá: identificador, nombre, apellidos, teléfono y e-mail (más fácil e intuitiva imposible). Antes de crear dicha tabla, se comprobará si existe la misma para eliminarla y así evitar problemillas. En las pruebas también se crean un total de 4 registros, y a continuación se muestran por pantalla.

Centrándonos en la parte de Java, para hacer uso de la base de datos tendremos que importar el paquete “java.sql”.

Si nunca hemos realizado una conexión desde Java a la base de datos, es probable que no tengamos el driver instalado. Este driver nos permite la conexión, y puede ser descargado desde aquí: http://dev.mysql.com/downloads/connector/j/  Tendremos 3 opciones para utilizarlo:

–          Poniéndolo en $JAVA_HOME/lib/ext/ y así será accesible por defecto para siempre. Esta opción no es aconsejable, puesto que este jar estará disponible para todas las aplicaciones que corramos en el ordenador, lo necesiten o no. Si no somos cuidadosos, podemos tener conflictos entre distintas versiones o con otros jar que pongamos que ahí.

–          Poniéndolo en el CLASSPATH.

–          Añadiéndolo a nuestro proyecto del IDE que usemos (por ejemplo eclipse).

No explicaré esto porque hay muchas páginas que indican como hacerlo, aunque si tenéis alguna duda podéis consultarla por aquí y os responderé.

Respecto al código fuente, es bastante intuitivo. La versión larga, en la que se dividen los pasos en pequeños métodos para hacer más comprobaciones, puede resultar algo pesada. Si preferís algo más “light”, tenéis una segunda versión más “ligera” algo más abajo.

Versión “pesada”:

import java.sql.*;

public class conectarMostrar {
	private static Connection conexion = null;
	private static String bd = "agenda"; // Nombre de BD.
	private static String user = "root"; // Usuario de BD.
	private static String password = ""; // Password de BD.
	// Driver para MySQL en este caso.
	private static String driver = "com.mysql.jdbc.Driver";
	// Ruta del servidor.
	private static String server = "jdbc:mysql://localhost/" + bd;

	public static void main(String[] args) throws SQLException {

		System.out.println("INICIO DE EJECUCIÓN.");
		conectar();
		Statement st = conexion();

		// Se elimina la tabla "personal" en caso de existir.
		String cadena = "DROP TABLE IF EXISTS personal;";
		consultaActualiza(st, cadena);

		// Se crea la tabla "personal"
		cadena = "CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`))";
		consultaActualiza(st, cadena);

		// Se crean datos de prueba para utilizarlos en la tabla "personal"
		cadena = "INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');";
		consultaActualiza(st, cadena);

		// Se sacan los datos de la tabla personal
		cadena = "SELECT * FROM personal;";
		ResultSet rs = consultaQuery(st, cadena);
		if (rs != null) {
			System.out.println("El listado de persona es el siguiente:");

			while (rs.next()) {
				System.out.println("  ID: " + rs.getObject("Identificador"));
				System.out.println("  Nombre completo: "
						+ rs.getObject("Nombre") + " "
						+ rs.getObject("Apellidos"));

				System.out.println("  Contacto: " + rs.getObject("Telefono")
						+ " " + rs.getObject("Email"));

				System.out.println("- ");
			}
			cerrar(rs);
		}
		cerrar(st);
		System.out.println("FIN DE EJECUCIÓN.");
	}

	/**
	 * Método neecesario para conectarse al Driver y poder usar MySQL.
	 */
	public static void conectar() {
		try {
			Class.forName(driver);
			conexion = DriverManager.getConnection(server, user, password);
		} catch (Exception e) {
			System.out.println("Error: Imposible realizar la conexion a BD.");
			e.printStackTrace();
		}
	}

	/**
	 * Método para establecer la conexión con la base de datos.
	 *
	 * @return
	 */
	private static Statement conexion() {
		Statement st = null;
		try {
			st = conexion.createStatement();
		} catch (SQLException e) {
			System.out.println("Error: Conexión incorrecta.");
			e.printStackTrace();
		}
		return st;
	}

	/**
	 * Método para realizar consultas del tipo: SELECT * FROM tabla WHERE..."
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static ResultSet consultaQuery(Statement st, String cadena) {
		ResultSet rs = null;
		try {
			rs = st.executeQuery(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para realizar consultas de actualización, creación o eliminación.
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static int consultaActualiza(Statement st, String cadena) {
		int rs = -1;
		try {
			rs = st.executeUpdate(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para cerrar la consula
	 *
	 * @param rs
	 */
	private static void cerrar(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la consulta.");
			}
		}
	}

	/**
	 * Método para cerrar la conexión.
	 *
	 * @param st
	 */
	private static void cerrar(java.sql.Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la conexión.");
			}
		}
	}
}

Versión “corta”, en la que he puesto dos catch para tener un mínimo de control ante fallos:


import java.sql.*;

public class conectarMostrar2 {
	public static void main(String[] args) throws SQLException {
		System.out.println("INICIO DE EJECUCIÓN.");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "");
			Statement st = conexion.createStatement();
			st.executeUpdate("DROP TABLE IF EXISTS personal;");
			st.executeUpdate("CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`));");
			st.executeUpdate("INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');");
			ResultSet rs = st.executeQuery("SELECT * FROM personal;");

			if (rs != null) {
				System.out.println("El listado de persona es el siguiente:");

				while (rs.next()) {
					System.out.println("  ID: " + rs.getObject("Identificador"));
					System.out.println("  Nombre completo: " + rs.getObject("Nombre") + " "	+ rs.getObject("Apellidos"));
					System.out.println("  Contacto: " + rs.getObject("Telefono") + " " + rs.getObject("Email"));
					System.out.println("- ");
				}
				rs.close();
			}
			st.close();

		}
		catch(SQLException s)
		{
			System.out.println("Error: SQL.");
			System.out.println("SQLException: " + s.getMessage());
		}
		catch(Exception s)
		{
			System.out.println("Error: Varios.");
			System.out.println("SQLException: " + s.getMessage());
		}
		System.out.println("FIN DE EJECUCIÓN.");
	}
}

Si no os funciona, los posibles motivos son muy diversos, normalmente despistes.
Consejo: Prueba a seguir los pasos, busca en internet soluciones, y como última opción consulta por aquí :-)

Leave a comment

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s