Ejemplos select

-- Para cada país sus ciudades
-- join me está diciendo que relaciono las dos tablas
-- on me dirá mediante que campos están relacionados
select country,city from country join city on country.country_id=city.country_id;

select country,city from country co join city ci on co.country_id=ci.country_id;

-- Solo vale para mysql y el campo se tiene que llamar igual
select country,city from country join city using(country_id);

select country,city,first_name,last_name 
from country join city on country.country_id=city.city_id
join address on city.city_id=address.city_id
join customer on address.address_id=customer.address_id;

select name,title from category join film_category 
on category.category_id=film_category.category_id
join film on film_category.film_id=film.film_id;

-- left join nos dice que devolvamos los valores de la tabla de la izquierda
-- Aunque no tengamos valores relacionados

select name,title from category left join film_category 
on category.category_id=film_category.category_id
left join film on film_category.film_id=film.film_id;

-- right join nos dice que devolvamos los valores de la tabla de la derecha
-- Aunque no tengamos valores relacionados

select name,title from category right join film_category 
on category.category_id=film_category.category_id
right join film on film_category.film_id=film.film_id

Insert de revistas

INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Nature’, ‘1234-5678’, 1, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Science’, ‘5678-1234’, 2, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘The New England Journal of Medicine’, ‘8765-4321’, 3, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘The Lancet’, ‘4321-8765’, 4, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Cell’, ‘9876-5432’, 5, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Nature Reviews Immunology’, ‘5432-9876’, 6, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Journal of the American Medical Association’, ‘2345-6789’, 7, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘Nature Genetics’, ‘6789-2345’, 8, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘The Astrophysical Journal’, ‘3456-7890’, 9, 2023);
INSERT INTO Revistas (Titulo, ISSN, Numero, Anyo) VALUES (‘IEEE Transactions on Neural Networks and Learning Systems’, ‘7890-3456’, 10, 2023);

Catálogo revistas

DROP TABLE IF EXISTS `revista` ;

CREATE TABLE IF NOT EXISTS `revista` (
`idrevista` INT NOT NULL AUTO_INCREMENT,
`titulo` VARCHAR(100) NOT NULL,
`issn` CHAR(9) NOT NULL,
`numero` INT NOT NULL,
`anyo` YEAR NOT NULL,
PRIMARY KEY (`idrevista`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

DROP TABLE IF EXISTS `articulo` ;

CREATE TABLE IF NOT EXISTS `articulo` (
`idarticulo` INT NOT NULL AUTO_INCREMENT,
`titulo` VARCHAR(100) NOT NULL,
`inicio` INT NOT NULL,
`final` INT NOT NULL,
`idrevista` INT NOT NULL,
PRIMARY KEY (`idarticulo`),
CONSTRAINT `idrevista`
FOREIGN KEY (`idrevista`)
REFERENCES `revista` (`idrevista`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

CREATE INDEX `idrevista_idx` ON `articulo` (`idrevista` ASC) VISIBLE;

DROP TABLE IF EXISTS `autor` ;

CREATE TABLE IF NOT EXISTS `autor` (
`idautor` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`pais` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idautor`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

DROP TABLE IF EXISTS `articulo_autor` ;

CREATE TABLE IF NOT EXISTS `articulo_autor` (
`idarticulo_autor` INT NOT NULL AUTO_INCREMENT,
`idautor` INT NOT NULL,
`idarticulo` INT NOT NULL,
`posicion` INT NOT NULL,
PRIMARY KEY (`idarticulo_autor`),
CONSTRAINT `idarticulo`
FOREIGN KEY (`idarticulo`)
REFERENCES `articulo` (`idarticulo`),
CONSTRAINT `idautor`
FOREIGN KEY (`idautor`)
REFERENCES `autor` (`idautor`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;

CREATE INDEX `idarticulo_idx` ON `articulo_autor` (`idarticulo` ASC) VISIBLE;

CREATE INDEX `idautor_idx` ON `articulo_autor` (`idautor` ASC) VISIBLE;

Modelos ER

Se desea crear una base de datos que contenga información sobre las revistas a las que estás suscrito o compras habitualmente. De cada revista, se pide su título, el ISSN (un código que identifica a la publicación), el número y el año de publicación. También se desea almacenar información de cada uno de los artículos publicados: el título, la página de inicio y la página de fin. Se asume que no hay dos artículos con el mismo título.
Cada artículo puede estar escrito por varios autores, de quienes interesa conocer su nombre, una dirección de correo electrónico y su país de nacimiento, así como un número que indique la posición en la que aparece en cada artículo: un 1 si es el primer autor, un 2 si aparece en segundo lugar, etc.
revista 1—–N   articulo N–|–N     autor
id int id int posicion id
titulo varchar(100) titulo nombre
issn char(9) inicio mail
numero int fin pais
anyo  year
Un parque zoológico quiere construir una BD para organizar las especies que posee y los distintos itinerarios para visitar el parque. La información se estructura de la siguiente forma. De las especies, se desea conocer su nombre común y su nombre científico, así como una descripción general y una fotografía. Cada especie puede vivir en distintos hábitats naturales, definidos por su nombre, clima y vegetación predominante. Cada especie tiene asociado un índice de vulnerabilidad dentro de cada hábitat, que mide el riesgo de extinción de la especie en el dicho hábitat. Para organizar las visitas, y en función de los hábitats que desee recorrer un visitante, el parque le ofrece una serie de recorridos por los hábitats, que se identifican por su código y se caracterizan por su duración estimada, longitud y número máximo de visitantes permitidos. Un hábitat sólo puede formar parte de un itinerario.
especie N——-|—–N habitat N—1 itinerario
id vulnerabil. id id
nombrecomun nombre codigo
nombrecientifico clima duracion
descripcion vegetacion longitud
fotografia capacidad
Una empresa vende productos a varios clientes. Se necesita conocer los  datos personales de los clientes (nombre, apellidos, dni, dirección y  fecha de nacimiento). Cada producto tiene un nombre y un código, así  como un precio unitario. Un cliente puede comprar varios productos a la  empresa, y un mismo producto puede ser comprado por varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe  tener en cuenta que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede suministrar diferentes productos. De cada proveedor se desea conocer el NIF, nombre y dirección.
cliente N—-|—-N producto N—-1 proveedor
id precio id id
nombre cant. nombre nif
apellidos codigo nombre
dni precio direccion
direccion
fechanacimiento
Una compañía aérea necesita una base de datos para registrar la información de sus vuelos. Los vuelos están caracterizados por un Id, la fecha y los aeropuertos de origen y destino. Cada vuelo es realizado por un avión. Los aviones tienen una matrícula que los identifica, el fabricante, un modelo e información sobre su capacidad (número máximo de pasajeros) y autonomía de vuelo (en horas). La tripulación asignada al vuelo está formada por el personal de la propia compañía. De cada trabajador se conoce su id, su nombre y su categoría profesional, así como el puesto que ocupa en cada vuelo en particular.
Por último, para cada vuelo, se almacena la lista completa de pasajeros, con su dni, el nombre, el asiento que ocupa y su clase (turista, primera o business).
asiento,clase
|–N—————|————–N–|
avion 1—N vuelo N-|–N trajadores pasajeros
id id puesto id id
matricula fecha nombre dni
fabricante origen categoria nombre
modelo destino
capacidad
autonomia
Una ONG desea elaborar una base de datos para llevar el seguimiento de todos sus proyectos. Tiene diversas sedes en varios países que se encargan de gestionar y coordinar los proyectos de ese país, cada uno de los cuales puede afectar a una o varias poblaciones.
Sobre la sedes se desea mantener un identificador, la ciudad y país en el que se encuentra, junto con su dirección, un teléfono de contacto y el nombre del director. Cada sede gestiona un conjunto de proyectos, con un código, un título, fechas de inicio y finalización, el presupuesto asignado y el nombre del responsable.
De cada proyecto es necesario conocer qué actuaciones se realizan en cada población, almacenando el nombre, país y nº de habitantes y un identificador para diferenciarlas. Además se desea la inversión del proyecto que corresponde a la población y una pequeña descripción de la actuación.
sede 1—N proyecto 1—N  actuacion N–1 poblacion
id id id id
ciudad codigo inversion nombre
pais titulo descripcion pais
direccion inicio habitantes
telefono fin
director presupuesto
responsable

Solucion Solid

package com.trifulcas.juegoPPTLSID;

import java.util.Arrays;

public class JuegoColores implements ILogica{
	private String[] jugadas = { "verde","azul","amarillo","naranja","rojo" };

	public JuegoColores() {

	}

	@Override
	public int comprobar(String jugada1, String jugada2) {
		int pos1 = Arrays.asList(jugadas).indexOf(jugada1.toLowerCase());
		int pos2 = Arrays.asList(jugadas).indexOf(jugada2.toLowerCase());
		if ((pos1 + 1) % jugadas.length == pos2)
			return 1;
		if ((pos2 + 1) % jugadas.length == pos1)
			return 2;
		return 0;
	}

	@Override
	public String[] validas() {

		return this.jugadas;
	}
}


package com.trifulcas.juegoPPTLSID;

public interface IMostrar {
	 void mostrar(String res);
}


package com.trifulcas.juegoPPTLSID;

public class Juego {
	private Jugador jugador1;
	private Jugador jugador2;
	private ILogica _iLogica;
	private IMostrar _iMostrar;

	private String[] jugadas;

	public String[] getJugadas() {
		return jugadas;
	}

	public void setJugadas(String[] jugadas) {
		this.jugadas = jugadas;
	}

	public Jugador getJugador1() {
		return jugador1;
	}

	public void setJugador1(Jugador jugador1) {
		this.jugador1 = jugador1;
	}

	public Jugador getJugador2() {
		return jugador2;
	}

	public void setJugador2(Jugador jugador2) {
		this.jugador2 = jugador2;
	}

	public Juego(Jugador jugador1, Jugador jugador2, ILogica ilogica, IMostrar imostrar) {
		this.jugador1 = jugador1;
		this.jugador2 = jugador2;
		_iLogica = ilogica;
		jugadas = _iLogica.validas();
		_iMostrar = imostrar;
	}

	public Juego(Jugador jugador1, Jugador jugador2, ILogica ilogica) {
		this(jugador1, jugador2, ilogica, new Consola());
	}

	public String jugar() {
		jugador1.pedirJugada(jugadas);
		jugador2.pedirJugada(jugadas);
		_iMostrar.mostrar(jugador1.getNombre() + " elige " + jugador1.getJugada());
		_iMostrar.mostrar(jugador2.getNombre() + " elige " + jugador2.getJugada());
		int res = _iLogica.comprobar(jugador1.getJugada(), jugador2.getJugada());
		String resultado="Empate";
		if (res == 1) {
			resultado= jugador1.getNombre();
		}
		if (res == 2) {
			resultado= jugador2.getNombre();
		}
		_iMostrar.mostrar(resultado);
		return resultado;
	}
}

package com.trifulcas.juegoPPTLSID;

public class Consola implements IMostrar {

	@Override
	public void mostrar(String res) {
		System.out.println(res);
	}

}


package com.trifulcas.juegoPPTLSID;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class Fichero implements IMostrar {

	@Override
	public void mostrar(String res) {
		Path path = Paths.get("resultado.txt");
		try {
			if (!Files.exists(path))
				Files.createFile(path);
			Files.writeString(path, res+"\r\n", StandardOpenOption.APPEND);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Soluciones ejercicios SOLID

package com.trifulcas.ejerciciosSolid;

public class Article {
	private String Title;
	private String Content;

	public void setTitle(String title) {
		this.Title = title;
	}

	public void setContent(String content) {
		this.Content = content;
	}
}


package com.trifulcas.ejerciciosSolid;

public class GenerateSummary {
	
	public String generateSummary(String content) {
		// Logic to generate a summary from the content
		return content.substring(0, 100) + "..."; // just a simple example
	}
}

package com.trifulcas.ejerciciosSolid;

import com.trifulcas.juego.Enemigo;

public class SaveToDatabase {
	// Cosas del tipo conexión a BD
	// etc...

	public void saveToDatabase(Article article) {
		// Logic to save the article to a database
	}
	public void saveToDatabase(Enemigo enemigo) {
		// Logic to save the article to a database
	}
}


package com.trifulcas.ejerciciosSolid;

public abstract class ReportGenerator {
	public abstract void generateReport(String data); 
}

package com.trifulcas.ejerciciosSolid;

public class ReportGeneratorPDF extends ReportGenerator {

	@Override
	public void generateReport(String data) {
		System.out.println("Aquí va el código de generar PDF");
	}

}

package com.trifulcas.ejerciciosSolid;

public class ReportGeneratorCSV extends ReportGenerator {

	@Override
	public void generateReport(String data) {
		System.out.println("Código para generar CSV");
	}

}


package com.trifulcas.ejerciciosSolid;

public interface IReportGenerator {
	public void generateReport(String data); 
}


package com.trifulcas.ejerciciosSolid;

public class ReportGeneratorXML implements IReportGenerator {

	@Override
	public void generateReport(String data) {
		System.out.println("Lógica para generar XML");
	}

}


package com.trifulcas.ejerciciosSolid;

public class ReportGeneratorID {
	IReportGenerator reportGenerator;
	
	public ReportGeneratorID(IReportGenerator reportGenerator) {
		this.reportGenerator = reportGenerator;
	}
	
	public void generateReport(String data) {
		reportGenerator.generateReport(data);
	}
	
}


package com.trifulcas.ejerciciosSolid;

public class ProbarReports {

	public static void main(String[] args) {
		String datos="Hola que tal";
		
		// Generar un PDF
		ReportGeneratorPDF rgp=new ReportGeneratorPDF();
		rgp.generateReport(datos);
		
		// Generar un XML con ID
		ReportGeneratorXML rgx=new ReportGeneratorXML();
		
		ReportGeneratorID rgid=new ReportGeneratorID(rgx);
		
		rgid.generateReport(datos);
		
		rgid=new ReportGeneratorID(rgx);
		
		rgid.generateReport(datos);
	}

}


package com.trifulcas.ejerciciosSolid;

public interface IClean {
	 void Clean();
}


package com.trifulcas.ejerciciosSolid;

public class Apartment implements IClean {

	@Override
	public void Clean() {
	       System.out.println("Apartment cleaned.");
	}

}

package com.trifulcas.ejerciciosSolid;

import java.util.Date;

public interface IRoom 	{
	void Reserve(Date from, Date to);
    void CheckInventory();
}

package com.trifulcas.ejerciciosSolid;

public interface IInventory {
	void CheckInventory();
}

package com.trifulcas.ejerciciosSolid;

import java.util.Date;

public interface IReserve {
	void Reserve(Date from, Date to);
	   
}

Ejercicios Files

public class Alumno {
	// El public es un modificador de acceso
	// Quiere decir que cualquiera puede acceder al valor
	public String nombre;
	// Tenemos tres sabores de protección
	// public, protected y private
	private ArrayList<Integer> notas;

	// Los parámetros que queremos poner al crear la clase
	public Alumno(String nombre) {
		// Las cosas que queremos que se ejecuten
		// cuando creamos la clase
		// this.nombre es el nombre del objeto
		// nombre es el parámetro que le pasamos
		this.nombre = nombre;
		notas = new ArrayList<Integer>();
	}

	public Alumno() {
		// Llamando a la sobrecarga del constructor
		this("anonimo");

	}

	public int ponNota(int nota) {
		// Me aseguro de que mis notas están entre 0  10
		if (nota > 0 && nota <= 10) {
			notas.add(nota);
		}
		return notas.size();
	}

	public double media() {

		double total = 0;
		// Desde dentro de la clase si que puedo acceder
		for (int nota : notas) {
			total += nota;
		}
		return total / this.notas.size();
	}
}
public static void main(String[] args) {
		ArrayList<Alumno> alumnos=importar("archivo.txt");
		System.out.println(estadoCarpeta("c:\\pepe"));
		ArrayList<String> nombres = new ArrayList<>();
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < 5; i++) {
			System.out.println("Introduce nombre " + i);
			nombres.add(sc.next());
		}

		Path path = Paths.get("nombres.txt");

		try {
			Files.write(path, nombres, StandardOpenOption.CREATE);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

	public static int estadoCarpeta(String ruta) {
		Path path = Paths.get(ruta);
		if (!Files.isDirectory(path)) {
			return -1;
		}
		try {
			List<Path> ficheros = Files.list(path).collect(Collectors.toList());
			if (ficheros.size() == 0) {
				return 0;
			}
			// TODO: Crear un método aparte
			for (Path fichero : ficheros) {
				if (Files.isDirectory(fichero)) {
					return 2;
				}
			}
			return 1;

		} catch (IOException e) {
			System.out.println(e.getMessage());
			return -1;
		}

	}

	public static ArrayList<Alumno> importar(String ruta) {
		List<String> contenido;
		// Leer fichero
		Path path = Paths.get(ruta);
		try {
			contenido = Files.readAllLines(path);
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return null;
		}
		// Crear arraylist
		/*
		 * Nombre;nota Ana;5;6;7 Pep;3;3 Eva;5;5
		 */
		ArrayList<Alumno> alumnos= new ArrayList<Alumno>();
		for(int i=1;i<contenido.size();i++) {
			String[] elementos=contenido.get(i).split(";");
			Alumno temp=new Alumno(elementos[0]);
			for(int j=1;j<elementos.length;j++) {
				temp.ponNota(Integer.parseInt(elementos[j]));
			}
			alumnos.add(temp);
		}
		return alumnos;
	}
public class Jugador {
	private String nombre;
	private ArrayList<Carta> mano;

	public Jugador(String nombre) {
		super();
		this.nombre = nombre;
		mano = new ArrayList<>();
	}

	protected String getNombre() {
		return nombre;
	}

	protected void setNombre(String nombre) {
		this.nombre = nombre;
	}

	protected ArrayList<Carta> getMano() {
		return mano;
	}

	protected void setMano(ArrayList<Carta> mano) {
		this.mano = mano;
	}

	protected void setMano(Carta carta) {
		this.mano.add(carta);
	}

	@Override
	public String toString() {
		return "Jugador [nombre=" + nombre + ", mano=" + mano + "]";
	}

	public void logFichero(String ruta) {

		ArrayList<String> resultado = new ArrayList<>();
		// Un arraylist con los datos que quiero escribir
		resultado.add("Nombre jugador: " + this.getNombre());
		resultado.add("Cartas:");
		for (Carta carta : mano) {
			resultado.add(carta.toString());
		}
		// Escribir los datos
		try {
			Path path = Paths.get(ruta);
			if (!Files.exists(path)) {
				Files.createFile(path);
			}
			if (Files.isWritable(path)) {
				Files.write(path, resultado, StandardOpenOption.TRUNCATE_EXISTING);
			}else {
				// TODO: Lanzar excepción
				System.out.println("No se puede escribir");
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

}
	public static void main(String[] args) {
		Jugador ana=new Jugador("Ana Pi");
		ana.setMano(new Espanyola("oros",12));
		ana.setMano(new Espanyola("espadas",6));
		ana.setMano(new Espanyola("copas",8));
		ana.setMano(new Espanyola("oros",10));
		ana.logFichero("cartas_ana.txt");
		
	}

File, Files y Path

public static void main(String[] args) {
		File carpeta = new File("c:\\xampp");
		exploreDirectory(carpeta);
	}
	public static void exploreDirectory(File directory) {
        // Obtiene una lista de los archivos y directorios contenidos en el directorio
        File[] files = directory.listFiles();
        // Recorre cada archivo o directorio
        for (File file : files) {
            if (file.isFile()) {
                // Si es un archivo, imprime su nombre
                System.out.println(file.getName());
            } else if (file.isDirectory()) {
                // Si es un directorio, llama recursivamente al método
                exploreDirectory(file);
            }
        }
    }

	Path path = Paths.get("C:/pepe/ejemplo.jpeg");
		System.out.println(path.getFileName());
		System.out.println(path.getName(0));
		System.out.println(path.getParent());
		System.out.println(path.getRoot());
		 path = Paths.get("archivo.txt");
		 System.out.println(path.getFileName());
			System.out.println(path.getName(0));
			System.out.println(path.getParent());
			System.out.println(path.toAbsolutePath());


public static void main(String[] args) throws IOException {
		Path path = Paths.get("c:\\pepe\\archivo.txt");
		String cadena="o muy bien\n";
		Files.writeString(path, cadena,StandardOpenOption.APPEND );
		ArrayList<String> texto=new ArrayList<>(Arrays.asList("adios","hola","que tal"));
		Files.write(path, texto, StandardCharsets.ISO_8859_1,StandardOpenOption.TRUNCATE_EXISTING);
		try {

			List<String> contenido = Files.readAllLines(path);
			for(String linea:contenido)
			{
				System.out.println(linea);
			}
		} catch (IOException e) {
			System.out.println(e);
		}
	}

public static void main(String[] args) {
		Path path = Paths.get("c:\\pepe\\archivo2.txt");
			ArrayList<String> texto=new ArrayList<>(Arrays.asList("adios","hola","qué tal"));
		try {
			Files.write(path, texto, StandardCharsets.ISO_8859_1,StandardOpenOption.CREATE_NEW);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

public static void main(String[] args) {
		try {
		Path path = Paths.get("c:\\pepe\\archivo.txt");
		List<String> contenido=Files.readAllLines(path,StandardCharsets.ISO_8859_1);
		for(String linea:contenido)
		{
			System.out.println(linea);
		}
		}catch(Exception ex) {
			System.out.println(ex.getMessage());
		}
	}