[JAVA] J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus

Objectif

Je vais laisser un résumé du contenu qui a confirmé la convivialité de Quarkus, qui est un sujet brûlant dans les rues. Seul Get Started ne suffisait pas, j'ai donc essayé d'utiliser une API Web REST qui exploite PostgreSQL localement avec Hibernate.

Préparation préalable

Projet Maven

Terminez d'abord QUARKUS - CRÉATION DE VOTRE PREMIÈRE APPLICATION. L'état du projet ressemble à ceci.

$ tree ./
./
├── pom.xml
├── quarkus_quickstart.iml
└── src
    ├── main
    │   ├── docker
    │   │   └── Dockerfile
    │   ├── java
    │   │   └── com
    │   │       └── dsert
    │   │           └── quickstart
    │   │               ├── GreetingResource.java
    │   │               └── GreetingService.java
    │   └── resources
    │       ├── META-INF
    │       │   ├── microprofile-config.properties
    │       │   └── resources
    │       │       └── index.html
    │       └── application.properties
    └── test
        └── java
            └── com
                └── dsert
                    └── quickstart
                        ├── GreetingResourceTest.java
                        └── NativeGreetingResourceIT.java

PostgreSQL Faites une table ou quelque chose comme ça. Le DDL généré par IntelliJ ressemble à ce qui suit.

create database quarkus	with owner quarkus;

create table if not exists users
(
	id serial not null
		constraint users_pk
			primary key,
	name varchar(255) not null
);

Procédure de montage

Dépendances

Ajoutez la dépendance entre Hibernate et PostgreSQL à pom.xml, en vous référant à l'élément QUARKUS --EXTENSIONS. De plus, changez quarkus-resteasy en quarkus-resteasy-jsonb car vous ne pouvez pas demander et répondre en JSON avec la dépendance comme Get Started.

pom.xml


<dependencies>
  ...
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jsonb</artifactId>
  </dependency>

  <!-- Hibernate ORM specific dependencies -->
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-hibernate-orm</artifactId>
    <scope>provided</scope>
  </dependency>

  <!-- JDBC driver dependencies -->
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jdbc-postgresql</artifactId>
    <scope>provided</scope>
  </dependency>
</dependencies>

Valeur environnementale

Vous pouvez gérer les valeurs d'environnement dans application.properties comme décrit dans le QUARKUS - GUIDE DE CONFIGURATION DE L'APPLICATION. Décrivez les informations requises pour la connexion à la base de données comme suit.

src/main/resources/application.properties


quarkus.datasource.url: jdbc:postgresql://localhost:5432/quarkus
quarkus.datasource.driver: org.postgresql.Driver
quarkus.datasource.username: quarkus
quarkus.datasource.password: quarkus-pass

Code source

Entity Créez un objet Entity qui correspond à la table pour mapper les données.

src/main/java/com/dsert/quickstart/User.java


package com.dsert.quickstart;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name = "users")
public class User {
    private int id;
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Service Créez une classe de service pour les opérations DB.

src/main/java/com/dsert/quickstart/UserService.java


package com.dsert.quickstart;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.util.List;

@ApplicationScoped
public class UserService {
    @Inject
    EntityManager em;

    @Transactional
    public void createUser(String name) {
        User user = new User();
        user.setName(name);
        this.em.persist(user);
    }

    public List<User> getUsers() {
        return this.em.createNativeQuery("select * from users", User.class).getResultList();
    }
}

Resource Créez une classe de ressources qui gère les requêtes HTTP.

src/main/java/com/dsert/quickstart/UserResource.java


package com.dsert.quickstart;

import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class UserResource {
    @Inject
    UserService service;

    @POST
    public Map<String, String> createUser(User user) {
        this.service.createUser(user.getName());
        return Collections.singletonMap("message", "OK");
    }

    @GET
    public List<User> getUsers() {
        return this.service.getUsers();
    }
}

Contrôle de fonctionnement

Lancement d'application

Je veux le démarrer facilement, donc je le lance en mode développement au lieu de DockerImage.

mvn compile quarkus:dev                                                                                                                                                                    6.2m
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< com.d-sert:quarkus_quickstart >--------------------
[INFO] Building quarkus_quickstart 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ quarkus_quickstart ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ quarkus_quickstart ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- quarkus-maven-plugin:0.11.0:dev (default-cli) @ quarkus_quickstart ---
[INFO] Using servlet resources quarkus_quickstart/src/main/resources/META-INF/resources
Listening for transport dt_socket at address: 5005
2019-03-13 08:49:58,673 INFO  [io.qua.dep.QuarkusAugmentor](main) Beginning quarkus augmentation
2019-03-13 08:49:59,282 INFO  [io.qua.dep.QuarkusAugmentor](main) Quarkus augmentation completed in 609ms
2019-03-13 08:50:05,128 INFO  [io.quarkus](main) Quarkus 0.11.0 started in 6.638s. Listening on: http://127.0.0.1:8080
2019-03-13 08:50:05,130 INFO  [io.quarkus](main) Installed features: [agroal, cdi, hibernate-orm, jdbc-postgresql, narayana-jta, resteasy, resteasy-jsonb]

Requête HTTP

POST

$ curl -X POST -H 'Content-Type: application/json' 'http://localhost:8080/users' -d '{"name": "sert"}'
{"message":"OK"}

GET

$ curl 'http://localhost:8080/users'
[{"id":5,"name":"sert"}]

finalement

Je voulais vraiment me connecter à MySQL, mais il n'y a pas de pilote MySQL dans l'extension, Je l'ai fait avec PostgreSQL car je ne pouvais pas bien me connecter avec MariaDB Driver. J'essaierai de me venger bientôt avec MySQL.

Recommended Posts

J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de faire une authentification de base avec Java
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
J'ai essayé de casser le bloc avec java (1)
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
[Android] J'ai créé un écran de liste de matériaux avec ListView + Bottom Sheet
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (version inachevée ②)
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
J'ai créé un client RESAS-API en Java
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de créer un outil de comparaison des prix des produits Amazon dans le monde entier avec Java, l'API Amazon Product Advertising, l'API Currency (29/01/2017)
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
J'ai essayé d'interagir avec Java
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé de créer une application Web qui recherche les tweets avec vue-word cloud et examine la tendance de ce qui est écrit dans le profil associé
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
J'ai essayé de créer une application Android avec MVC maintenant (Java)
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "J'ai essayé de créer une fenêtre avec Bootstrap 3"
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
Je souhaite développer une application web!
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai essayé de résumer l'API Stream
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement
J'ai essayé de faire une sauvegarde automatique avec plus agréable + PostgreSQL + SSL + docker
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
J'ai essayé de créer une application d'apprentissage automatique avec Dash (+ Docker) part1 ~ Construction de l'environnement et vérification du fonctionnement ~
Une note que j'ai renoncé à essayer de créer une annotation personnalisée pour Lombok
J'ai essayé de mettre facilement CentOS-7 dans un PC dont je n'ai plus besoin
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de résoudre 10 questions précédentes sélectionnées qui devraient être résolues après l'inscription à AtCoder avec Java, API Stream
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'ai essayé de gérer les informations de connexion avec JMX