Teoría Tema 8. Gestión de Bases de Datos Relacionales - Comp

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

TEMA 8. GESTIÓN DE BASES DE DATOS RELACIONALES.

Objetivos

 Comprender la arquitecturaJDBC.
 Crear aplicaciones que almacenen o recuperen datos de una base dedatos.
 Manejar excepciones creadas por las llamadas a métodos JDBC(SQLExceptions).
 Realizar operaciones básicas sobre las bases de datos (insertar, modificar y borrar
datos).
 Realizar operaciones avanzadas sobre bases de datos como llamadas a procedimientos
almacenados, ejecución de transacciones,etc.

Contenidos

8.1.- ¿Qué es JDBC?


Java tiene una librería la cual permite interactuar con fuentes de datos (incluidas bases de
datos) de tal manera que podemos: Conectarnos a una fuente de datos, enviar consultas a la
base de datos y recuperar datos de una consulta y manejarlos.

JDBC son las siglas de Java DataBase Connectivity y es un driver que permite conectar a la base
de datos y manipular los datos utilizando SQL.

El cliente accede directamente a los datos a través del driver JDBC. Los comandos son enviados
a la base de datos y los resultados son devueltos a la aplicación cliente. Es una configuración
cliente/servidor donde la máquina del usuario que corre la aplicación Java es el cliente y el
servidor es donde reside la base de datos. Servidor y cliente pueden estar en máquinas
diferentes en la misma red local o a través de Internet.

Para trabajar con JDBC se necesitará:


 Establecer la conexión con la Base dedatos.
 Crear un objetoStatement.
 Ejecutar la sentenciaSQL.
 Leer el resultset o resultado de laconsulta.

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 1


RELACIONALES
8.1.- Conexión con la base de datos
JDBC se conecta a las bases de datos utilizando la clase DriverManager que es la forma más
sencilla de conectarse a una base de datos.

La conexión con la base de datos se realiza especificando una dirección URL o cadena de
conexión y se realiza por medio de una instancia de tipo Connection e importando java.sql.*.

Las partes de la cadena de conexión son:

driver:ProtocoloDriver:DetalleConexion

Ejemplo:

jdbc:mysql://localhost:3306/videoclub

Podemos establecer la conexión a la base de datos utilizando una instancia de tipo Connection
y pasándole al método getConnection la cadena de conexión o URL, el usuario y la contraseña.

Connection miConexion =
DriverManager.getConnection("jdbc:mysql://localhost:3306/videoclub",
"root","");

Cuando JDBC encuentra un error al trabajar con una base de datos lanza una SQLException y el
método SQLException.getMessage nos devuelve una cadena con el error producido. Por tanto,
la conexión debe tratarse dentro de un bloque try-catch que maneje las excepciones que se
puedan producir como por ejemplo que no se encuentre el driver de conexión, que el servidor
de base de datos no esté activo, que la cadena de conexión sea errónea, que la base de datos
no exista, que el usuario o contraseña no sean correctos, …

Ejemplo:

try {

Connection miConexion =
DriverManager.getConnection("jdbc:mysql://localhost:3306/videoclub",
"root", "");
System.out.println("Conexión establecida con éxito!!!");
} catch (SQLException e) {
System.out.println(e.getMessage());
}

Para poder establecer la conexión de forma satisfactoria de debemos de añadir el driver JDBC
correspondiente a la base de datos que queremos manejar, en este caso el driver mysql. Para
ello, pulsaremos botón derecho sobre la carpeta Bibliotecas del proyecto Netbeans y
pulsaremos la opción Añadir Biblioteca.

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 2


RELACIONALES
Seleccionaremos la librería "Driver MYSQL JDBC" y pulsaremos el botón "Add Library".

Además, el servidor de base de datos debe estar activo. En el desarrollo del tema se utilizará
una base de datos MySQL, por lo que debemos tener activo el servidor instalando por ejemplo
el paquete de software que proporciona XAMPP o WAMP.

La gestión de la base de datos la podemos realizar a través de un navegador accediendo a la


url: http://localhost/phpmyadmin

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 3


RELACIONALES
8.2.- Crear y ejecutar sentencia de consulta SQL
La clase Statemnet se utiliza para crear y ejecutar sentencias SQL. Un objeto de la clase
Statement se crea mediante el método createStatement del objeto Connection.

Ejemplo:
Statement sentencia = miConexion.createStatement();

Una vez creada la instancia del tipo Statement podemos ejecutar una sentencia de consulta
SQL con el método executeQuery. El resultado de la sentencia de consulta SQL se devuelve en
un objeto del tipo ResultSet que es una tabla virtual.

Ejemplo:

ResultSet resultado = sentencia.executeQuery("SELECT * FROM PELICULAS");

El acceso a los datos almacenados en el Resultset se realiza mediante un puntero a una zona
de memoria donde residen los datos recuperados por la sentenciaSQL.

Inicialmente se coloca en una posición anterior a la primera posición de los datos recuperados
y mediante la llamada al método next() vamos posicionándonos en la siguiente fila de los datos
recuperados.

Podemos recorrer todos los datos obtenidos como resultado con un bucle. Al final del bucle
cuando ya no existen más datos el método next() devuelve false.

while (resultado.next()) {
String codpelicula = resultado.getString("codpelicula");
String titulo =resultado.getString("titulo");
String tema = resultado.getString("tema");
int duracion = resultado.getInt("duracion");
double precio =resultado.getDouble("precio");
System.out.println("Codigo Pelicula: "+codpelicula);
System.out.println("Título: "+titulo);
System.out.println("Tema: "+tema);
System.out.println("Duración: "+duracion);
System.out.println("Precio: "+precio);
System.out.println("Precio con IVA: "+precio*1.21);
System.out.println("******************************");
}

Debemos cerrar la conexión con la base de datos mediante este comando close().

Ejemplo:

miConexion.close();

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 4


RELACIONALES
8.3.- Devolver el número de registros de una tabla.
package basedatosvideoclub;
import java.sql.*;
public class BaseDatosVideoclub {
public static void main(String[] args) {

try {
Connection miConexion =

DriverManager.getConnection("jdbc:mysql://localhost:3306/videoclub",
"root", "");
System.out.println("La conexión se ha establecido!!!");
Statement sentencia = miConexion.createStatement();
ResultSet resultado = sentencia.executeQuery("SELECT * FROM
PELICULAS");
if (resultado.last()){
System.out.println("Cantidad de Registros:" +
resultado.getRow());
} else{
System.out.println("No Hay Registros ");
}
miConexion.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}

8.4.- Crear una tabla en la Base de Datos.


La clase Statemnet se utiliza para crear y ejecutar sentencias SQL. Un objeto de la clase
Statement se crea mediante el método createStatement del objeto Connection.

Ejemplo:
Statement sentencia = miConexion.createStatement();

Una vez creada la instancia del tipo Statement podemos ejecutar una sentencia de creación de
tabla SQL con el método executeUpdate.

Ejemplo: Tendremos creada de antemano la Base de Datos Empresa

package basedatos;
import java.sql.*;
public class BaseDatos{
public static void main(String[] args) {
Connection conexion = null;
try {

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 5


RELACIONALES
conexion =
DriverManager.getConnection("jdbc:mysql://localhost:3306/empresa","root","");
System.out.println("Conexión Establecida!");
}catch (SQLException e) {
System.out.println("Error: "+e.getMessage());
}
String sentencia = "create table empresa.empleados (id_empleado
integer NOT NULL,"
+ "nombre varchar(40) NOT NULL, "
+ "apellidos varchar(40) NOT NULL,"
+ "poblacion varchar(20) NOT NULL,"
+ "codpostal varchar(5) NOT NULL, "
+ "sueldo decimal(8,2) NOT NULL, "
+ "PRIMARY KEY (id_empleado))";
Statement stmt = null;
try {
stmt = conexion.createStatement();
stmt.executeUpdate(sentencia);
conexion.close();
} catch (SQLException e) {
System.out.println("Error: "+e.getMessage());
}
}
}

8.5.- Insertar registros en la Base de Datos.


La clase Statemnet se utiliza para crear y ejecutar sentencias SQL. Un objeto de la clase
Statement se crea mediante el método createStatement del objeto Connection.

Ejemplo:
Statement sentencia = miConexion.createStatement();

Una vez creada la instancia del tipo Statement podemos ejecutar una sentencia de inserción
SQL con el método executeUpdate.

Por Ejemplo:

sentencia.executeUpdate("INSERT INTO PELICULAS VALUES (5000,'La forma


del agua','drama',145,3)");

8.6.- Modificar registros en la Base de Datos.


La clase Statemnet se utiliza para crear y ejecutar sentencias SQL. Un objeto de la clase
Statement se crea mediante el método createStatement del objeto Connection.

Ejemplo:
Statement sentencia = miConexion.createStatement();

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 6


RELACIONALES
Una vez creada la instancia del tipo Statement podemos ejecutar una sentencia de
actualización SQL con el método executeUpdate.

Por Ejemplo:

sentencia.executeUpdate("UPDATE PELICULAS SET PRECIO = 2.00 WHERE


CODPELICULA=5000");

8.7.- Eliminar registros en la Base de Datos.


La clase Statemnet se utiliza para crear y ejecutar sentencias SQL. Un objeto de la clase
Statement se crea mediante el método createStatement del objeto Connection.

Ejemplo:
Statement sentencia = miConexion.createStatement();

Una vez creada la instancia del tipo Statement podemos ejecutar una sentencia de eliminación
SQL con el método executeUpdate.

Por Ejemplo:

sentencia.executeUpdate("DELETE FROM PELICULAS WHERE CODPELICULA=5000");

8.8.- Consultas Preparadas.


Las sentencias preparadas son consultas que permiten la parametrización, es decir son
consultas en las que los valores de los campos de la clausula where pueden variar, indicando
las posiciones de los datos que van a cambiar. Los parámetros se especifican con el carácter?.

La clase PreparedStatemnet se utiliza para crear y ejecutar consultas preparadas. Un objeto de


la clase PreparedStatement se crea mediante el método prepareStatement del objeto
Connection, utilizando ? para el parámetro de la consulta.

Ejemplo:
PreparedStatement sentencia =
miConexion.prepareStatement("SELECT * FROM PELICULAS WHERE TEMA=?
AND PRECIO > ?");

Una vez creada la instancia del tipo PreparedStatement, debemos indicar cuál es el valor para
cada uno de los parámetros de la consulta. Para ello, utilizaremos el método
setString(númeroParametro, valor).

Ejemplo:

sentencia.setString(1, "Drama");
sentencia.setString(2, 3);

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 7


RELACIONALES
Por último podemos ejecutar una sentencia con una consulta preparada con el método
executeQuery. El resultado de la sentencia de consulta SQL se devuelve en un objeto del tipo
ResultSet que es una tabla virtual.

Ejemplo:
ResultSet resultado = sentencia.executeQuery();

El acceso a los datos almacenados en el Resultset se realiza mediante un puntero a una zona
de memoria donde residen los datos recuperados por la sentenciaSQL.
Inicialmente se coloca en una posición anterior a la primera posición de los datos recuperados
y mediante la llamada al método next() vamos posicionándonos en la siguiente fila de los datos
recuperados.

Podemos recorrer todos los datos obtenidos como resultado con un bucle. Al final del bucle
cuando ya no existen más datos el método next() devuelve false.

while (resultado.next()) {
String codpelicula =resultado.getString("codpelicula");
String titulo =resultado.getString("titulo");
String tema = resultado.getString("tema");
Integer duracion = resultado.getInt("duracion");
Double precio =resultado.getDouble("precio");
System.out.println(codpelicula+" - "+titulo+" - "+tema+" -
"+duracion+" - "+precio+" - "+precio*1.21);
}

8.9.- Transacciones.
En ocasiones se necesita que las operaciones se ejecuten en bloque, es decir, necesitamos que
se ejecuten o todas las operaciones o ninguna porque si no la base de datos se quedará en un
estado inconsistente.

Por ejemplo, imaginemos una transferencia de dinero entre dos cuentas bancarias. La primera
operación es restar de la cuenta A la cantidad a transferir para luego ingresarla en la cuenta B.
En el caso de que haya algún problema para actualizar el saldo de la cuenta B y esta operación
no se realice, nos podemos encontrar con que en la cuenta A se ha retirado una cantidad de
dinero y en la cuenta B no se ha hecho efectiva la transferencia. La base de datos en ese
momento se quedaría inconsistente.

Cuando se realiza una operación de modificación de base de datos (borrado, inserción o


actualización) los cambios se producen cuando la sentencia se ejecuta. No hace falta ejecutar
una orden para actualizar cambios en la base de datos. Esto es así porque está habilitado el
modo auto-commit en la conexión con la base de datos. Para deshabilitar el modo auto-
commit en la base de datos hay que ejecutar la siguiente sentencia:

conexion.setAutoCommit(false);

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 8


RELACIONALES
El método rollback generalmente se utiliza cuando se lanza una excepción. En el momento que
se lanza la excepción esto nos indica que algo ha pasado pero nunca nos va a decir qué datos
se han modificado y cuáles no. Por lo tanto el rollback deshace todos los cambios hechos hasta
el momento desde el último COMMIT, anulando los pasos realizados en la transacción que ha
producido elerror.

Ejemplo:
Fichero banco.sql
CREATE DATABASE bancos;

CREATE TABLE cuentas (


NUMCUENTA int(11) NOT NULL,
NOMBRE varchar(30) NOT NULL,
SALDO decimal(10,2) NOT NULL,
PRIMARY KEY (NUMCUENTA));

INSERT INTO cuentas (NUMCUENTA, NOMBRE, SALDO) VALUES


(1, 'Luis', '1500.00'),
(2, 'Pedro', '1800.00');

Proyecto Java: Transaccion


package transaccion;
import java.sql.*;
public class Transaccion {
public static void main(String[] args) {
// Definimos una variable del tipo conexión
Connectionconexion;
try {
// Establecemos una conexión a la base de datos banco de mysql
conexion =
DriverManager.getConnection("jdbc:mysql://localhost:3306/banco","root","");

//Ejecutamos una transacción entre las cuentas 1 y 2 por 500€ en


la base de datos banco.
transaccion(conexion,"banco",1,2,500);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

static void transaccion(Connection conexion, String BDNombre,int


cuentaA,int cuentaB,int cantidad) throws SQLException {
// Declaramos una instancia del tipo Statement para crear las
consultas
Statement sentencia = null;
// Creamos dos variables que almacenarán los registros afectados por
las actualizaciones
int consultaA;
int consultaB;
// Creamos las sentencias

PROGRAMACIÓN - CICLO FORMATIVO DAM/DAW - TEMA 8. GESTIÓN DE BASES DE DATOS 9


RELACIONALES
String actualizaA = "update " + BDNombre + ".CUENTAS " +"set SALDO =
SALDO - "+cantidad+" where NUMCUENTA ="+cuentaA;
String actualizaB = "update " + BDNombre + ".CUENTAS " +"set SALDO =
SALDO + "+cantidad+" where NUMCUENTA ="+cuentaB;
try {
// Desactivamos el autoCommit para que no se realicen los cambios
en la base de datos hasta que no seactive
conexion.setAutoCommit(false);
// Creamos la sentencia
sentencia = conexion.createStatement();
// Ejecutamos las consultas
consultaA = sentencia.executeUpdate(actualizaA);
consultaB = sentencia.executeUpdate(actualizaB);
// Si alguna de las actualizaciones no devuelve registros se
lanza una excepción
if ((consultaA == 0)||(consultaB == 0)){
throw new ExcepcionActualizacion();
}
} catch (ExcepcionActualizacion e ) {
// La excepción indica que se hace un Rollback
System.out.print("Rollback de la Transaccion");
// Realizamos el Rockball deshaciendo las sentencias del bloque
de la transacción
// realizadas hasta el momento.
conexion.rollback();
} finally {
// Activamos el autoCommit
conexion.setAutoCommit(true);
// Cerramos la conexión a la base de datos
conexion.close();
}
}
}

class ExcepcionActualizacion extends Exception {


public ExcepcionActualizacion() {
// Muestra el mensaje que ha habido un error
System.out.println("Error. Se anulará la transacción");
}
}

PROGRAMACIÓN - CICLO FORMATIVO DAW - TEMA 8. GESTIÓN DE BASES DE DATOS RELACIONALES 10

También podría gustarte