[JAVA] Versuchen Sie, mit der REST-API nach einer Postleitzahl zu suchen, indem Sie die Klassen SpringBoot, H2 DB und JPA REST-Only 3 erstellen.

Überblick

Dieser Eintrag basiert auf Spring Boot und auf der Datenbank H2 Database Engine. ) Wird angegeben und ein Beispiel für den Zugriff mit Spring Data JPA wird zusammengefasst.

Als Thema stellte ich mir eine API vor, um nach einer Postleitzahl zu suchen. Wenn Sie beispielsweise einen Ort mit "Katze" nachschlagen, sieht dies wie in der folgenden Abbildung aus.

example_cat.png

Angenommener Leser

--Zum Referenzzweck für diejenigen, die das tun möchten, was der Eintragstitel sagt

Motivation für den Einstieg

――Da es mehrere Male gibt, nachdem Sie eine Vorlage erstellt haben, indem Sie sie von jeder Site irgendwie kopieren, um Ihre eigene Kesselplatte zu erstellen ――Weil es für jemanden hilfreich sein kann

Was können Sie mit diesem Eintrag machen?

Sie können nach Postleitzahlen und Adressen suchen, wie in der Abbildung am Anfang des Eintrags gezeigt.

Erstellen Sie eine API, um die Tabelle, in der die Postleitzahl und die Adresse gespeichert sind, mit den folgenden beiden Methoden zu durchsuchen.

  1. Geben Sie die Postleitzahl an, um eine Liste der entsprechenden Zeilen zu erhalten
  2. Geben Sie einen Teil des Ortsnamens an, um eine Liste der entsprechenden Zeilen zu erhalten

Nutzungsumgebung

Schritte zum Schreiben von Java-Code

Spring Initializr

Es sieht aus wie das.

initializr-settings.png

Das anfängliche GitHub-Tag ist hier.

Lassen Sie die H2-Konsole herauskommen

Die H2-Datenbank verfügt über WEB-Konsolenfunktionen, die Sie verwenden können, sobald Sie sie aktivieren. (Siehe Abbildung unten)

h2-console-sample.png

Geben Sie zum Aktivieren in application.yaml und application.yaml Folgendes an. Dies bedeutet, dass es nur während der Entwicklung aktiviert wird.

application.yaml ist wie folgt. Spring Boot JPA verfügt über eine Funktion, die DDL basierend auf @Entity ausgibt, wenn dies nicht besonders ausgeführt wird. Ich möchte DDL jedoch selbst angeben, daher habe ich hier angehalten.

Der Grund, warum "; database_to_upper = false" in der Verbindungszeichenfolge von H2 angegeben ist, besteht darin, dass der Tabellenname bei der Ausgabe von DDL in H2 standardmäßig in Großbuchstaben ausgerichtet ist, diese Funktion jedoch deaktiviert ist. Die JPA + Hibernate-Seite erwartet standardmäßig Kleinbuchstaben, daher haben wir sie dort ausgerichtet.

sqlScriptEncoding verhindert verstümmelte Zeichen in den Daten, die beim Start gelesen werden. (Beispielsweise versucht Windows Platform, mit der Plattformcodierung als SJIS (MS932) zu arbeiten.)

# properties: https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
spring:
  datasource:
    platform: h2
    driver-class-name: org.h2.Driver
    url: jdbc:h2:./demodb;database_to_upper=false
    username: username
    password: password
    sqlScriptEncoding: UTF-8
  h2:
    console:
      enabled: false

  jpa:
    hibernate:
      ddl-auto: none

application-dev.yaml ist wie folgt. Da es einfacher ist, die Bewegung zu sehen, wenn SQL protokolliert wird, wird jpa.show-log im Entwicklungsprofil als true angegeben.

# properties: https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
spring:
  h2:
    console:
      enabled: true
      path: /h2-consolea
      settings:
        web-allow-others: true
  jpa:
    show-sql: true # for debugging-purpose only. Because it shows everything, there's no ways to filter.
    properties:
      hibernate:
        format_sql: true

In diesem Zustand wird die WEB-Konsole aktiviert, indem das zu startende Federprofil wie unten gezeigt angegeben wird.

Für Power Shell: (In Spring Boot2 oder höher können Sie Parameter wie unten gezeigt an bootRun übergeben.)

.\gradlew bootRun --args='--spring.profiles.active=dev'

Sie können sich unter http: // localhost: 8080 / h2-console, angegeben in der Einstellungsdatei, mit dem in der Einstellungsdatei angegebenen Benutzernamen und Kennwort anmelden (siehe Abbildung unten).

h2-console-login.png

Versuchen Sie, beim Start Daten zu laden

Spring Boot verfügt über eine Funktion zum Lesen von SQL des DB-Schemas und eine Funktion zum Lesen von DB-Daten beim Start.

Jedes kann erreicht werden, indem Dateien unter src / main / resources abgelegt werden.

Bei Verwendung oder Umschaltung zwischen mehreren Datenquellen ist jede Datenbank eindeutig Die Syntax kann unterschiedlich sein. In diesem Fall können Sie damit umgehen, indem Sie eine Datei für Ihre Schreibplattform ablegen. (Hier gibt es eine Erklärung)

In diesem Beispiel haben wir die folgenden Dateien vorbereitet. Als Beispiel verwenden wir ein Schema, in dem Postleitzahlen und Adressen gespeichert sind.

Ich erstelle eine Tabelle mit src / data / resources / schema-h2.sql. Da es sich um einen Prozess handelt, der jedes Mal ausgeführt wird, wird IF NOT EXISTS angehängt. Ich entschied mich für die H2-Funktion, um die ID zuzuweisen.

CREATE TABLE IF NOT EXISTS
postal_codes (
  id          BIGINT PRIMARY KEY AUTO_INCREMENT,
  code7 VARCHAR(7) NOT NULL,
  address1 VARCHAR(12) NOT NULL,
  address2 VARCHAR(60),
  address3 VARCHAR(60)
  );

In src / data / resources / data-h2.sql werden 2 Anfangsdaten eingegeben. Hauptsächlich zur Überprüfung des Betriebs während der Entwicklung. Ich bin einsam, wenn es leer ist. Dies ist auch ein Prozess, der bei jedem Start ausgeführt wird, sodass SQL so eingestellt ist, dass es nicht dupliziert wird.

INSERT INTO postal_codes (code7, address1, address2, address3) select  '0640941', 'Hokkaido', 'Chuo-ku, Sapporo', 'Asahigaoka' where not exists (select * from postal_codes where code7 = '0640941');
INSERT INTO postal_codes (code7, address1, address2, address3) select  '0600041', 'Hokkaido', 'Chuo-ku, Sapporo', 'Odori Higashi' where not exists (select * from postal_codes where code7 = '0600041');

(Bonus) Lesen Sie CSV zum Testen mit der CSV READ-Funktion von H2

H2 kann Daten aus CSV lesen und auswählen. Verwenden Sie dazu auf der Website zum Herunterladen von Postleitzahleninformationen der Post die Datei "KEN_ALL", die die Daten für das gesamte Land enthält. Verwenden Sie CSV.

Führen Sie auf der oben genannten H2 WEB-Konsole Folgendes aus. Da die CSV-Daten keinen Spaltennamen enthielten, wird der Spaltenname als Option von CSVREAD angegeben und ausgewählt. Das Ergebnis wird in der Tabelle postal_codes gespeichert.

insert into postal_codes (code7, address1, address2, address3) select "col3", "col7", "col8", "col9" from csvread('~/KEN_ALL.CSV', 'col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col2,col3,col4,col15', 'charset=SJIS')

Zu diesem Zeitpunkt haben Sie die Daten zum Abfragen.

Java-Code

Es gibt nur drei.

ij-image.png

Main

Es ist die übliche Spring Boot-Anwendung.

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

Entity

Bereiten Sie eine Klasse zum Laden von Daten aus der Datenbank vor. Spring Data JPA verfügt auch über eine Funktion, die automatisch eine entsprechende Tabelle aus dem Klassennamen erstellt, ohne @Table anzugeben. Diese Funktion wird hier jedoch explizit angegeben.

Setter / Getter wird automatisch mit lombok generiert. Die "ID", der @ javax.persistense.Id zugewiesen ist, entspricht der automatisch mit H2 nummerierten.

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "`POSTAL_CODES`")
@Data
public class PostalCodeInfo {
    @Id
    private long id;
    private String code7;
    private String address1;
    private String address2;
    private String address3;
}

Repository

Die Repository-Schicht. Durch das Erben von "PagingAndSortingRepository", Spring Data JPA, stellt REST die Implementierung bereit, die für den DB-Zugriff und den REST-Zugriff von außen erforderlich ist.

Die Parameter in der Annotation @RepositoryRestResource werden auch auf der Framework-Seite ohne spezielle Spezifikation angegeben, in diesem Beispiel jedoch explizit angegeben.


@RepositoryRestResource(collectionResourceRel = "postalcode", path = "postalcodes")
public interface PostalCodeInfoRepository extends PagingAndSortingRepository<PostalCodeInfo, Long> {

    List<PostalCodeInfo> findByCode7(@Param("code") String code);

    @Query("SELECT p FROM PostalCodeInfo p "
            + "WHERE address1 LIKE CONCAT('%',:name,'%')"
            + " OR address2 LIKE CONCAT('%',:name,'%')"
            + " OR address3 LIKE CONCAT('%',:name,'%')"
            + " ORDER BY p.code7")
    List<PostalCodeInfo> anyFieldLike(@Param("name") String name);
}

Es gibt zwei Methoden, aber die erste wird gemäß den Spring Data JPA-Namensregeln benannt. Für Methoden, die Namensregeln folgen, implementiert das Framework die entsprechenden SQL-Anweisungen und -Parameter. Dies ist also der einzige Code, den Sie benötigen, um eine Adresse aus der 7-stelligen Postleitzahl zu finden.

    List<PostalCodeInfo> findByCode7(@Param("code") String code);

Bei der anderen Methode geben Sie die Abfrage selbst an. Es gibt drei Spalten, die sich auf die Adresse beziehen, aber Sie werden nach einer Übereinstimmung mit LIKE suchen.

    @Query("SELECT p FROM PostalCodeInfo p "
            + "WHERE address1 LIKE CONCAT('%',:name,'%')"
            + " OR address2 LIKE CONCAT('%',:name,'%')"
            + " OR address3 LIKE CONCAT('%',:name,'%')"
            + " ORDER BY p.code7")
    List<PostalCodeInfo> anyFieldLike(@Param("name") String name);

Fügen Sie den Code an dieser Stelle auf GitHub ein als Tag 0.1.0 einfügen.

abschließend

Recommended Posts

Versuchen Sie, mit der REST-API nach einer Postleitzahl zu suchen, indem Sie die Klassen SpringBoot, H2 DB und JPA REST-Only 3 erstellen.
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ② ~ Bildschirm- und Funktionserstellung ~
So erstellen Sie überall eine H2-Datenbank
Erstellen wir eine REST-API mit WildFly Swarm.
Erstellen Sie in CentOS8.2 einen privaten / öffentlichen Schlüssel und stellen Sie mit VS Code eine Verbindung zu SSH her
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ~ ~ Validierung hinzufügen ~
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
8 Dinge, die mit Spring Boot und JPA in die DB eingefügt werden müssen
So erstellen und starten Sie eine Docker-Datei für Payara Micro
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0