Introducción
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.
Creación de 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.
Conexión a la base de datos local
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".
Leer de la base de datos local
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);
}
Escribir en la base de datos local
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.