Teoría Tema 8. Gestión de Bases de Datos Relacionales - Comp
Teoría Tema 8. Gestión de Bases de Datos Relacionales - Comp
Teoría Tema 8. Gestión de Bases de Datos Relacionales - Comp
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
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.
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.*.
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.
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.
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:
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();
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());
}
}
}
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.
package basedatos;
import java.sql.*;
public class BaseDatos{
public static void main(String[] args) {
Connection conexion = null;
try {
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:
Ejemplo:
Statement sentencia = miConexion.createStatement();
Por Ejemplo:
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:
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);
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.
conexion.setAutoCommit(false);
Ejemplo:
Fichero banco.sql
CREATE DATABASE bancos;