jairogarcíarincón
Contenidos
- Introducción a JavaFX y Prerrequisitos
- LibretaDirecciones: Creación del proyecto y configuración
- LibretaDirecciones: Modelo y Lista de personas
- LibretaDirecciones: Interacción con el usuario
- LibretaDirecciones: Hojas de estilo CSS
- LibretaDirecciones: Persistencia de datos con XML
- LibretaDirecciones: Gráficos e Informes
- LibretaDirecciones: Despliegue
- LibretaDirecciones: Persistencia con base de datos con MySQL (local)
- LibretaDirecciones: Persistencia con base de datos con MySQL (remota)
Si bien de esta forma nuestra libreta estaría terminada y sería completamente funcional en un entorno local, vamos a realizar modificaciones en la misma de modo que sea posible conectar con una base de datos de tipo MySQL.
En concreto, en esta clase vamos a ver cómo podríamos conectar la libreta a una base de datos local.
Para crear una base de datos local lo primero que necesitamos, evidentemente, es un servidor local de base de datos.
Afortunadamente, los ordenadores del aula tienen instalado un entorno virtual LAMP (Linux, Apache, MySQL y PHP) mediante el programa XAMPP. Si no lo tienes, puedes descargarlo siguiendo estas instrucciones o usar cualquier otro gestor de bases de datos de tipo MySQL de tu elección.
Una vez instalado, abre XAMPP e inicia MySQL (Fíjate en el puerto de conexión del log - que normalmente es el 3306 pero que puede estar cambiado - y anótalo para más adelante)
En este punto, podrías acceder en tu navegador al gestor de bases de datos phpMyAdmin local mediante la ruta http://localhost/phpmyadmin.
Crea una nueva base de datos con motor InnoDB y codificación UTF-8 y un usuario para ella con permisos de INSERT, SELECT, UPDATE Y DELETE. En mi caso, la base de datos se llamará dam, el usuario dam y su password será dam.
Una vez que la tengas, crea una nueva tabla personas con la siguiente sintaxis:
CREATE TABLE `personas` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`nombre` varchar(32) DEFAULT NULL,
`apellidos` varchar(32) DEFAULT '',
`direccion` varchar(128) DEFAULT '',
`ciudad` varchar(32) DEFAULT NULL,
`codigoPostal` int(5) DEFAULT NULL,
`fechaDeNacimiento` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=174 DEFAULT CHARSET=utf8;
y añade algunas filas de ejemplo. Como ves, tiene todos los campos de nuestro modelo persona, además de un id como clave primaria. En el ejemplo no lo usaremos pero en tus proyectos deberías hacer uso de él.
Para la conexión a la base de datos local, utilizaremos el conector de mysql oficial que puedes descargar desde la página de descargas de MySQL seleccionando el zip correspondiente a tu sistema operativo.
Una vez que lo tengas, descomprímelo y en las Properties de tu proyecto (botón derecho), accediendo a la sección Libraries, añade la ruta del archivo mysql-connector-java.5.*.jar mediante el botón Add JAR/Folder.
A continuación, crea una nueva clase llamada ConectorSql dentro del paquete util que será la encargada de realizar la conexión y las consultas necesarias a la base de datos:
package util;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import model.Persona;
/**
*
* @author jairogarciarincon
*/
public class ConexionSql {
private Connection conexion ;
public ConexionSql(String dbURL, String usuario, String password) throws SQLException {
conexion = DriverManager.getConnection(dbURL, usuario, password);
System.out.println("Base de datos conectada");
}
public void cerrar() throws SQLException {
if (conexion != null) {
conexion.close();
System.out.println("Base de datos desconectada");
}
}
public List getPersonas() throws SQLException{
Statement stmnt = conexion.createStatement();
ResultSet rs = stmnt.executeQuery("SELECT * FROM personas");
List<Persona> personas = new ArrayList<>();
while (rs.next()) {
String nombre = rs.getString("nombre");
String apellidos = rs.getString("apellidos");
String direccion = rs.getString("direccion");
String ciudad = rs.getString("ciudad");
int codigoPostal = rs.getInt("codigoPostal");
Date fechaDeNacimiento = rs.getDate("fechaDeNacimiento");
Persona persona = new Persona(nombre, apellidos, direccion, ciudad, codigoPostal, fechaDeNacimiento.toLocalDate());
personas.add(persona);
}
rs.close();
stmnt.close();
return personas;
}
public void putPersonas(List<Persona> personas) throws SQLException{
//Borro todas
Statement stmnt = conexion.createStatement();
stmnt.executeUpdate("DELETE FROM personas");
stmnt.close();
//Preparo el statement
String query = "INSERT INTO personas (nombre,apellidos,direccion,ciudad,codigoPostal,fechaDeNacimiento) VALUES (?,?,?,?,?,?)";
PreparedStatement ps = conexion.prepareStatement(query);
//Añado cada persona
for (Persona persona : personas){
ps.setString(1, persona.getNombre());
ps.setString(2, persona.getApellidos());
ps.setString(3, persona.getDireccion());
ps.setString(4, persona.getCiudad());
ps.setInt(5, persona.getCodigoPostal());
ps.setDate(6, java.sql.Date.valueOf(persona.getFechaDeNacimiento()));
ps.execute();
}
ps.close();
System.out.println("Datos guardados en Base de datos");
}
}
Para conectarnos a la base de datos, debemos modificar el código de LibretaDirecciones de modo que incluya una nueva variable:
private ConexionSql conexionSql;
y el código del método start() de LibretaDirecciones para que antes de inicializar los layouts y las vistas inicialize la conexión con la base de datos:
//Establezco conexión con la base de datos local
conexionSql = new ConexionSql("jdbc:mysql://127.0.0.1:3306/dam?useSSL=false", "dam", "dam");
Del string anterior, el primer dam es el nombre de la base de datos, el segundo es el usuario de la base de datos y el tercero es la contraseña de dicho usuario.
En este punto, al ejecutar la aplicación deberías recibir un mensaje de "Base de datos conectada".
Una vez que tenemos acceso, para leer de la base de datos tendríamos que llamar al método getPersonas() creado anteriormente en ConexionSql. Para ello, modifica el código del método initLayoutPrincipal() de LibretaDirecciones para que incluya lo siguiente al final:
//Cargo personas de la base de datos (borrando las anteriores)
datosPersona.clear();
datosPersona.addAll(conexionSql.getPersonas());
Además, los dos constructores de la clase Persona cambian un poco, ya que antes habíamos centrado el ejemplo solo en nombre y apellidos y ahora vamos a recuperar todos los datos:
public Persona(){
this(null, null, null, null, 0, null);
}
public Persona(String nombre, String apellidos, String direccion, String ciudad, int codigoPostal, LocalDate fechaDeNacimiento){
this.nombre = new SimpleStringProperty(nombre);
this.apellidos = new SimpleStringProperty(apellidos);
this.direccion = new SimpleStringProperty(direccion);
this.ciudad = new SimpleStringProperty(ciudad);
this.codigoPostal = new SimpleIntegerProperty(codigoPostal);
this.fechaDeNacimiento = new SimpleObjectProperty(fechaDeNacimiento);
}
Para finalizar, si al guardar queremos que los datos se guarden en nuestra base de datos, debemos llamar al método putPersonas() de ConexionSql creado anteriormente. Para ello, añade estas líneas al final del método guardaPersonas() de LibretaDirecciones:
//Guardar en la base de datos
conexionSql.putPersonas(datosPersona);
Con esto estaría terminado el proceso de conexión, lectura y escritura en una base de datos local. En el próximo apartado modificaremos la conexión para poder conectarnos mediante SSH a un servidor remoto de bases de datos.
Publicado el 30 de Enero de 2025
xmlinterfacesjavafx