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);
}
}