Que es JDBCJDBC (Java Database Connectivity) es un API que brinda un conjunto de interfaces y clases para acceder a cualquier motor de base de datos que lo implemente. JDBC se abstrae de los detalles específicos del motor, permitiendo así conectarse prácticamente de la misma manera a cualquier base de datos.
Las empresas, crean drivers para JDBC, para brindar una manera sencilla de conectarse a sus productos desde Java. En el caso de MySQL, este driver se llama Connector/J y está actualmente en su versión 5.1.
En este post voy a explicar como se usa JDBC con MySQL, por lo que vamos a necesitar MySQL y Connector/J. En caso de usar otro motor de base de datos, pueden leer igual el tutorial, ya que no varía demasiado.
Descarga e instalaciónDescargamos el driver de JDBC para MySQL desde el
sitio oficial de MySQL.
Lo descomprimimos y colocamos el jar en nuestra aplicación.
EjemploVeamos un ejemplo sencillo. Vamos a conectarnos a la base de datos y hacer algunas consultas sencillas.
Importamos paquete sqlimport java.sql.*;
Creamos conexiónPara conectarnos a la base de datos, tenemos que cargar el driver y crear un objeto Connection desde el DriverManager, pasándole la URL de conexión, el nombre de usuario y la contraseña de la base de datos.
Una URL de conexión tiene el siguiente formato:
jdbc:<subprotocol>://<hostname>:port/<db_name>
Que en este caso sería algo así:
jdbc:mysql://localhost:3306/my_db
Veamos un ejemplo:
Connection conexion = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_db", "my_user", "my_pass");
} catch (SQLException e) {
System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
System.out.println("Error inesperado: " + e.getMessage());
}
Si ejecutamos la aplicación ahora, debería conectarse correctamente a la base de datos (sin ninguna salida en pantalla). En caso contrario, arrojaría alguna excepción.
Hacemos algunas consultasUna vez realizada la conexión a la base de datos. Para hacer consultas tenemos que crear un objeto Statement desde el objeto Connection, de la siguiente manera:
Statement stmt = conexion.createStatement();
Y para ejecutar la consulta podemos usar alguno de los siguientes métodos del objeto Statement:
- executeQuery()
Sirve para hacer consultas que devuelven resultados (generalmente consultas SELECT). Devuelve un objeto ResultSet con el resultado. - executeUpdate()
Sirve para hacer consultas del tipo INSERT, UPDATE, DELETE que no devuelven un resultado. Este método retorna un entero con la cantidad de registros afectados.
Veamos un ejemplo con executeUpdate():
try {
Statement stmt = conexion.createStatement();
int registrosAfectados = stmt.executeUpdate("UPDATE noticias SET activo = 0 WHERE id > 100");
System.out.println("Registros afectados: " + registrosAfectados + " registros");
registrosAfectados = stmt.executeUpdate("INSERT INTO usuarios (nombre, clave) VALUES ('Homero', '123')");
System.out.println("Registros afectados: " + registrosAfectados+ " registros");
} catch (SQLException e) {
System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
System.out.println("Error inesperado: " + e.getMessage());
}
Ahora un ejemplo con executeQuery():
try {
Statement stmt = conexion.createStatement();
ResultSet resultado = stmt.executeQuery("SELECT * FROM usuarios");
while (resultado.next()) {
System.out.println("ID: " + resultado.getInt("id"));
System.out.println("Nombre: " + resultado.getString("nombre"));
System.out.println("Clave: " + resultado.getString("clave"));
}
} catch (SQLException e) {
System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
System.out.println("Error inesperado: " + e.getMessage());
}
Como podrán ver, mediante un bucle recorremos el ResultSet, obteniendo los datos de cada registro, sacando los valores de sus campos mediante los métodos getInt() y getString().
Prepared statementsSi queremos usar
prepared statements, creamos un objeto PreparedStatement desde el objeto Connection:
PreparedStatement preparedStatement = conexion.prepareStatement("UPDATE notas SET copete = ? WHERE posicion > ?");Seteamos los datos al prepared statement así:
preparedStatement.setString(1, "blabla");
preparedStatement.setInt(2, 10);
Y finalmente ejecutamos el prepared statement, en este caso con executeUpdate():
preparedStatement.executeUpdate();
Ejemplo completo:
try {
PreparedStatement preparedStatement = conexion.prepareStatement("UPDATE notas SET copete = ? WHERE posicion > ?");
preparedStatement.setString(1, "blabla");
preparedStatement.setInt(2, 10);
preparedStatement.executeUpdate();
} catch (SQLException e) {
System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
System.out.println("Error inesperado: " + e.getMessage());
}