[JAVA] Essayez de rechercher un code postal avec l'API REST en utilisant SpringBoot, H2 DB et JPA REST-seulement 3 classes à créer-

Aperçu

Cette entrée est basée sur Spring Boot et sur la base de données H2 Database Engine ) Est spécifié, et un exemple d'accès avec Spring Data JPA est résumé.

En tant que sujet, j'ai imaginé une API pour rechercher un code postal. Par exemple, si vous recherchez un endroit avec "chat" dedans, il ressemble à la figure ci-dessous.

example_cat.png

Lecteur supposé

Motivation à l'entrée

―― Puisqu'il y a plusieurs fois pour commencer après avoir fait un modèle en copiant de chaque site d'une manière ou d'une autre, pour créer votre propre plaque chauffante ――Parce que cela peut être utile pour quelqu'un

Que pouvez-vous faire avec cette entrée

Vous pouvez rechercher des codes postaux et des adresses comme indiqué dans la figure au début de l'entrée.

Créez une API pour rechercher la table qui stocke le code postal et l'adresse par les deux méthodes suivantes.

  1. Spécifiez le code postal pour obtenir une liste des lignes correspondantes
  2. Spécifiez une partie du nom de lieu pour obtenir une liste des lignes correspondantes

--Sur la page du bureau de poste puisque vous pouvez télécharger le code postal, chargez-le dans la base de données pour un accès REST.

environnement d'utilisation

Étapes pour écrire du code Java

Spring Initializr

Ça ressemble à ça.

initializr-settings.png

La balise GitHub initiale est ici.

Laisser la console H2 sortir

La base de données H2 est livrée avec la fonctionnalité de console WEB que vous pouvez utiliser dès que vous l'activez. (Voir la figure ci-dessous)

h2-console-sample.png

Pour l'activer, spécifiez ce qui suit dans application.yaml et application.yaml, ce qui signifie qu'il ne sera activé que pendant le développement.

application.yaml est le suivant. Spring Boot JPA a une fonction pour émettre du DDL basé sur @Entity lorsque ce n'est pas fait en particulier, mais je veux spécifier DDL par moi-même, alors je me suis arrêté ici.

La raison pour laquelle "; database_to_upper = false" est spécifié dans la chaîne de connexion de H2 est que le nom de la table est aligné en majuscules lors de l'émission de DDL par défaut dans H2, mais cette fonction est désactivée. Le côté JPA + Hibernate attend des lettres minuscules par défaut, nous les avons donc alignées là-bas.

sqlScriptEncoding empêche les caractères déformés dans les données lues au démarrage. (Par exemple, la plate-forme Windows essaie de fonctionner avec le codage de la plate-forme en tant que SJIS (MS932))

# 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 est la suivante. Comme il est plus facile de voir le mouvement si SQL est journalisé, jpa.show-log est spécifié comme true dans le profil de développement.

# 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

Dans cet état, la console WEB est activée en spécifiant le profil Spring à démarrer comme indiqué ci-dessous.

Pour Power Shell: (Dans Spring Boot2 ou version ultérieure, vous pouvez transmettre des paramètres à bootRun comme indiqué ci-dessous)

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

Vous pouvez vous connecter à http: // localhost: 8080 / h2-console spécifié dans le fichier de configuration avec le jeu de nom d'utilisateur et de mot de passe spécifié dans le fichier de configuration (voir la figure ci-dessous).

h2-console-login.png

Essayez de charger les données au démarrage

Spring Boot a une fonction pour lire le SQL du schéma DB et une fonction pour lire les données DB au démarrage.

Chacun peut être réalisé en plaçant les fichiers sous src / main / resources.

Lors de l'utilisation ou du basculement entre plusieurs sources de données, chaque base de données est unique La syntaxe peut être différente, auquel cas vous pouvez la gérer en mettant un fichier pour votre plateforme d'écriture. (Il y a une explication ici)

Dans cet exemple, nous avons préparé les fichiers suivants. À titre d'exemple, nous utilisons un schéma qui stocke les codes postaux et les adresses.

Je crée une table avec src / data / resources / schema-h2.sql. Puisqu'il s'agit d'un processus qui s'exécute à chaque fois, IF NOT EXISTS est attaché. J'ai décidé d'utiliser la fonction H2 pour attribuer l'ID.

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

Dans src / data / resources / data-h2.sql, 2 données initiales sont entrées. Principalement pour vérifier le fonctionnement pendant le développement. Je suis seul quand il est vide. Il s'agit également d'un processus qui s'exécute à chaque fois qu'il est démarré, le SQL est donc défini de manière à ne pas être dupliqué.

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) Lisez CSV pour tester en utilisant la fonction CSV READ de H2

H2 peut lire les données CSV et les sélectionner. En utilisant cela, à partir du [site de téléchargement d'informations sur les codes postaux] du bureau de poste (https://www.post.japanpost.jp/zipcode/download.html), le fichier «KEN_ALL». Utilisez CSV.

Sur la console H2 WEB mentionnée ci-dessus, exécutez ce qui suit. Comme il n'y avait pas de nom de colonne dans les données CSV, le nom de colonne est spécifié comme une option de CSVREAD et sélectionné. Le résultat est stocké dans la table postal_codes.

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')

À ce stade, vous disposez des données à interroger.

Code Java

Il n'y en a que trois.

ij-image.png

Main

C'est l'application Spring Boot habituelle.

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

Entity

Préparez une classe pour charger des données à partir de la base de données. Spring Data JPA a également une fonction qui crée automatiquement une table correspondante à partir du nom de la classe sans spécifier @Table, mais elle est explicitement spécifiée ici.

Setter / Getter est généré automatiquement en utilisant lombok. L '"id" auquel @ javax.persistense.Id est attribué correspond à celui automatiquement numéroté par H2.

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

La couche du référentiel. En héritant de "PagingAndSortingRepository", Spring Data JPA, REST fournira l'implémentation requise pour l'accès à la base de données et l'accès REST de l'extérieur.

Les paramètres de l'annotation @RepositoryRestResource sont également donnés par le framework sans aucune spécification particulière, mais dans cet exemple, ils sont explicitement spécifiés.


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

Il existe deux méthodes, mais la première est nommée selon les règles de dénomination Spring Data JPA. Pour les méthodes qui suivent les règles de dénomination, le framework implémente les instructions et paramètres SQL correspondants. C'est donc le seul code dont vous avez besoin pour trouver une adresse à partir du code postal à 7 chiffres.

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

Dans l'autre méthode, vous spécifiez vous-même la requête. Il y a trois colonnes liées à l'adresse, mais vous rechercherez une correspondance avec LIKE parmi elles.

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

Mettez le code à ce stade sur GitHub mettez-le sous la forme de balise 0.1.0.

en conclusion

Cette entrée a couvert un exemple utilisant Spring Boot, H2 DB et Spring Data REST. Il a été confirmé que la quantité de code à écrire était considérablement réduite tant que la plage fournie par le cadre pouvait être atteinte.

Supplément

J'ai réfléchi à ce qu'il fallait faire avec les trois packages de placement de code pendant un moment, mais dans cet exemple, je les ai simplement mis tous dans le même dossier. Selon le style, vous pouvez le placer dans n'importe quelle position que vous aimez.

Recommended Posts

Essayez de rechercher un code postal avec l'API REST en utilisant SpringBoot, H2 DB et JPA REST-seulement 3 classes à créer-
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ② ~ Création d'écran et de fonctions ~
Comment créer une base de données H2 n'importe où
Créons une API REST à l'aide de WildFly Swarm.
Créez une clé privée / clé publique dans CentOS8.2 et connectez-vous à SSH avec VS Code
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ③ ~ Ajouter une validation ~
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
8 choses à insérer dans DB en utilisant Spring Boot et JPA
Comment créer et lancer un Dockerfile pour Payara Micro
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0