Sari la conținut

[BackEnd] Construirea unei Clase de tip Model (2)


deja vu

Postări Recomandate

Obiectivele acoperite in acest tutorial :

Construirea unei clase de tip Model luand ca exemplu clasa Utilizatori (pentru proiectul nostru) care sa contina urmatoarele campuri

  • Cod Unic de Inregistrare (ID) exprimat in Long sau Numar Natural Distinct (Cheie Primara) ;
  • Nume de Utilizator exprimat in String (Sir de caracter) , unic si nenul ; 
  • Adresa de Mail exprimat in String (Sir de caracter) , unic si nenul ; 
  • Parola exprimata in String (Sir de caracter) si nenul ; (NU E NECESAR SA FIE UNIC) ;
  • Interdictie exprimat in valoare Booleana (True/False) ;
  • Data Nasterii exprimat in LocalDate (Data de Nastere) .

Sa incepem 

Vom avea nevoie de  un pachet (numit Model) , respectiv o clasa de tip Model numita "User" , pe care le vom construi la radacina proiectului 

 Untitled.png

Adnotam clasa Utilizatori ca "Entitate" (de tip Model) si setam numele tabelei "Utilizatori LeagueCS"

package com.example.demo.Model;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;

@Entity // Clasa de tip Model (ENTITATE SQL)
@Table(name = "Utilizatori LeagueCS") // Setam numele tabelei ("Utilizatori LeagueCS") ;
public class User {

}

 Adaugam campurile aferentei clasei Utilizatori mentionate la obiective cu caracteristicile lor

......
public class User {

    /////// Adaugam Campurile /////

    /// ID UTILIZATOR

    @Id // Cheie Primara (UNIC SI NENULA)
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // GENERARE AUTOMATA ID (DE LA 0 LA N ...)
    @Column(name = "ID UTILIZATOR") // NUMELE CAMPULUI IN BAZA DE DATE
    private Long idUserLeagueCS; // CAMPUL DIN MODEL


    /// NUME UTILIZATOR

    @NonNull // OBLIGATORIU IN CONSTRUCTIA OBIECTULUI (ADNOTARE LOMBOK)
    @Column(name="NUME UTILIZATOR" , unique = true , nullable = false) // NUMELE CAMPULUI IN BAZA DE DATE , UNICAT (NU TREBUIE SA EXISTE UTILIZATOR CU ACELASI NUME SAU FARA !! )
    @JsonProperty("username")
    private String nameUserLeagueCS;

    //// Adresa Mail Utilizator   (IDEM)

    @NonNull
    @Column(name="ADRESA MAIL",unique = true,nullable = false)
    @JsonProperty("emailAddess")
    private String emailAddressLeagueCS;

    //// Parola Utilizator (IDEM CU EXCEPTIA CA POATE FI GENERAL )

    @NonNull
    @Column(name="PAROLA",nullable = false)
    @JsonProperty("password")
    private String passwordLeagueCS;

    //// Interdictie Utilizator (IDEM DOAR CA E O VALOARE BOOLEANA , PORNESTE CU O VALOARE FALSA IMPLICIT)

    @Column(name="INTERDICTIE",nullable = false)
    @JsonProperty("forbidden")
    @Value("${props.forbidden:false}") // VALOARE DEFAULT "FALSE" care se poate modifica ulterior .
    private Boolean forbiddenLeagueCS;

    /// Data de Nastere

    @NonNull
    @Column(name="DATA NASTERE",nullable = false)
    @JsonProperty("bornDate")
    @JsonFormat(shape= JsonFormat.Shape.STRING,pattern = "dd/MM/yyyy") /// DATA DE NASTERE TREBUIE SA FIE IN FORMATUL "yyyy/MM/dd"
    // (De exemplu , "11/03/2024" , alte variatii NU sunt acceptate . )
    private LocalDate bornDateLeagueCS;
}

NOTA ** :  TEXTELE PRECEDATE DE "//" SUNT CONSIDERATE CA COMENTARII SI SUNT OMISE DE COMPILATOR !!! 

 Adaugam (prin Lombok) constructorii , implicit si cel cu parametrii , cei adnotati (Campurile) cu "NonNull" sunt luati in considerare ca Paramatrii  

 

......
@RequiredArgsConstructor // Constructor cu parametrii (aia adnotati cu "NonNull") ;
@NoArgsConstructor // Constructor Implicit (Default fara parametrii) ;
public class User {
  ....
}

Adaugam "getteri" si "setteri" (prin Lombok) pentru accesul si modificarea campurilor PRIVATE (acces indirect)

........
@Getter  // Adauga getteri pentru toate campurile 
@Setter // Adauga setteri pentru toate campurile 
public class User {
  .......
}

 Adaugam o functie derivata "toString" pentru afisare obiectului  in format "String" (Prin Lombok) 

....
@ToString
public class User {
  .....
}

Adaugam functiile derivate "hash" & "equal" pentru clasa noastra

.......
public class User {
.....
//////////// Functii Derivate

    @Override // Functie derivata din Clasa Object
    public int hashCode() // Genereaza un cod unic alocat fiecarui obiect in functie de algoritm
    {
        return (int) (idUserLeagueCS * nameUserLeagueCS.hashCode()
                        * emailAddressLeagueCS.hashCode() * passwordLeagueCS.hashCode()
                           *bornDateLeagueCS.hashCode() * forbiddenLeagueCS.hashCode()); // DUPA ACEST ALGORITM DE CALCUL , VA REZULTAT UN COD UNIC PENTRU
                                                                                           // FIECARE OBIECT ASOCIAT AL ACESTEI CLASE
    }

    @Override
    public boolean equals(Object otherUserLeagueCS)   /// COMPARA FIECARE OBIECT ASOCIAT AL ACESTEI CLASE
            // NE AJUTA SA AFLAM DACA MAI EXISTA UN UTILIZATOR CU ACELASI NUME & ADRESA DE MAIL
    {
        if(this.getClass() != otherUserLeagueCS.getClass())  // OBIECTUL LUAT LA COMPARATIE NU ESTE ASOCIAT CU CLASA NOASTRA
        {
             return false; // RETURNAM FALSE
        }

        if(this == otherUserLeagueCS) // OBIECTUL IN CAUZA ESTE O CLONA (CAZ IMPOSIBIL ORICUM)
        {
            return true; // RETURN TRUE 
        }
        
        else{
                // DACA AVEM ACELASI NUME SAU ADRESA DE MAIL INTRE UTILIZATORI INSEAMNA CA SUNT ASEMANATORI INTRE EI !! 
            return nameUserLeagueCS.equals(((User) otherUserLeagueCS).nameUserLeagueCS) || 
                         emailAddressLeagueCS.equals(((User) otherUserLeagueCS).emailAddressLeagueCS);
                                      
        }
    }
}

CODUL FINAL PENTRU MODEL AR TREBUI SA ARATE ASA

package com.example.demo.Model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.beans.factory.annotation.Value;

import java.time.LocalDate;

@Entity // Clasa de tip Model (ENTITATE SQL)
@Table(name = "Utilizatori LeagueCS") // Setam numele tabelei ("Utilizatori LeagueCS") ;
@RequiredArgsConstructor // Constructor cu parametrii (aia adnotati cu "NonNull") ;
@NoArgsConstructor // Constructor Implicit (Default fara parametrii) ;
@Getter
@Setter
@ToString
public class User {

    /////// Adaugam Campurile /////

    /// ID UTILIZATOR

    @Id // Cheie Primara (UNIC SI NENULA)
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // GENERARE AUTOMATA ID (DE LA 0 LA N ...)
    @Column(name = "ID UTILIZATOR") // NUMELE CAMPULUI IN BAZA DE DATE
    private Long idUserLeagueCS; // CAMPUL DIN MODEL


    /// NUME UTILIZATOR

    @NonNull // OBLIGATORIU IN CONSTRUCTIA OBIECTULUI (ADNOTARE LOMBOK)
    @Column(name="NUME UTILIZATOR" , unique = true , nullable = false) // NUMELE CAMPULUI IN BAZA DE DATE , UNICAT (NU TREBUIE SA EXISTE UTILIZATOR CU ACELASI NUME SAU FARA !! )
    @JsonProperty("username")
    private String nameUserLeagueCS;

    //// Adresa Mail Utilizator   (IDEM)

    @NonNull
    @Column(name="ADRESA MAIL",unique = true,nullable = false)
    @JsonProperty("emailAddess")
    private String emailAddressLeagueCS;

    //// Parola Utilizator (IDEM CU EXCEPTIA CA POATE FI GENERAL )

    @NonNull
    @Column(name="PAROLA",nullable = false)
    @JsonProperty("password")
    private String passwordLeagueCS;

    //// Interdictie Utilizator (IDEM DOAR CA E O VALOARE BOOLEANA , PORNESTE CU O VALOARE FALSA IMPLICIT)

    @Column(name="INTERDICTIE",nullable = false)
    @JsonProperty("forbidden")
    @Value("${props.forbidden:false}") // VALOARE DEFAULT "FALSE" care se poate modifica ulterior .
    private Boolean forbiddenLeagueCS;

    /// Data de Nastere

    @NonNull
    @Column(name="DATA NASTERE",nullable = false)
    @JsonProperty("bornDate")
    @JsonFormat(shape= JsonFormat.Shape.STRING,pattern = "dd/MM/yyyy") /// DATA DE NASTERE TREBUIE SA FIE IN FORMATUL "yyyy/MM/dd"
    // (De exemplu , "11/03/2024" , alte variatii NU sunt acceptate . )
    private LocalDate bornDateLeagueCS;

    //////////// Functii Derivate

    @Override // Functie derivata din Clasa Object
    public int hashCode() // Genereaza un cod unic alocat fiecarui obiect in functie de algoritm
    {
        return (int) (idUserLeagueCS * nameUserLeagueCS.hashCode()
                        * emailAddressLeagueCS.hashCode() * passwordLeagueCS.hashCode()
                           *bornDateLeagueCS.hashCode() * forbiddenLeagueCS.hashCode()); // DUPA ACEST ALGORITM DE CALCUL , VA REZULTAT UN COD UNIC PENTRU
                                                                                           // FIECARE OBIECT ASOCIAT AL ACESTEI CLASE
    }

    @Override
    public boolean equals(Object otherUserLeagueCS)   /// COMPARA FIECARE OBIECT ASOCIAT AL ACESTEI CLASE
            // NE AJUTA SA AFLAM DACA MAI EXISTA UN UTILIZATOR CU ACELASI NUME & ADRESA DE MAIL
    {
        if(this.getClass() != otherUserLeagueCS.getClass())  // OBIECTUL LUAT LA COMPARATIE NU ESTE ASOCIAT CU CLASA NOASTRA
        {
             return false; // RETURNAM FALSE
        }

        if(this == otherUserLeagueCS) // OBIECTUL IN CAUZA ESTE O CLONA (CAZ IMPOSIBIL ORICUM)
        {
            return true; // RETURN TRUE
        }

        else{
                // DACA AVEM ACELASI NUME SAU ADRESA DE MAIL INTRE UTILIZATORI INSEAMNA CA SUNT ASEMANATORI INTRE EI !!
            return nameUserLeagueCS.equals(((User) otherUserLeagueCS).nameUserLeagueCS) ||
                         emailAddressLeagueCS.equals(((User) otherUserLeagueCS).emailAddressLeagueCS);

        }
    }


}

Salvam iar cand rulam codul vom avea inregistrarea SQL in consola precum ca s-a adaugat tabela in baza de date

Untitled.png

Iar daca vizualizam in HeidiSQL (softul instalat cu MariaDB)  , conectandu ne cu credentialele aferente bazei de date vom avea

Untitled.png

PS 1 * : MULTUMESC PENTRU ATENTIE , PENTRU RECLAMATII , SUGESTII SI PROBLEME PM ME SAU COMENTARIU IN TOPIC ; 

PS 2 * : SURSA CREATA SI INSPIRATA DE CATRE MINE PENTRU UTILIZATORI LEAGUECS !! 

PS 3 * : DACA VA PLACE , NU UITATI SA LASATI O APRECIERE !! 

Link spre comentariu
Distribuie pe alte site-uri

Vizitator
Acest topic este acum închis pentru alte răspunsuri.
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate