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