Solución Actor

package com.trifulcas.DAO;

public class Actor {
	private int actor_id;
	private String first_name;
	private String last_name;
	public Actor(int actor_id, String first_name, String last_name) {
		super();
		this.actor_id = actor_id;
		this.first_name = first_name;
		this.last_name = last_name;
	}
	public int getActor_id() {
		return actor_id;
	}
	public void setActor_id(int actor_id) {
		this.actor_id = actor_id;
	}
	public String getFirst_name() {
		return first_name;
	}
	public void setFirst_name(String first_name) {
		this.first_name = first_name;
	}
	public String getLast_name() {
		return last_name;
	}
	public void setLast_name(String last_name) {
		this.last_name = last_name;
	}
	@Override
	public String toString() {
		return "Actor [actor_id=" + actor_id + ", first_name=" + first_name + ", last_name=" + last_name + "]";
	}
	
	
	
}

package com.trifulcas.DAO;

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

public class ActorDAO {
	private Connection con;
	private PreparedStatement st;
	private ResultSet rs;

	public ActorDAO() {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");

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

	public void close() {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Actor getActor(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from actor where actor_id=?";
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				return new Actor(rs.getInt("actor_id"), rs.getString("first_name"), rs.getString("last_name"));
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}
	public List<Actor> getActors(String texto){
		try {
			List<Actor> actores = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from actor where first_name like ? or last_name like ?";
			st = con.prepareStatement(sql);
			st.setString(1, "%" + texto + "%");
			st.setString(2, "%" + texto + "%");
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				actores.add(new Actor(rs.getInt("actor_id"), rs.getString("first_name"), rs.getString("last_name")));
			}
			return actores;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}
	public List<Actor> getActors(){
		try {
			
			return getActors("");
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}
	
	public int addActor(String first, String last) {
		try {
			// Creo el sql
			String sql = "insert into actor(first_name, last_name) values (?,?)";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, first);
			st.setString(2, last);
			// Ejecuto
			return st.executeUpdate();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}
	public int addActor(Actor actor) {
		try {
			
			// Ejecuto
			return addActor(actor.getFirst_name(),actor.getLast_name());
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}
	public int updateActor(Actor actor) {
		try {
			String sql = "update actor set first_name=?,last_name=? where actor_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, actor.getFirst_name());
			st.setString(2, actor.getLast_name());
			st.setInt(3, actor.getActor_id());
			// Ejeceuto
			return st.executeUpdate();

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}
	public int deleteActor(int id) {
		try {
			String sql = "delete from actor  where actor_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setInt(1, id);
			// Ejecuto
			return st.executeUpdate();

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

package com.trifulcas.DAO;

public class TestActorDao {

	public static void main(String[] args) {
		ActorDAO actorDAO = new ActorDAO();
		System.out.println(actorDAO.getActor(1));
		System.out.println(actorDAO.getActors());
		actorDAO.addActor("aa", "bb");
		Actor actor=new Actor(0,"aa","bb");
		actorDAO.addActor(actor);
		
		Actor penelope=actorDAO.getActor(1);
		penelope.setFirst_name("Paquita");
		penelope.setLast_name("Salas");
		actorDAO.updateActor(penelope);
		System.out.println(actorDAO.getActor(1));
		actorDAO.deleteActor(56982);
	}

}

DAO con relaciones

Los POJOs

package com.trifulcas.DAO;

import java.util.List;

// Esta clase nos representa a un registro de la tabla country
// Contiene toda la información necesaria
// Se llaman POJOs (Plain Java Object)
public class Country {
	private int country_id;
	private String country;
	private List<City> cities;
	
	public List<City> getCities() {
		return cities;
	}
	public void setCities(List<City> cities) {
		this.cities = cities;
	}
	public Country(int country_id, String country) {
		super();
		this.country_id = country_id;
		this.country = country;
	}
	public int getCountry_id() {
		return country_id;
	}
	public void setCountry_id(int country_id) {
		this.country_id = country_id;
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	@Override
	public String toString() {
		return "Country [country_id=" + country_id + ", country=" + country + ", cities=" + cities + "]";
	}

	
}

package com.trifulcas.DAO;

public class City {
	private int city_id;
	private int country_id;
	private Country country;
	private String city;
	
	public City(int city_id, int country_id, String city) {
		super();
		this.city_id = city_id;
		this.country_id = country_id;
		this.city = city;
	}
	public int getCity_id() {
		return city_id;
	}
	public void setCity_id(int city_id) {
		this.city_id = city_id;
	}
	public int getCountry_id() {
		return country_id;
	}
	public void setCountry_id(int country_id) {
		this.country_id = country_id;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public Country getCountry() {
		return country;
	}
	public void setCountry(Country country) {
		this.country = country;
	}
	@Override
	public String toString() {
		return "City [city_id=" + city_id + ", country_id=" + country_id + ", country=" + country + ", city=" + city
				+ "]";
	}
	
	
	
}

Los DAOs

package com.trifulcas.DAO;

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

// En esta clase vamos a implementar la lógica del CRUD
// Desde aquí accederemos a la base de datos
public class CountryDAO {
	// Tenemos una variable para almacenar la conexión
	private Connection con;
	private PreparedStatement st;
	private ResultSet rs;
	private static CityDAO cityDAO;

	public CountryDAO() {
		this("sakila");
	}

	public CountryDAO(String bd) {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + bd, "root", "");

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

	public void close() {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void loadDAO() {
		if (cityDAO == null) {
			cityDAO = new CityDAO();
		}
	}

	// cRud
	// Obtengo un pais por el ID
	public Country getCountry(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country where country_id=?";
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				return new Country(rs.getInt("country_id"), rs.getString("country"));
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	public Country fillCity(Country pais) {
		try {
			loadDAO();
			pais.setCities(cityDAO.getCityByCountry(pais.getCountry_id()));
			return pais;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// cRud
	// Obtengo todos los paises que tengan un texto
	public List<Country> getCountries(String texto) {
		try {
			List<Country> paises = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country where country like ?";
			st = con.prepareStatement(sql);
			st.setString(1, "%" + texto + "%");
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				paises.add(new Country(rs.getInt("country_id"), rs.getString("country")));
			}
			return paises;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// cRud
	// Obtengo todos los paises
	public List<Country> getCountries() {
		try {
			List<Country> paises = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country";
			st = con.prepareStatement(sql);

			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				paises.add(new Country(rs.getInt("country_id"), rs.getString("country")));
			}
			return paises;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// Crud
	// Para añadir hago lo mismo, le paso un pais
	public int addCountry(Country pais) {
		try {
			return addCountry(pais.getCountry());
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// Crud
	public int addCountry(String pais) {
		try {
			// Creo el sql
			String sql = "insert into country(country) values (?)";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais);
			// Ejecuto
			return st.executeUpdate();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// crUd
	// Para modificar
	public int updateCountry(Country pais) {
		try {
			String sql = "update country set country=? where country_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais.getCountry());
			st.setInt(2, pais.getCountry_id());
			// Ejeceuto
			return st.executeUpdate();

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

	// Cread un método deleteCountry al que le pasamos un id y nos borra el país con
	// ese id
	// cruD
	public int deleteCountry(int id) {
		try {
			String sql = "delete from country  where country_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setInt(1, id);
			// Ejecuto
			return st.executeUpdate();

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

	// cruD
	public int deleteCountry(Country pais) {
		try {

			return deleteCountry(pais.getCountry_id());

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

package com.trifulcas.DAO;

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

// En esta clase vamos a implementar la lógica del CRUD
// Desde aquí accederemos a la base de datos
public class CityDAO {
	// Tenemos una variable para almacenar la conexión
	private Connection con;
	private PreparedStatement st;
	private ResultSet rs;
	private static CountryDAO countryDAO;

	public CityDAO() {
		this("sakila");
	}

	public CityDAO(String bd) {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + bd, "root", "");
			
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}
	private void loadDAO() {
		if (countryDAO == null) {
			countryDAO = new CountryDAO();
		}
	}
	public void close() {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// cRud
	// Obtengo un pais por el ID
	public City getCity(int id) {
		try {
			loadDAO();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from city where city_id=?";
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				City ciudad = new City(rs.getInt("city_id"), rs.getInt("country_id"), rs.getString("city"));
				Country pais = countryDAO.getCountry(ciudad.getCountry_id());
				ciudad.setCountry(pais);
				return ciudad;
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	public List<City> getCityByCountry(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from city where country_id=?";
			List<City> cities = new ArrayList<>();
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				cities.add(getCity(rs.getInt("city_id")));
			}
			return cities;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

}

Los tests

package com.trifulcas.DAO;

import java.util.List;

public class Test {

	public static void main(String[] args) {
		// Usar la capa de DAO para crear un país llamado 'Utopía'
		CountryDAO countryDAO=new CountryDAO();
		
		// Lo añado usando el método por cadena
		countryDAO.addCountry("Utopía");
		
		// Lo añado usando un objeto de tipo Country
		Country utopia=new Country(0,"Utopía");
		countryDAO.addCountry(utopia);
		
		// Usar la capa de DAO para modificar el nombre 
		// del país de id 27 a 'República Dominicana'
		
		// Recupero el país
		Country repdom=countryDAO.getCountry(27);
		// Le cambio el nombre
		repdom.setCountry("República Dominicana");
		// Actualizo
		countryDAO.updateCountry(repdom);
		
		// Creo el país
		repdom=new Country(27,"República Dominicana");
		// Actualizo
		countryDAO.updateCountry(repdom);
		
		if (countryDAO.deleteCountry(12)==0) {
			System.out.println("No se ha podido eliminar");
		};
		
		List<Country> paises=countryDAO.getCountries("pa");
		System.out.println(paises);
		
		countryDAO.close();
	}

}

package com.trifulcas.DAO;

public class TestCiy {

	public static void main(String[] args) {
		CityDAO cityDAO=new CityDAO();
		
		City ciudad=cityDAO.getCity(1);
		
		System.out.println(ciudad);
		
		CountryDAO countryDAO=new CountryDAO();
		Country spain=countryDAO.getCountry(87);
		System.out.println(spain);
		spain=countryDAO.fillCity(spain);
		System.out.println(spain);
	}

}

DAO de city

package com.trifulcas.DAO;

public class City {
	private int city_id;
	private int country_id;
	private Country country;
	private String city;
	
	public City(int city_id, int country_id, String city) {
		super();
		this.city_id = city_id;
		this.country_id = country_id;
		this.city = city;
	}
	public int getCity_id() {
		return city_id;
	}
	public void setCity_id(int city_id) {
		this.city_id = city_id;
	}
	public int getCountry_id() {
		return country_id;
	}
	public void setCountry_id(int country_id) {
		this.country_id = country_id;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public Country getCountry() {
		return country;
	}
	public void setCountry(Country country) {
		this.country = country;
	}
	@Override
	public String toString() {
		return "City [city_id=" + city_id + ", country_id=" + country_id + ", country=" + country + ", city=" + city
				+ "]";
	}
	
	
	
}
package com.trifulcas.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// En esta clase vamos a implementar la lógica del CRUD
// Desde aquí accederemos a la base de datos
public class CityDAO {
	// Tenemos una variable para almacenar la conexión
	private Connection con;
	private PreparedStatement st;
	private ResultSet rs;
	private CountryDAO countryDAO;
	
	public CityDAO() {
		this("sakila");
	}

	public CityDAO(String bd) {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + bd, "root", "");
			countryDAO=new CountryDAO();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

	public void close() {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// cRud
	// Obtengo un pais por el ID
	public City getCity(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from city where city_id=?";
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				City ciudad= new City(rs.getInt("city_id"),rs.getInt("country_id"), rs.getString("city"));
				Country pais=countryDAO.getCountry(ciudad.getCountry_id());
				ciudad.setCountry(pais);
				return ciudad;
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	
}
package com.trifulcas.DAO;

public class TestCiy {

	public static void main(String[] args) {
		CityDAO cityDAO=new CityDAO();
		
		City ciudad=cityDAO.getCity(1);
		
		System.out.println(ciudad);

	}

}

Soluciones DAO

package com.trifulcas.DAO;

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

// En esta clase vamos a implementar la lógica del CRUD
// Desde aquí accederemos a la base de datos
public class CountryDAO {
	// Tenemos una variable para almacenar la conexión
	private Connection con;
	PreparedStatement st;
	ResultSet rs;

	public CountryDAO() {
		this("sakila");
	}

	public CountryDAO(String bd) {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + bd, "root", "");
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

	public void close() {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// cRud
	// Obtengo un pais por el ID
	public Country getCountry(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country where country_id=?";
			st = con.prepareStatement(sql);
			st.setInt(1, id);
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				return new Country(rs.getInt("country_id"), rs.getString("country"));
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// cRud
	// Obtengo todos los paises que tengan un texto
	public List<Country> getCountries(String texto) {
		try {
			List<Country> paises = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country where country like ?";
			st = con.prepareStatement(sql);
			st.setString(1, "%"+texto+"%");
			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				paises.add(new Country(rs.getInt("country_id"), rs.getString("country")));
			}
			return paises;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}
	// cRud
	// Obtengo todos los paises
	public List<Country> getCountries() {
		try {
			List<Country> paises = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country";
			st = con.prepareStatement(sql);

			rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				paises.add(new Country(rs.getInt("country_id"), rs.getString("country")));
			}
			return paises;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// Crud
	// Para añadir hago lo mismo, le paso un pais
	public int addCountry(Country pais) {
		try {
			return addCountry(pais.getCountry());
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// Crud
	public int addCountry(String pais) {
		try {
			// Creo el sql
			String sql = "insert into country(country) values (?)";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais);
			// Ejecuto
			return st.executeUpdate();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// crUd
	// Para modificar
	public int updateCountry(Country pais) {
		try {
			String sql = "update country set country=? where country_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais.getCountry());
			st.setInt(2, pais.getCountry_id());
			// Ejeceuto
			return st.executeUpdate();

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

	// Cread un método deleteCountry al que le pasamos un id y nos borra el país con
	// ese id
	// cruD
	public int deleteCountry(int id) {
		try {
			String sql = "delete from country  where country_id=?";
			st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setInt(1, id);
			// Ejecuto
			return st.executeUpdate();

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}
	// cruD
		public int deleteCountry(Country pais) {
			try {
				
				return deleteCountry(pais.getCountry_id());

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

package com.trifulcas.DAO;

import java.util.List;

public class Test {

	public static void main(String[] args) {
		// Usar la capa de DAO para crear un país llamado 'Utopía'
		CountryDAO countryDAO=new CountryDAO();
		
		// Lo añado usando el método por cadena
		countryDAO.addCountry("Utopía");
		
		// Lo añado usando un objeto de tipo Country
		Country utopia=new Country(0,"Utopía");
		countryDAO.addCountry(utopia);
		
		// Usar la capa de DAO para modificar el nombre 
		// del país de id 27 a 'República Dominicana'
		
		// Recupero el país
		Country repdom=countryDAO.getCountry(27);
		// Le cambio el nombre
		repdom.setCountry("República Dominicana");
		// Actualizo
		countryDAO.updateCountry(repdom);
		
		// Creo el país
		repdom=new Country(27,"República Dominicana");
		// Actualizo
		countryDAO.updateCountry(repdom);
		
		if (countryDAO.deleteCountry(12)==0) {
			System.out.println("No se ha podido eliminar");
		};
		
		List<Country> paises=countryDAO.getCountries("pa");
		System.out.println(paises);
	}

}

DAO primeros pasos

El POJO

package com.trifulcas.DAO;

// Esta clase nos representa a un registro de la tabla country
// Contiene toda la información necesaria
// Se llaman POJOs (Plain Java Object)
public class Country {
	private int country_id;
	private String country;
	public Country(int country_id, String country) {
		super();
		this.country_id = country_id;
		this.country = country;
	}
	public int getCountry_id() {
		return country_id;
	}
	public void setCountry_id(int country_id) {
		this.country_id = country_id;
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	@Override
	public String toString() {
		return "Country [country_id=" + country_id + ", country=" + country + "]";
	}
	
}

La capa DAO

package com.trifulcas.DAO;

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

// En esta clase vamos a implementar la lógica del CRUD
// Desde aquí accederemos a la base de datos
public class CountryDAO {
	// Tenemos una variable para almacenar la conexión
	private Connection con;

	public CountryDAO() {
		try {
			// Nos conectamos en el constructor, la variable con estará disponible
			// para todas las funciones de la clase DAO
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

	// cRud
	// Obtengo un pais por el ID
	public Country getCountry(int id) {
		try {
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country where country_id=?";
			PreparedStatement st = con.prepareStatement(sql);
			st.setInt(1, id);
			ResultSet rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			if (rs.next()) {
				return new Country(rs.getInt("country_id"), rs.getString("country"));
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// cRud
	// Obtengo todos los paises
	public List<Country> getCountries() {
		try {
			List<Country> paises = new ArrayList<>();
			// Lo hago igual que hasta ahora, SQL, STATEMENT, RESULTSET
			String sql = "select * from country";
			PreparedStatement st = con.prepareStatement(sql);

			ResultSet rs = st.executeQuery();
			// Si hay resultado construyo un país con los datos que me devuelve la consulta
			while (rs.next()) {
				paises.add(new Country(rs.getInt("country_id"), rs.getString("country")));
			}
			return paises;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}

	// Crud
	// Para añadir hago lo mismo, le paso un pais
	public int addCountry(Country pais) {
		try {
			return addCountry(pais.getCountry());
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// Crud
	public int addCountry(String pais) {
		try {
			// Creo el sql
			String sql = "insert into country(country) values (?)";
			PreparedStatement st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais);
			// Ejecuto
			return st.executeUpdate();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		return 0;
	}

	// crUd
	// Para modificar
	public int updateCountry(Country pais) {
		try {
			String sql = "update country set country=? where country_id=?";
			PreparedStatement st = con.prepareStatement(sql);
			// Añado el parámetro
			st.setString(1, pais.getCountry());
			st.setInt(2, pais.getCountry_id());
			// Ejecuto
			return st.executeUpdate();

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


Ejemplo de uso:

package com.trifulcas.DAO;

public class Test {

	public static void main(String[] args) {
		// Nosotros aquí no tenemos nada de sql
		// Hemos abstraído la comunicación con la BD
		Country spain;
	
		CountryDAO cdao=new CountryDAO();
		spain=cdao.getCountry(87);
		System.out.println(spain);
		Country foo=cdao.getCountry(1);
		System.out.println(foo);
		foo.setCountry("Guripandia");
		System.out.println(cdao.addCountry(foo));
		System.out.println(cdao.addCountry("bufasia"));
		System.out.println(cdao.getCountries());
		
		spain.setCountry("España");
		cdao.updateCountry(spain);
	}

}

Un ejemplo más

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Pagos2006 {

	public static void main(String[] args) {
		// Calcula los pagos realizados en 2006 y muestralo por la consola
		// Paso 1: SQL me voy al workbench
		String sql = "SELECT sum(amount) total FROM payment where year(payment_date)=2006 group by year(payment_date)";

		// Paso 2, monto la conexión y toda la mandanga
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			// Es lo mismo usar normal o preparado
			PreparedStatement st = con.prepareStatement(sql);
			// No añado parámetros, directo al resultset
			ResultSet rs = st.executeQuery();
			if (rs.next()) {
				Double total = rs.getDouble("total");
				System.out.println(total);
			} else {
				System.out.println("No hay pagos en esa fecha");
			}

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

		}
	}

}

PreparedStatement

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class StatementPreparado {

	public static void main(String[] args) {
		// ¿Qué es un procedimiento preparado?
		// Es la manera habitual hoy en día de hacer statements
		// Hemos visto en los ejemplos que las sentencias sql
		// normalmente las combinamos con variables
		// p. ej. "insert into category(name) values ('"+categoria+"')"
		// Lo puedo concatenar como estoy haciendo hasta ahora
		// pero puedo utilizar en vez de eso PreparedStatements
		// que son statements a los que les puedo pasar variables
		// 1.- Claridad, yo separo el sql de los valores
		// 2.- Eficiencia. Cuando hago un procedimiento preparado, si se repite la BD ya tiene cacheado el esquema
		// 3.- Protección contra inyección sql. Yo no sé que tiene la variable, puede tener sentencias sql
		// ¿Cómo hacer un procedimiento preparado? Muy parecido a normal
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el nombre del país");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			 // Yo creo un sql y allá donde tengo el parámetro (donde metía la variable)
			 // Pongo un interrogante
			 String sql="insert into country (country) values(?)";
			 // En vez de Statement uso PreparedStatement
	         PreparedStatement psst=con.prepareStatement(sql);
	         // Añado los valores de los parámetros
	         // Posición, valor
	         psst.setString(1, pais);
	         // Ejecuto
	         int res=psst.executeUpdate();
	         System.out.println("Se han insertado "+res+" registros");
	         psst.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class AddActors {

	public static void main(String[] args) {
		Connection con = null;
		PreparedStatement st = null;
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el número de actores");
		int cantidad = scanner.nextInt();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			String sql = "insert into actor (first_name,last_name) values (?,?);";
			st = con.prepareStatement(sql);
			for (int i = 1; i <= cantidad; i++) {
				System.out.println(sql);
				st.setString(1, "nombre"+i);
				st.setString(2, "apellido"+i);
				int res = st.executeUpdate(sql);
				System.out.println(res + " registros afectados");
			}
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());

		} finally {
			try {
				st.close();
				con.close();
			} catch (SQLException e) {

				e.printStackTrace();
			}

			scanner.close();
		}

	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class AddCategory {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el nombre de la categoría");
		String categoria = scanner.nextLine();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			String sql = "insert into category (name) values(?)";
			PreparedStatement st = con.prepareStatement(sql);
			st.setString(1, categoria);
			System.out.println(st);
			int res = st.executeUpdate();
			System.out.println(res + " registros afectados");
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class AddCountry {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el nombre del país");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			 String sql="insert into country (country) values(?)";
			 PreparedStatement st=con.prepareStatement(sql);
			 st.setString(1, pais);
	         int res=st.executeUpdate();
	         System.out.println("Se han insertado "+res+" registros");
	         st.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class DeleteCountry {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el id del país a eliminar");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
	          String sql="delete from country where country_id=?";
			 PreparedStatement st=con.prepareStatement(sql);
			 st.setString(1, pais);
	         int res=st.executeUpdate();
	         System.out.println("Se han eliminado "+res+" registros");
	         st.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

public class GetCountries {

	public static void main(String[] args) {
		// Buscar todos los países que tengan un texto determinado
		Scanner scanner = new Scanner(System.in);
		// Pido el texto
		System.out.println("Introduzca el texto a buscar");
		String texto = scanner.nextLine();
		try {
			// Hago lo estándar
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			// ¿Qué sql necesito?
			String sql = "select * from country where country like ?";
			System.out.println(sql);
			PreparedStatement st = con.prepareStatement(sql);
			st.setString(1, '%'+texto+'%');
			// Aquí no modificamos sino que seleccionamos, por lo tanto usamos
			// executeQuery para ejecutar y un ResultSet para almacenar los resultados
			ResultSet rs = st.executeQuery();
			// Si yo hago un bucle recorro todos los registros
			while (rs.next()) {
				System.out.println(rs.getString("country"));
				System.out.println(rs.getDate("last_update"));
			}
			// Al tener el tipo TYPE_SCROLL_INSENSITIVE puedo ir a registros determinados

			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		scanner.close();
	}

}

Resultset

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class GetCountries {

	public static void main(String[] args) {
		// Buscar todos los países que tengan un texto determinado
		Scanner scanner = new Scanner(System.in);
		// Pido el texto
		System.out.println("Introduzca el texto a buscar");
		String texto = scanner.nextLine();
		try {
			// Hago lo estándar
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			Statement st = con.createStatement();
			// ¿QUé sql necesito?
			String sql = "select * from country where country like '%"+texto+"%'";
			System.out.println(sql);
			// Aquí no modificamos sino que seleccionamos, por lo tanto usamos
			// executeQuery para ejecutar y un ResultSet para almacenar los resultados
			ResultSet rs=st.executeQuery(sql);
			// rs es un cursor, puntero o flecha, como lo queramos llamar
			// a los registros de la base de datos
			rs.next(); // Esto me coloca el cursor en el primer elemento
			System.out.println(rs.getString(2)); // Esto me imprime el nombre del primer país
			rs.next(); // Esto me coloca el cursor en el primer elemento
			System.out.println(rs.getString("country")); // Esto me imprime el nombre del segundo país
			// Si yo hago un bucle recorro todos los registros
			while(rs.next()) {
				System.out.println(rs.getString("country")); 			
			}	
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		scanner.close();
	}

}
package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class GetCountries {

	public static void main(String[] args) {
		// Buscar todos los países que tengan un texto determinado
		Scanner scanner = new Scanner(System.in);
		// Pido el texto
		System.out.println("Introduzca el texto a buscar");
		String texto = scanner.nextLine();
		try {
			// Hago lo estándar
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// ¿Qué sql necesito?
			String sql = "select * from country where country like '%"+texto+"%'";
			System.out.println(sql);
			// Aquí no modificamos sino que seleccionamos, por lo tanto usamos
			// executeQuery para ejecutar y un ResultSet para almacenar los resultados
			ResultSet rs=st.executeQuery(sql);
			// rs es un cursor, puntero o flecha, como lo queramos llamar
			// a los registros de la base de datos
			rs.next(); // Esto me coloca el cursor en el primer elemento
			System.out.println(rs.getString(2)); // Esto me imprime el nombre del primer país
			rs.next(); // Esto me coloca el cursor en el primer elemento
			System.out.println(rs.getString("country")); // Esto me imprime el nombre del segundo país
			// Si yo hago un bucle recorro todos los registros
			while(rs.next()) {
				System.out.println(rs.getString("country")); 			
			}	
			// Al tener el tipo TYPE_SCROLL_INSENSITIVE puedo ir a registros determinados
			rs.first();
			System.out.println(rs.getString("country")); // Esto me imprime el nombre del primer país
			rs.last();
			System.out.println(rs.getString("country")); // Esto me imprime el nombre del último país
			
			rs.absolute(4);
			System.out.println(rs.getString("country")); // Esto me imprime el nombre del último país
			
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		scanner.close();
	}

}

Lo habitual es hacerlo así:

ResultSet rs=st.executeQuery(sql);
			// Si yo hago un bucle recorro todos los registros
			while(rs.next()) {
				System.out.println(rs.getString("country")); 			
			}	

Soluciones ejercicios

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class AddCategory {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el nombre de la categoría");
		String categoria = scanner.nextLine();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			Statement st = con.createStatement();
			String sql = "insert into category (name) values ('" + categoria + "')";
			System.out.println(sql);
			int res = st.executeUpdate(sql);
			System.out.println(res + " registros afectados");
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class UpdatePayments {

	public static void main(String[] args) {
			try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			Statement st = con.createStatement();
			
			String sql = "update payment set amount=amount+0.5";
			System.out.println(sql);
			int res = st.executeUpdate(sql);
			System.out.println(res + " registros afectados");
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class AddActors {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el número de actores");
		int cantidad = scanner.nextInt();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
			Statement st = con.createStatement();
			for (int i = 1; i <= cantidad; i++) {
				String sql = "insert into actor (first_name,last_name) values ('actor"+i+"','actor"+i+"');";
				System.out.println(sql);
				int res = st.executeUpdate(sql);
				System.out.println(res + " registros afectados");
			}
			st.close();
			con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

Ejemplos JDBC

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class AddCountry {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el nombre del país");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
	         Statement st=con.createStatement();
	         int res=st.executeUpdate("insert into country (country) values('"+pais+"')");
	         System.out.println("Se han insertado "+res+" registros");
	         st.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

}

package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class DeleteCountry {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el id del país a eliminar");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
	         Statement st=con.createStatement();
	         int res=st.executeUpdate("delete from country where country_id="+pais);
	         System.out.println("Se han eliminado "+res+" registros");
	         st.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

	}

}


package com.trifulcas.country;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class UpdateCountry {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Introduzca el id del país a modificar");
		String id = scanner.nextLine();
		System.out.println("Introduzca el nuevo nombre");
		String pais = scanner.nextLine();
		try {
			 Class.forName("com.mysql.cj.jdbc.Driver");
			 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");
	         Statement st=con.createStatement();
	         int res=st.executeUpdate("update country set country='"+pais+"' where country_id="+id);
	         System.out.println("Se han modificado "+res+" registros");
	         st.close();
	         con.close();
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

	}

}