Programación

1º DAM - Curso 2021-2022

User Tools

Site Tools


apuntes:bbdd

Bases de Datos

El lenguaje SQL

El lenguaje SQL (Structured Query Language) es el lenguaje que se emplea para comunicarse con las Bases de Datos Relacionales.

Las operaciones más comunes son las que se conoce como DML (Data Manipulation Language), que son las instrucciones que permiten manipular la información, y dentro de ellas, la operación más compleja y utilizada con diferencia, es la instrucción de consulta o visualización de datos. Echaremos un vistazo a estas sentencias para hacer que las aplicaciones Java se puedan comunicar con la Base de Datos para registrar, modificar, eliminar y visualizar información.

Para el momento inicial, el de crear la Base de Datos vacía, que sirva como soporte para los datos, utilizaremos una aplicación como SQLiteBrowser que nos permitirá, de una forma visual, crear dichas estructuras.

Registrar información

La sentencia de inserción INSERT permite registrar nueva información en la base de datos. Se puede utilizar para registrar una o varias filas de datos en una sola ejecución.

INSERT INTO nombre_tabla [ '('columnas')' ] 
{ VALUES '(' { valores } ')',} | consulta

Veamos algunos ejemplos:

Registra un producto en la base de datos

INSERT INTO productos (nombre, precio) VALUES ('Galletas', 10.45)

Registra un par de productos en la base de datos

INSERT INTO productos (nombre, precio) VALUES ('Galletas', 10.45), ('Aceite', 5)

Modificar información

La sentencia para modificar datos UPDATE permite modificar uno o varios campos de una o varias filas en una sola ejecución, siempre dependiendo de los campos que se indiquen en la claúsula SET y las condiciones en la claúsula WHERE. Las primeras indican los valores que serán asignados a una serie de columnas y las segundas indicarán las condiciones que cumplen las filas que se van a modificar.

Hay que tener en cuenta que la claúsula WHERE es opcional y que, si no es especifica, la operación de modificación afectará a todas las filas de la tabla.

UPDATE nombre_tabla
SET columna = valor [ {, columna = valor} ]
[ WHERE condiciones ]

Así, en el siguiente ejemplo, si no se especificará en la claúsula WHERE el producto al que se quiere subir el precio, se subiría el precio a todos los productos registrados en la Base de Datos.

Veamos algunos ejemplos:

Modifica el precio de un producto para aumentarlo

UPDATE productos
SET precio = precio + 10
WHERE nombre = 'Galletas'

Modifica directamente el precio sobrescribiéndolo

UPDATE productos
SET precio = 4.5
WHERE nombre = 'Galletas'

Modifica el precio de varios productos

UPDATE productos
SET precio = precio * 1.25
WHERE precio BETWEEN 1 AND 5

Eliminar información

La sentencia para eliminar información DELETE permite eliminar filas completas de la tabla.

Hay que tener en cuenta que, de forma similar a como ocurre con la sentencia UPDATE, la claúsula WHERE es opcional. En este caso, si no se especifica, una sentencia DELETE eliminará todas las filas de una tabla.

DELETE FROM nombre_tabla
[ WHERE condiciones ]

Veamos algunos ejemplos:

Elimina el producto que se llama 'Galletas'

DELETE FROM productos
WHERE nombre = 'Galletas'

Elimina los productos cuyo precio es menor que 10

DELETE FROM productos
WHERE precio < 10

Elimina los productos 'Galletas' y 'Aceite'

DELETE FROM productos
WHERE nombre = 'Galletas' OR nombre = 'Aceite'

Elimina todos los productos

DELETE FROM productos

Consultar/Visualizar información

La sentencia más compleja y utilizada es SELECT puesto que es la instrucción que permite visualizar la información de la Base de Datos, combinándola de todas las formas posibles con otros registros de otras tablas para extraer la información y poder aprovecharla lo máximo posible.

Veremos una versión reducida de dicha sentencia, donde podremos especificar que campos visualizar con la claúsula SELECT, y con las claúsulas WHERE y ORDER podremos indicar qué filas queremos ver y cómo ordenarlas al visualizarlas en pantalla.

Al igual que ocurre con UPDATE y DELETE, la claúsula WHERE es opcional. En caso de que no se especifique, se visualizarán todas las filas de la tabla (mostrándose solamente los campos especificados con la claúsula SELECT).

SELECT columnas
FROM tablas
[ WHERE condiciones ]
[ ORDER BY columnas_a_ordenar [ASC|DESC] ]

Veamos algunos ejemplos:

Muestra el nombre y el precio de todos los productos cuyo precio es mayor que 5. Muestra los resultados ordenados por el nombre del producto en orden ascendente

SELECT nombre, precio
FROM productos
WHERE precio > 5
ORDER BY nombre ASC

Muestra el nombre de todos los productos. Muestra los resultados en el orden en que se hayan insertado en la tabla

SELECT nombre
FROM productos

Muestra el nombre y precio de los productos 'Galletas' y que el precio sea de 10 euros

SELECT nombre, precio
FROM productos
WHERE precio = 10 AND nombre = 'Galletas'

Muestra todos los campos de todos los productos

SELECT *
FROM productos

Acceso a una base de datos desde Java y JDBC

El acceso a Bases de Datos desde Java se hace utilizando lo que se conoce como el driver de JDBC, que es la API de Java que ofrece toda una serie de Clases y sus métodos para operar con Bases de Datos.

Java define la API para JDBC y tiene que ser cada fabricante quien defina la implementación o driver, que será el fichero que debemos incluir a nuestro proyecto para que éste pueda conectarse a un SGBD (Sistema Gestor de Bases de Datos) concreto y comunicarse con él mediante lenguaje SQL.

En nuestro caso, vamos a trabajar con SQLite, que es un SGBD Relacional muy ligero, utilizando en pequeñas aplicaciones (y también presente, de serie, en todos los terminales Android para dar soporte de base de datos a sus aplicaciones y a las desarrolladas por otros). No es un SGBD de alto rendimiento pero es más que suficiente para realizar aplicaciones con Bases de Datos de unos cuantos cientos de MB.

Para comenzar a trabajar con SQLite, lo primero es descargar el driver JDBC para SQLite e incluirlo al proyecto con ayuda del IDE. Lo añadiremos al Classpath para que Java pueda utilizar las clases implementadas en él cuando nos conectemos y comuniquemos con la Base de Datos. De forma muy similar a como hace nuestro Sistema Operativo para comunicarse con los periféricos utilizando los Drivers.

Conectar con una base de datos SQLite y registrar datos

Para conectar con una Base de Datos, en este caso de SQLite, sólo hay que cargar el driver e indicar la ubicación de la misma.

El siguiente ejemplo sirve como ejemplo de conexión y de comprobación de que el driver está bien cargado y todo funciona correctamente. La conexión queda establecida sobre el objecto conexion, que servirá como enlace entre la aplicación y la Base de Datos con ayuda del objeto PreparedStatement que veremos a continuación.

. . .
try {
    System.out.println("Prueba de conexión");
    Class.forName("org.sqlite.JDBC");
 
    Connection conexion = null;
    connexion = DriverManager.getConnection("jdbc:sqlite:productos.db");
    System.out.println("Conexión establecida con éxito");
 
    // Aqui se podría realizar cualquier operación sobre la 
    // Base de Datos (INSERT, UPDATE, DELETE, SELECT)
 
    if (connexion!= null)
        connexion.close();
    System.out.println("Desconexión correcta");
} catch (ClassNotFoundException cnfe) {
    System.out.println("Error. No se ha podido cargar el driver");
    cnfe.printStackTrace();
} catch (SQLException sqle) {
    System.out.println("Error. Se ha producido algún error al establecer la conexión");
    sqle.printStackTrace();
}

PreparedStatement

PreparedStatement es la clase Java de la API de JDBC que se utiliza para ejecutar cualquier sentencia SQL sobre una Base de Datos. Se encarga de ejecutar el código SQL sobre la conexión establecida y de obtener los resultados de dicha ejecución, si son necesarios.

. . .
// Se solicitan los datos al usuario
String nombre = . . .;
float precio = . . .;
. . .
// Se introducen en la Base de datos
sql = "INSERT INTO productos (nombre, precio) VALUES (?, ?)";
PreparedStatement sentencia = conexion.prepareStatement(sql);
sentencia.setString(1, nombre);
sentencia.setFloat(2, precio);
sentencia.executeUpdate();
. . .

Registro de información

. . .
// Se solicitan los datos al usuario
String nombre = . . .;
float precio = . . .;
. . .
// Se introducen en la Base de datos
sql = "INSERT INTO productos (nombre, precio) VALUES (?, ?)";
PreparedStatement sentencia = conexion.prepareStatement(sql);
sentencia.setString(1, nombre);
sentencia.setFloat(2, precio);
// Devuelve el número de filas registradas
int filasAfectadas = sentencia.executeUpdate();
sentencia.close();
. . .

Modificar información

. . .
// Se solicitan los datos al usuario
String nombre = . . .;
float nuevoPrecio = . . .;
. . .
// Se modifica el campo del producto seleccionado
sql = "UPDATE productos SET precio = ? WHERE nombre = ?";
PreparedStatement sentencia = conexion.prepareStatement(sql);
sentencia.setFloat(1, nuevoPrecio);
sentencia.setString(2, nombre);
// Devuelve el número de filas modificadas
int filasAfectadas = sentencia.executeUpdate();
sentencia.close();
. . .

Eliminar información

. . .
// Se solicitan los datos al usuario
String nombre = . . .;
. . .
// Se eliminan los productos que cumplen la condición
sql = "DELETE FROM productos WHERE precio = ?";
PreparedStatement sentencia = conexion.prepareStatement(sql);
sentencia.setInt(1, precio);
// Devuelve el número de filas eliminadas
int filasAfectadas = sentencia.executeUpdate();
sentencia.close();
. . .

Consulta de información

. . .
sql = "SELECT nombre, precio FROM productos";
PreparedStatement sentencia = conexion.prepareStatement(sql);
// Devuelve un cursor con todas las filas
ResultSet resultado = sentencia.executeQuery();
// Se recorren todas las filas una a una
while (resultado.next()) {
    String nombre = resultado.getString(1);
    float precio = resultado.getFloat(2);
    System.out.println("PRODUCTO: " + nombre + ", PRECIO: " + precio);
}
sentencia.close();
. . .

Creación del CRUD

El acrónimo CRUD (Create, Read, Update, Delete) es un acrónimo que hace referencia a las 4 operaciones que se pueden hacer para gestionar datos en una base de datos (INSERT, SELECT, UPDATE, DELETE). Es un acrónimo muy utilizado para hacer referencia a la operativa básica de una aplicación de gestión que opera sobre una Base de Datos y realiza esas 4 operaciones sobre los datos que gestiona.

En este caso, consistiría en preparar una aplicación en la que se mostrara al usuario un menú para que pudiera llevar a cabo las 4 operaciones que hemos visto sobre un conjunto de datos.


© 2019 Santiago Faci

apuntes/bbdd.txt · Last modified: 2019/02/16 19:44 by Santiago Faci