Salta el contingut

1. De files a Objectes

Finalment, per tancar la unitat, treballarem de manera natural: recuperarem dades de la base de dades, crearem objectes a partir del ResultSet i guardarem les dades a la base de dades.

Estudiarem una nova manera de crear els nostres POJO (i BEAN), utilitzant una llibreria moderna anomenada Lombok.

1.1. POJO, BEAN i Projecte Lombok

Hem de crear classes segons el nostre model orientat a objectes. Depenent de com haguem fet les classes, poden ser POJO o BEAN o un altre tipus de classes. Anem a entendre-ho (extret d'aquí: enllaç).

1.1.1. POJO

Això significa Plain Old Java Object. És una classe que:

  • No ha d'estendre cap classe.
  • No ha d'implementar cap interfície.
  • No ha de contenir anotacions específiques.

No hi ha restriccions en els modificadors d'accés dels camps. Poden ser privats, per defecte, protegits o públics. Tampoc és necessari incloure cap constructor en aquest.

Un exemple de POJO seria, per exemple:

Java
// AS POJO
public class Modul {
  // attributes
  String nom;
  int hores;
  double nota;
  // constructor
  public Modul(String nom, int hores, double nota) {
      this.nom = nom;
      this.hores = hores;
      this.nota = nota;
  }
  // getters
  public String getModul(){return this.nom;}
  public int getHores() {return this.hores;}
  public double getNota() {return this.nota;}

  @Override
  public String toString() {
      return "Modul{" + "nom=" + nom + ", hores=" + hores + ", nota=" + nota + '}';
  } 
}

Com podeu veure, un POJO és la mínima classe que podem fer.

1.1.2. BEAN

Els Beans són un tipus especial de POJO. Hi ha algunes restriccions perquè un POJO sigui un Bean.

  • Tots els JavaBeans són POJOs, però no tots els POJOs són JavaBeans.
  • Serializable, han d'implementar la interfície Serializable. No obstant això, alguns POJOs que no implementen la interfície Serializable es diuen POJOs perquè Serializable és una interfície marcadora i, per tant, no suposa una càrrega excessiva.
  • Els camps han de ser privats. Això proporciona un control complet sobre els camps.
  • Els camps han de tenir getters o setters o tots dos.
  • Ha d'haver-hi un constructor sense arguments en un Bean.
  • Els camps només s'accedeixen mitjançant el constructor o els getters i setters.
Java
// AS POJO
public class Modul {
  // attributes
  private String nom;
  private int hores;
  private double nota;
  // constructor
  public Modul() { }
  // getters
  public String getModul(){return this.nom;}
  public int getHores() {return this.hores;}
  public double getNota() {return this.nota;}
// setters
  public void getModul(){return this.nom;}
  public void getHores() {return this.hores;}
  public void getNota() {return this.nota;}

  @Override
  public String toString() {
      return "Modul{" + "nom=" + nom + ", hores=" + hores + ", nota=" + nota + '}';
  } 
}

Per resumir, les classes POJO i Beans s'utilitzen per definir objectes Java per augmentar la seva llegibilitat i reutilització. Els POJOs no tenen altres restriccions mentre que els beans són POJOs especials amb algunes restriccions.

1.1.3. Lombok

Independentment de si utilitzem POJO o BEAN, hi ha algunes tasques repetitives que hem de fer per crear les nostres classes. La majoria d'aquestes tasques són implementades pels IDE, com ara crear getters, setters, encapsular camps, crear constructors, etc. Project Lombok és una llibreria que evita fer aquestes tasques repetitives, i diem el que volem i la llibreria i el compilador fan la resta.

En aquest enllaç configuració de Lombok trobaràs com configurar la llibreria en cada gestor de projectes (gradle, maven, etc.) i en cada IDE (Netbeans, Eclipse, IntelliJ, etc.).

Un cop instal·lada, només cal dir mitjançant anotacions el que vols:

  • @Getter \(\rightarrow\) generarà tots els getters.
  • @Setter \(\rightarrow\) generarà tots els setters.
  • @Data \(\rightarrow\) tots els mètodes que necessiten un POJO, incloent ToString.
  • @AllArgsConstructor o @NoArgsConstructor \(\rightarrow\) generarà el constructor que vulguis.

Al següent vídeo s'explica com afegir la dependència de Gradle i utilitzar Lombok.

1.2. Carregant objectes

Anem a finalitzar amb un exemple:

1.2.1. Classe Persona

Aquesta classe és el POJO d'una persona. Crearà getters, setters, toString i els mètodes principals amb només unes poques línies i algunes anotacions.

Java
1
2
3
4
5
6
7
8
9
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Persona {
    private int idPersona;
    private String nombre;
    private String apellidos;
    private int edad;
}

Cal tenir en compte que amb Lombok la feina es fa fàcil.

1.2.2. Omplint un Array

Per omplir una estructura de dades des de la base de dades, primer cal obtenir les dades. Cal crear l'objecte Statement o PreparedStatement i executar la consulta.

La tasca principal és transformar el ResultSet en una llista, però és una tasca senzilla:

  • Recorre el ResultSet (amb next), i per a cada fila:
    • Crea un objecte amb els valors emmagatzemats a les columnes
    • Afegeix aquest objecte a la llista
Java
ArrayList<Persona> lasPersonas= new ArrayList();

ConnexioDB conDB=new ConnexioDB("Instituto");

Connection con=conDB.getConnexio();

String SQL="Select * from Persona" ;
// The statement
Statement st=con.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY);

// The execution
ResultSet rst=st.executeQuery(SQL);

if (!rst.next()){
    System.out.println("No people in DB");
}
else{
    rst.beforeFirst();
    while(rst.next()){
        Persona p= new Persona(
                rst.getInt(1),
                rst.getString(2),
                rst.getString(3),
                rst.getInt(4));
        System.out.println("Adding " +p);
        lasPersonas.add(p);
    }
}

System.out.println("Added " + lasPersonas.size() + " people");
rst.close();

Ara podràs canviar la informació en els objectes i, finalment, si s'ha fet alguna modificació, hauràs de guardar-la a la base de dades. Les preguntes són:

  • Com puc saber si s'ha actualitzat un objecte?
  • Com puc saber quin camp s'ha de desar?

Com pots veure, hi ha diverses tasques que requereixen un control de la modificació de les dades i com desar-les. Aquesta tasca serà fàcil amb ORM i l'estudiarem.

Versió Autor Data
0 Joan Gerard Camarena Juliol de 2021
1 Joan Gerard Camarena Octubre de 2022
2 Joan Gerard Camarena Setembre de 2024
3 Joan Gerard Camarena Octubre de 2025