4 Funcionamiento del JDBC¶
Introducción¶
JDBC define carias interfaces que permite realizar operaciones con base de datos. Están definidas en el paquete java.sql.
Clase e Interfaz | Descripción |
---|---|
Driver | Permite conectarse a una base de datos: cada gestor de base de datos requiere un driver distinto. |
DriverManager | Permite gestionar todos los drivers instalados en el sistema. |
DriverPropertyInfo | Proporciona diversa información acerca de un driver |
Connection | Representa una conexión con una base de datos, Una aplicación puede tener más de una conexión. |
DatabaseMetadata | Proporciona información acerca de una base de datos, como las tablas que contiene... |
Statement | Permite ejecutar sentencias SQL sin parámetros |
PreparedStatement | Permite ejecutar sentencias SQL con parámetros de entrada |
CallableStatement | Permite ejecutar sentencias SQL con parámetros de entrada y salida, como llamadas a procedimientos almacenados. |
ResultSet | Contiene las filas resultantes de ejecutar una orden SELECT. |
ResultSetMetadata | Permite obtener información sobre un ResultSet, como el número de columnas, su nombres, etc |
El trabajo con JDBC comienza con la clase DriverManager que es la encargada de establecer las conexiones con los orígenes de datos a través de los drivers JDBC. El funcionamiento es el siguiente:
- Importar las clases necesarias
- Cargar el drivers JDBC
- Identificar el origen de datos
- Crear un objeto Connection
- Crear un objeto Statement
- Ejecutar una consulta con el objeto Statement
- Recuperar los datos del objeto ResultSet
- Liberar el objeto ResultSet
- Liberar el objeto Statement
- Liberar el objeto Connection
Conexión a una BD¶
En una base de datos MySQL tenemos una base de datos llamada empresa y un usuario llamado usuario con la misma contraseña. El usuario tendrá todos los privilegios sobre esta base de datos.
create database empleados;
CREATE USER 'usuario'@'localhost' identified by 'usuario';
GRANT ALL PRIVILEGES ON empleados.* TO 'usuario'@localhost;
FLUSH PRIVILEGES;
Tenemos las siguientes tablas: empleados y departamentos con los siguientes datos:
CREATE TABLE departamentos(
dept_no TINYINT(2) NOT NULL PRIMARY KEY,
dnombre VARCHAR(15),
loc VARCHAR(15)
) ENGINE=InnoDB;
CREATE TABLE empleados(
emp_no SMALLINT(4) NOT NULL PRIMARY KEY,
apellido VARCHAR(10),
oficio VARCHAR(10),
dir SMALLINT,
fecha_alt DATE,
salario FLOAT(6,2),
comision FLOAT(6,2),
dept_no TINYINT(2) NOT NULL,
CONSTRAINT FK_DEP FOREIGN KEY (dept_no) REFERENCES departamentos(dept_no)
) ENGINE=InnoDB;
INSERT INTO departamentos VALUES
(10, 'CONTABILIDAD', 'SEVILLA'),
(20, 'INVESTIGACIÓN', 'BARCELONA'),
(30, 'VENTAS', 'BARCELONA'),
(40, 'PRODUCCIÓN', 'BILBAO');
INSERT INTO empleados VALUES
(1, 'GARCÍA', 'ANALISTA', 2, '2018-06-06', 2500, 1500, 10),
(2, 'MORENO', 'CONTABLE', 2, '2019-12-12', 1500, 100, 10),
(3, 'GOMEZ', 'DEPENDIENTE', 2, '2010-01-12', 1500, 500, 30)
En el siguiente programa mostramos el contenido de la tabla departamentos:
package com.irudev.examples.bloque_iv.tema_15;
import java.sql.*;
public class ShowDepartamentos {
public void show() {
try{
// Carga el driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Establece conexión con la BD
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/empleados", "acdat", "acdat");
// Se prepara la consulta
Statement sentence = connection.createStatement();
String sql = "SELECT * FROM departamentos";
ResultSet result = sentence.executeQuery(sql);
// Recorremos el resultado para visualizar cada filza
// Se hace un bucle mientras haya registros y se van mostrando
while(result.next()){
System.out.printf("%d, %s, %s\n", result.getInt(1), result.getString(2), result.getString(3));
}
result.close(); // Cerrar ResultSet
sentence.close(); // Cerrar Statement
connection.close(); // Cerrar conexión
} catch (ClassNotFoundException | SQLException e) {
System.out.println("Something went wrong");
}
}
public static void main(String[] args) {
new ShowDepartamentos().show();
}
}
En el método getConnection() de la clase DriverManager le pasamos como argumentos la URL de conexión a base de datos. Siendo en general: jdbc:mysql://<host>:<puerto>/<bd>
Donde:
- jdbc:mysql indica el driver JDBC para MySQL
- host indica el nombre del servidor dónde se encuentra la base de datos. Se puede poner una IP el nombre de la máquina en la que está la red. Si indicamos localhost indicamos que el servidor se encuentra en la misma máquina dónde se ejecuta el programa Java.
- puerto es el puerto predeterminado para las bases de datos MySQL, por defecto es 3306
- bd nombre de la base de datos a la que nos vamos a conectar y que debe existir en MySQL.
Se indica el nombre de usuario y la contraseña, como segundo y tercer parámetro respectivamente.
Obtener resultados de una consulta¶
Para obtener resultados de una consulta será necesario llamar al método executeQuery()
de la clase Statement
. Este método retornará un ResultSet
que contiene internamente un puntero que apunta al primer registro de la lista.
ResultSet dispone varios métodos para mover dicho puntero:
Método | Definición |
---|---|
boolean next() | Mueve el puntero del objeto ResultSet una fila hacia adelante a partir de la posición actual. Devuelve true si el puntero se posiciona correctamente y false si no hay registros en el ResultSet |
boolean first() | Mueve el puntero al primer registro de la lista. Devuelve true si se posiciona correctamente y false si no hay registros. |
boolean last() | Mueve el puntero al último registro anterior de la lista. Devuelve true si se posiciona correctamente y false si no hay registros. |
boolean previous() | Mueve el puntero al registro anterior de la lista. Devuelve true si el puntero se posiciona correctamente y false si se coloca antes del primer registro. |
void beforeFirst() | Mueve el puntero del objeto justo antes del primer registro |
int getRow() | Devuelve el número de registro actual. |