Conexión base de datos

Para conectarnos desde java a las bases de datos tenemos varias opciones. Empezaremos con la más sencilla y en días sucesivos veremos otras más complejas.

En un proyecto Java podemos añadir el conector mysql. Primero lo tenemos que descargar, si queréis lo podéis hacer desde aquí:

https://github.com/juanpablofuentes/JavaNetmind/tree/main/MiPrimerProyecto/src

https://dev.mysql.com/downloads/connector/j/

Botón derecho guardar archivo mysql connector

Creamos un nuevo proyecto (para no mezclar) y añadimos este jar a las librerías de nuestro proyecto. Un manual:

https://www.knowprogram.com/jdbc/connect-mysql-database-eclipse/

Una vez lo tengamos añadido podemos conectarnos a nuestra base de datos con la cadena de conexión, de manera parecida a como lo hacemos en el workbench, indicando la url del servidor, la base de datos, y el usuario y la contraseña:

	Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");

A partir de aquí podemos acceder a la base de datos:


Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("select * from actor");
			while (rs.next()) {
				System.out.println(rs.getInt(1) + "  " + rs.getString(2) + "  " + rs.getString(3));
			}
			rs = stmt.executeQuery("select * from actor");
			while (rs.next()) {
				System.out.println(
						rs.getInt("actor_id") + "  " + rs.getString("first_name") + "  " + rs.getString("last_name"));
			}

			int result=stmt.executeUpdate("insert into actor (first_name, last_name) values ('Eva','Pi')");  
			System.out.println(result+" filas afectadas");

			PreparedStatement ps = con.prepareStatement("select * from actor where first_name like ?");
			ps.setString(1, "%ar%");
			rs = ps.executeQuery();
			while (rs.next()) {
				System.out.println(
						rs.getInt("actor_id") + "  " + rs.getString("first_name") + "  " + rs.getString("last_name"));
			}

Ejercicio clases Dungeons & Dragons

Vamos a hacer una especie de juego antiguo de dragones y mazmorras. Tendremos un tablero y en medio estará nuestro héroe. Puede moverse en todas las direcciones y en principio no sabe lo que se va a encontrar. Hay tesoros (que sirven para incrementar nuestra potencia) y monstruos (con los que peleamos). Si derrotamos a todos los monstruos hemos ganado.

Antes de empezar nos pedirá el tamaño del tablero (ancho y alto) aunque tendremos valores por defecto. También el número de monstruos y de tesoros. Se crea el tablero se coloca al héroe y se piden movimientos hasta que el usuario escriba ‘FIN’, se derroten a todos los monstruos o nos muramos.

Cada vez que proporcionamos un movimiento (U,D,L,R) movemos al héroe a esa posición. Las posiciones que no se han visitado se muestran con asterisco, las visitadas se dejan en blanco.

Cuando el héroe encuentra un tesoro se le da el mensaje, las monedas que ha ganado y cuanto se ha incrementado la potencia. Se le pide que pulse una tecla para continuar.

Cuando el héroe encuentra un monstruo se le avisa, se calcula quien ha ganado (un porcentaje respecto a la potencia) y pueden pasar dos cosas:
1.- Gana el héroe: se incrementa su potencia
2.- Pierde el héroe: Se acaba el juego y se le pregunta si quiere volver a empezar.

Esto sería lo básico. Posibles mejoras:

1.- Poción de vida. Si el usuario las encuentra y lo mata un monstruo puede seguir la partida.
2.- Poción de visión: Si el usuario la usa cuando le toca su movimiento puede ver lo que tiene a su alrededor.
3.- Modificar el enfrentamiento para que sea por turnos y que reste ‘vida’ dependiendo de la potencia. Esto nos permitiría tener monstruos con más personalidad (mucha vida pero poca potencia, poca vida pero mucha potencia)
4.- Que las monedas no te den automáticamente potencia, sino que te permitan comprar más vida o más potencia (u otras cosas que se nos puedan ocurrir)
5.- Modo automático: el héroe se mueve a través del tablero aleatoriamente y nos va mostrando los mensajes sin que tengamos que intervenir.
6.- Mundo infinito: Poner puertas en los lados del tablero que nos permitan ir a otras habitaciones que se irán generando.

Ejercicios Java

Escribir una función que invierta el orden de los caracteres de una cadena dada.

Escribir una función que cuente el número de veces que se repite un carácter específico en una cadena dada.

Escribir una función que elimine los espacios en blanco al principio y al final de una cadena dada.

Escribir una función que compruebe si una cadena es un palíndromo (una palabra o frase que se lee igual de izquierda a derecha y de derecha a izquierda).

Escribir una función que elimine todas las ocurrencias de una subcadena específica de una cadena dada.

Escribir una función que reemplace todas las ocurrencias de un carácter específico en una cadena dada con otro carácter.

https://github.com/juanpfuentes/Java/blob/main/src/java/strings.md

Maven

https://www.genbeta.com/desarrollo/que-es-maven
https://www.javiergarzas.com/2014/06/maven-en-10-min.html

https://mvnrepository.com/

https://geekflare.com/es/apache-maven-for-beginners/

En otros lenguajes (php, node) se usa composer:

https://academy.leewayweb.com/que-es-composer/

En eclipse:

https://jarroba.com/maven-en-eclipse/

http://www.programandoapasitos.com/2017/07/tutorial-maven-en-eclipse.html

Un ejemplo de como crear un proyecto de web dinámico en Eclipse con Maven:

https://crunchify.com/how-to-create-dynamic-web-project-using-maven-in-eclipse/

Repositorio de dependencias:

https://search.maven.org

https://mvnrepository.com/

El POM:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html

Ejemplo relaciones en DAO java

Tenemos la siguiente base de datos:


DROP TABLE IF EXISTS `cartera`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `cartera` (
  `idcartera` int(11) NOT NULL AUTO_INCREMENT,
  `idusuario` int(11) DEFAULT NULL,
  `idmoneda` int(11) DEFAULT NULL,
  `cantidad` int(11) DEFAULT NULL,
  PRIMARY KEY (`idcartera`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `cartera`
--

LOCK TABLES `cartera` WRITE;
/*!40000 ALTER TABLE `cartera` DISABLE KEYS */;
INSERT INTO `cartera` VALUES (1,1,1,2),(2,1,2,3),(3,2,1,1),(4,2,2,5);
/*!40000 ALTER TABLE `cartera` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `monedas`
--

DROP TABLE IF EXISTS `monedas`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `monedas` (
  `idmonedas` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(45) DEFAULT NULL,
  `valor` decimal(8,2) DEFAULT NULL,
  PRIMARY KEY (`idmonedas`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `monedas`
--

LOCK TABLES `monedas` WRITE;
/*!40000 ALTER TABLE `monedas` DISABLE KEYS */;
INSERT INTO `monedas` VALUES (1,'Bitcoin',10.00),(2,'Ethereum',20.00);
/*!40000 ALTER TABLE `monedas` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `usuario`
--

DROP TABLE IF EXISTS `usuario`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `usuario` (
  `idusuario` int(11) NOT NULL,
  `nombre` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idusuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `usuario`
--

LOCK TABLES `usuario` WRITE;
/*!40000 ALTER TABLE `usuario` DISABLE KEYS */;
INSERT INTO `usuario` VALUES (1,'Ana'),(2,'Eva');
/*!40000 ALTER TABLE `usuario` ENABLE KEYS */;

Y vamos a crear los POJO’s y los DAO para manejar estas relaciones.

Usuarios:

package com.trifulcas.datos;

import java.util.ArrayList;
import java.util.List;

public class Usuario {

	private int idusuario;
	private String nombre;
	private List<Cartera> cartera;
	public Usuario(int idusuario, String nombre) {
		super();
		this.idusuario = idusuario;
		this.nombre = nombre;
		cartera=new ArrayList<Cartera>();
	}
	
	/**
	 * @return the cartera
	 */
	public List<Cartera> getCartera() {
		return cartera;
	}

	/**
	 * @param cartera the cartera to set
	 */
	public void setCartera(List<Cartera> cartera) {
		this.cartera = cartera;
	}

	/**
	 * @return the idusuario
	 */
	public int getIdusuario() {
		return idusuario;
	}
	/**
	 * @param idusuario the idusuario to set
	 */
	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	@Override
	public String toString() {
		return "Usuario [idusuario=" + idusuario + ", nombre=" + nombre + ", cartera=" + cartera + "]";
	}
	
	
	
}

package com.trifulcas.datos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class UsuarioDAO {

	private Connection con;
	private int max_records = 1000;

	public UsuarioDAO() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/prestamos", "root", "");

		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	public Usuario getUsuario(int id) {
		Usuario res = null;
		CarteraDAO cartera=new CarteraDAO();
		try {
			String sql = "select * from usuario where idusuario=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);

			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				res = new Usuario(rs.getInt("idusuario"),rs.getString("nombre"));
				res.setCartera(cartera.getCarteraUsuario(rs.getInt("idusuario")));
			}

		} catch (Exception ex) {
			System.out.println(ex);
		}
		return res;
	}

	

}

MOneda:

package com.trifulcas.datos;

public class Moneda {

	private int idmonedas;
	private String nombre;
	private double valor;
	public Moneda(int idmonedas, String nombre, double valor) {
		super();
		this.idmonedas = idmonedas;
		this.nombre = nombre;
		this.valor = valor;
	}
	/**
	 * @return the idmonedas
	 */
	public int getIdmonedas() {
		return idmonedas;
	}
	/**
	 * @param idmonedas the idmonedas to set
	 */
	public void setIdmonedas(int idmonedas) {
		this.idmonedas = idmonedas;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the valor
	 */
	public double getValor() {
		return valor;
	}
	/**
	 * @param valor the valor to set
	 */
	public void setValor(double valor) {
		this.valor = valor;
	}
	@Override
	public String toString() {
		return "Moneda [idmonedas=" + idmonedas + ", nombre=" + nombre + ", valor=" + valor + "]";
	}
	
	
}

package com.trifulcas.datos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class MonedaDAO {

	private Connection con;
	private int max_records = 1000;

	public MonedaDAO() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/prestamos", "root", "");

		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	public Moneda getMoneda(int id) {
		Moneda res = null;
		try {
			String sql = "select * from monedas where idmonedas=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);

			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				res = new Moneda(rs.getInt("idmonedas"), rs.getString("nombre"), rs.getDouble("valor"));
			}

		} catch (Exception ex) {
			System.out.println(ex);
		}
		return res;
	}

	

}

Cartera:

package com.trifulcas.datos;

public class Cartera {

	private int idcartera;
	private int idusuario;
	private int idmoneda;
	private int cantidad;
	private Moneda moneda;
	public Cartera(int idcartera, int idusuario, int idmoneda, int cantidad,  Moneda moneda) {
		super();
		this.idcartera = idcartera;
		this.idusuario = idusuario;
		this.idmoneda = idmoneda;
		this.cantidad=cantidad;
		this.moneda = moneda;
	}
	
	/**
	 * @return the cantidad
	 */
	public int getCantidad() {
		return cantidad;
	}

	/**
	 * @param cantidad the cantidad to set
	 */
	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	/**
	 * @return the idcartera
	 */
	public int getIdcartera() {
		return idcartera;
	}
	/**
	 * @param idcartera the idcartera to set
	 */
	public void setIdcartera(int idcartera) {
		this.idcartera = idcartera;
	}
	/**
	 * @return the idusuario
	 */
	public int getIdusuario() {
		return idusuario;
	}
	/**
	 * @param idusuario the idusuario to set
	 */
	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}
	/**
	 * @return the idmoneda
	 */
	public int getIdmoneda() {
		return idmoneda;
	}
	/**
	 * @param idmoneda the idmoneda to set
	 */
	public void setIdmoneda(int idmoneda) {
		this.idmoneda = idmoneda;
	}
	/**
	 * @return the moneda
	 */
	public Moneda getMoneda() {
		return moneda;
	}
	/**
	 * @param moneda the moneda to set
	 */
	public void setMoneda(Moneda moneda) {
		this.moneda = moneda;
	}
	@Override
	public String toString() {
		return "Cartera [idcartera=" + idcartera + ", idusuario=" + idusuario + ", idmoneda=" + idmoneda + ", cantidad="
				+ cantidad + ", moneda=" + moneda + "]";
	}
	
	
	
}
package com.trifulcas.datos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class CarteraDAO {

	private Connection con;
	private int max_records = 1000;

	public CarteraDAO() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/prestamos", "root", "");

		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	public Cartera getCartera(int id) {
		Cartera res = null;
		MonedaDAO moneda=new MonedaDAO();
		try {
			String sql = "select * from cartera where idcartera=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);

			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				res = new Cartera(rs.getInt("idcartera"), rs.getInt("idusuario"),rs.getInt("idmoneda"), rs.getInt("cantidad"), moneda.getMoneda(rs.getInt("idmoneda"))) ;
			}

		} catch (Exception ex) {
			System.out.println(ex);
		}
		return res;
	}

	public List<Cartera> getCarteraUsuario(int id){
		List<Cartera> res = new ArrayList<Cartera>();
		
		try {
			String sql = "select * from cartera where idusuario=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);

			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				Cartera temp = getCartera(rs.getInt("idcartera"));
				res.add(temp);
			}
		} catch (Exception ex) {
			System.out.println(ex);
		}
		return res;
	}

}

Test:

package com.trifulcas.datos;

public class TestCartera {

	public static void main(String[] args) {
		MonedaDAO moneda=new MonedaDAO();
		
		System.out.println(moneda.getMoneda(1));

		CarteraDAO cartera = new CarteraDAO();
		
		System.out.println(cartera.getCartera(1));
		System.out.println(cartera.getCartera(2));
		System.out.println(cartera.getCartera(3));
		System.out.println(cartera.getCarteraUsuario(1));
		UsuarioDAO usuario=new UsuarioDAO();
		System.out.println(usuario.getUsuario(1));
		System.out.println(usuario.getUsuario(2));
	}

}

Esquema definición proyecto

INTRODUCCIÓN
Motivación
Planteamiento técnico

ESPECIFICACIÓN DE REQUISITOS
Propósito
Descripción general
Funciones del producto
Requisitos especificos
Requisitos funcionales
Requisitos de interfaz