はじめに
以下では Quarkus による JAX-RS を使った簡単なアプリケーションを作成しました。
ここでは JPA を使い、データベースを利用したアプリケーションを作成していきます。
プロジェクトの作成
前回と同様に、Gradle でプロジェクトを作成します。 Gradle は 5系を想定します。
$ mkdir example-quarkus-jpa $ cd example-quarkus-jpa $ gradle init --type java-application $ rm src/main/java/example/quarkus/jpa/App.java $ rm src/test/java/example/quarkus/jpa/AppTest.java
Gradle 5 系の場合は gradle init
タスクでいくつか選択肢の入力が求められますが、全てデフォルトで良いです。
build.gradle
を以下のように編集します。
plugins { id 'java' id 'io.quarkus' version '0.23.2' } repositories { jcenter() } dependencies { implementation enforcedPlatform('io.quarkus:quarkus-bom:0.23.2') implementation 'io.quarkus:quarkus-resteasy-jsonb' implementation 'io.quarkus:quarkus-hibernate-orm' implementation 'io.quarkus:quarkus-jdbc-postgresql' }
quarkus-hibernate-orm
と quarkus-jdbc-postgresql
を追加しています。
レスポンスにモデルを JSON で返したいので quarkus-resteasy-jsonb
を使います。
前回と同様に settings.gradle
を以下のように定義します(quarkus プラグインが正式公開されれば不要となります)。
pluginManagement { repositories { mavenCentral() gradlePluginPortal() } resolutionStrategy { eachPlugin { if (requested.id.id == 'io.quarkus') { useModule("io.quarkus:quarkus-gradle-plugin:${requested.version}") } } } } rootProject.name = 'example-quarkus-jpa'
application.properties
に DB接続情報を定義しておきます。
$ touch src/main/resources/application.properties
以下のように編集します。
quarkus.datasource.url = jdbc:postgresql://localhost:5432/quarkus_db quarkus.datasource.driver = org.postgresql.Driver quarkus.datasource.username = quarkus quarkus.datasource.password = quarkus quarkus.hibernate-orm.database.generation=drop-and-create
Entity の作成
Entity を作成します。
$ touch src/main/java/example/quarkus/jpa/Gift.java
package example.quarkus.jpa; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Gift { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="giftSeq") private Long id; private String name; protected Gift() { } public Gift(String name) { this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
サービスの作成
サービスクラスを作成します。
$ touch src/main/java/example/quarkus/jpa/GiftService.java
面倒なので直接 EntityManager
を使っちゃいます。
package example.quarkus.jpa; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.transaction.Transactional; @ApplicationScoped public class GiftService { @Inject EntityManager em; @Transactional public Long createGift(String name) { Gift gift = new Gift(name); em.persist(gift); return gift.getId(); } public Gift getGift(Long id) { return em.find(Gift.class, id); } }
リソースの作成
最後にリソースです。
$ touch src/main/java/example/quarkus/jpa/GiftService.java
こちらは前回作成したものとだいたい同じです。
package example.quarkus.jpa; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/gifts") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class GiftResource { @Inject GiftService service; @POST @Path("/") public Long create(Gift gift) { return service.createGift(gift.getName()); } @GET @Path("/{id}") public Gift get(@PathParam("id") Long id) { return service.getGift(id); } }
データベースの起動
application.properties
で定義した quarkus_db
と、ユーザ quarkus
を準備します。
docker の場合は以下のようにします。
docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 \ --name postgres-quarkus-hibernate -e POSTGRES_USER=quarkus \ -e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=quarkus_db \ -p 5432:5432 postgres:10.5
アプリケーションの起動
アプリケーションを開発モードで起動します。
$ ./gradlew quarkusDev
http://localhost:8080/
にアクセスすると、リソースの一覧が見えます。
いくつかレコードを追加してみましょう。
$ curl -X POST -H 'Content-Type: application/json' 'http://localhost:8080/gifts' -d '{"name": "book"}' 1 $ curl -X POST -H 'Content-Type: application/json' 'http://localhost:8080/gifts' -d '{"name": "flower"}' 2
$ curl -X GET -H 'Accept: application/json' 'http://localhost:8080/gifts/1' {"id":1,"name":"book"}
取得できました。
ブラウザでも見てみましょう。
登録レコードの確認
psql でデータベースに接続します。
docker exec -it postgres-quarkus-hibernate psql -U quarkus -d quarkus_db
テーブルを見てみます。
quarkus_db=# \dt List of relations Schema | Name | Type | Owner --------+------+-------+--------- public | gift | table | quarkus (1 row)
レコードを見てみます。
quarkus_db=# select * from gift; id | name ----+-------- 1 | book 2 | flower (2 rows)
登録されていますね。
まとめ
JPA を使ったアプリケーションを Quarkus を使って作成しました。
JavaEE の API でアプリケーションが簡単に作成できました。
Quarkus はまだ 1.0 に達していませんが、少しずつ見ていきたいですね。
次回は Panache の利用方法について見ていきます。