[JAVA] Memo nach dem ersten Frühjahrsprojekt-Datenbank-

Einführung

Nur die Grundkenntnisse in reinem Java und DB Das Spring-Projekt hat sich von Anfang an nach den Turbulenzen beruhigt. Bitte geben Sie uns Ihre Eindrücke und Ihr Memorandum. : language_balloon: Der Inhalt des Artikels ist mehr als ein Tutorial und weniger als eine Übung. Es wurde nicht bestätigt, dass der angegebene Code funktioniert, daher dient er nur als Referenz. : bete:

Entwicklungsumgebung

Red Hat (Entwicklungsumgebung ist Cent) 7-Serie Java8 SpringBoot2.1.6 MySQL8-Serie STS

Über SpringDataJPA

Verwandte Begriffe sind schwierig. SpringDataJPA ist ein Framework, das eine JPA-Implementierung (Specification) (Hibernate) verwendet. Ich bin nicht zuversichtlich. Die für die dynamische Abfrageerstellung verwendete Kriterien-API ist eine JPA-Funktion, auf die Sie verweisen können. EclipseLink im Beispiel ist eine andere Implementierung als Hibernate, daher scheint es besser, nicht darauf zu verweisen. Aber [Seien Sie vorsichtig, da ich die Spring-Funktion anstelle der Hibernate-Funktion empfehle. ]] (https://qiita.com/suke_masa/items/392976749fce94a8ef1f#hibernate-validator%E3%81%AE-notblank-%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fbean-validation%E3%81%AE-notblank-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%97)

Die Kenntnis des Lebenszyklus einer Entität kann dazu beitragen, verdächtiges Verhalten wie das Hinzufügen oder Entfernen von Eltern-Kind-Beziehungen oder explizite Transaktionen zu beheben. https://qiita.com/Maruo110/items/4dc4a49aedd6323ebfdb

H2DB In-Memory-Datenbank.

Da es in Spring enthalten ist, können Sie die Datenbank verwenden, ohne RDBMS in der Umgebung vorzubereiten. Es wird jedes Mal initialisiert, wenn Sie die App ausführen. Da es beiläufig verwendet werden kann, kann es für Prototypen und Tests verwendet werden.

Die SQL-Syntax ist nur in H2DB verfügbar. Sie können jedoch auch eine andere RDBMS-ähnliche Syntax mit der Option mode verwenden, sie ist jedoch nicht perfekt. http://www.h2database.com/html/features.html#compatibility Ich konnte herausfinden, wie der Index der create-Anweisung im MySQL-Modus angegeben wird. Ich konnte keine gespeicherten, Trigger, winzigen Zuordnungen usw. aufnehmen. Erstens, wenn es hier ein Problem zu sein scheint, bedeutet dies, dass es zu sehr von der Datenbank abhängt. : küssen:

Über Entität

Wenn Sie es einfach machen, wird es eine Klasse mit nur Tabelleninformationen sein, aber Sie können ziemlich viel tun. : erröten: Es sieht so aus, als könnten Sie die Daten verarbeiten. : blush: Auch Rückrufmethoden, die zum Zeitpunkt vor der Datenaktualisierung (Persistenz) aufgerufen werden können, sind praktisch. Wenn Sie Folgendes verwenden: Verwirrt: AuditingEntityListener, können Sie die DI-Zielklasse verwenden, das Testen ist jedoch schwierig. : verwirrt: Es kann vererbt werden, aber es funktioniert nicht gut mit Lombok. : wütend :: wütend :: wütend: "Ich habe vorerst versucht, es zu verschieben" Wenn Sie versuchen, es als eine Form zu verwenden, die manchmal in der Probe zu sehen ist, wird es im Handumdrehen kompliziert. Trennen Sie also Form und Entität richtig.

Employee.java


@Entity
@Data
class Employee {
    @Id
    private long id;

    private String lastName;

    private String firstName;

    //Datenverarbeitung
    public String getFullName(){
      return this.lastName + this.firstName;
    }

    private Date updateDate;

    //Rückrufmethode
    @PreUpdate
    private void preUpdate() {
      setUpdateDate(new Date());
    }
}

Der Verein ist Onimon. Informationen im Osten und Westen sind verwirrt. Wenn Sie nicht frühzeitig prüfen, ob es sich um Eins oder Viele, gegenseitige Bezugnahme, verzögertes Abrufen, Vorgang zum Zeitpunkt des Löschens usw. handelt, wird der Einflussbereich weinen. : Freude:

Über das Repository

Wenn Sie eine Methode gemäß der Namenskonvention deklarieren, wird die Abfrage automatisch implementiert. Wenn Sie Zuordnungen für Anzahl, Existenz und Entität definiert haben, können Sie auch Spalten für verwandte Tabellen angeben (https://qiita.com/opengl-8080/items/05d9490d6f0544e2351a#%E3%83%A1%E3%82%) BD% E3% 83% 83% E3% 83% 89% E5% 90% 8D% E3% 81% 8B% E3% 82% 89% E3% 81% AE% E3% 82% AF% E3% 82% A8% E3% 83% AA% E8% 87% AA% E5% 8B% 95% E7% 94% 9F% E6% 88% 90). https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

Der Name ist in der Regel lang, daher ist es besser, ihn mit einem geeigneten Namen zu versehen.

Optional kann als Rückgabewert verwendet werden, verwenden Sie ihn also positiv.

findAll kann Suchbedingungen, Paging-Informationen und Sortierinformationen als Argumente übergeben. Fügen Sie beim Paging und Sortieren die Sortierbedingung in die Paging-Informationen ein. Beachten Sie, dass "select * ~" und "select count ~" beim Paging intern ausgegeben werden.

Über dynamische Abfragen

Ich habe die Spezifikation verwendet. Dies ist auch ein Dämonentor.

Die grundlegende Verwendung kann leicht eingeführt werden, aber wenn Sie versuchen, etwas ein wenig zu ändern, müssen Sie es oft verstehen. Insbesondere CriteriaAPI oder Lambda-Expression. Das Metamodell scheint nützlich zu sein, aber ich habe es diesmal nicht verwendet, weil es zu spät war, es zu wissen.

** ・ deutlich **

hogeSpecification.java


public Specification<Hoge> distinct() {
    @Override
    public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        cb.distinct(true);
        return cb.equal(root.get("id"),root.get("id")); //Muss wahr sein. letzter Ausweg.
    }
}

** etch holen ** Sie können sich mit root.join verbinden, aber wenn Sie dies nicht angeben


select *
   from a 
    innner join b1 on a.id = b1.id
    innner join b2 on a.id = b2.id
  where b1.id = {1}
    and b2.name = {2};

SQL, das derselben Tabelle beitritt, wurde mehrfach ausgegeben. Ich verstehe die Ursache oder die Lösung nicht. : hankey:

Wenn Sie mit einer abgerufenen Abfrage blättern möchten, müssen Sie die folgende Beschreibung eingeben. if (query.getResultType() != Long.class && query.getResultType() != long.class) Dies liegt daran, dass "select * ~" und "select count ~" während des Paging ausgegeben werden, aber während des Zählens nicht abgerufen werden können. Daher muss dies vermieden werden. .. .. Eh? : hankey: https://coderanch.com/t/656073/frameworks/Spring-Data-fetch-join-Specification

Basierend darauf sieht der Code so aus.

hogeSpecification.java


public Specification<Hoge> fetch() {
    @Override
    public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        if (query.getResultType() != Long.class && query.getResultType() != long.class){
            root.fetch("childTable", JoinType.LEFT); //Die zu verbindende Tabelle wird von Entity definiert
        }
        return cb.equal(root.get("id"),root.get("id")) //Muss wahr sein. letzter Ausweg.
    };
}

Es scheint, dass zwei oder mehr nicht abgerufen werden können und nicht für Eltern-Kind-Beziehungen verwendet werden können. Daher habe ich die Abfrageergebnisse verarbeitet und betrogen. Es ist schwierig. .. .. : hankey :: hankey:

** ・ Steuerung (bedingte Verzweigung, Schleife usw.) ** Wenn es sich um ein Beispiel handelt, können Sie alles mit einer Methodenkette verbinden, aber natürlich können Sie es in der Mitte schneiden. Die mehrspaltige Spezifikation der IN-Klausel in SQL (z. B. "where (name, id) in ((hoge, 1), (fuga, 2))") ist jetzt implementiert.

hogeService.java


public List<Hoge> serch(HogeForm form) {
    Specification<hoge>Suchbedingungen= 
        Specification
            .where(Suchbedingung 1)
            .and(Suchbedingung 2);

    //Bedingte Verzweigung
    if(Verzweigungszustand)Suchbedingungen=Suchbedingungen.and(Zusätzliche Suchbedingungen);

    //Wie eine Schleife
    Specification<hoge>Suchbedingungen für Schleifen= null;
    for(Schleife){
Suchbedingungen für Schleifen=Suchbedingungen für Schleifen.or(Wiederholte Suchbedingungen);
    }
Suchbedingungen=Suchbedingungen.and(Suchbedingungen für Schleifen);

    return hogeRepository.findAll(Suchbedingungen);
}

Weitere Hinweise

Memo nach dem ersten Frühlingsprojekt - Was ist Frühling? Memo nach dem ersten Frühjahrsprojekt-MVC-

Recommended Posts

Memo nach dem ersten Frühjahrsprojekt-Datenbank-
Memo nach dem ersten Frühjahrsprojekt-MVC-
Memo nach dem ersten Frühlingsprojekt-Was ist Frühling-
Spring Boot zum ersten Mal
Spring AOP zum ersten Mal
Frühlingsrückblick Memo
JJUG CCC Frühjahr 2018 Memo
Hinweise zur Verwendung von Spring Shell
Schreiben von Frühlingsstiefel-Memos (1)
Schreiben von Spring Boot-Memos (2)
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Ein Buch, das nach dem Eintritt des Ingenieurs in das Unternehmen gelesen wurde
Die erste WEB-Anwendung mit Spring Boot-Making a Pomodoro Timer-
[Persönliche Notizen] Über das Spring Framework
JJUG CCC 2018 Frühlingsbeteiligungsprotokoll
Spring Security-Nutzungsnotiz CSRF
Spring Framework Selbststudium Memo series_1
Spring Security-Nutzungsnotiz Run-As
Dies ist der erste Beitrag.
Sicherheit der Verwendungsnotizmethode für Spring Security
Spring Security-Nutzungsnotiz Remember-Me
Probieren Sie das Spring WebFlux-Tutorial aus
Spring Security-Nutzungsnotiz CORS
Spring Security-Verwendungsnotiztest
Memo zur Spring Boot Controller-Methode