エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

intellij idea で micronaut + spring jdbc + sqliteのサンプル

きっかけ

年始が暇だから、何か作ろうと思い立った。
springbootでちゃっちゃと作ろうと思ったが、micronautで挫折したことを思い出し、再度チャレンジ。
とりあえず、動いたので、まとめる。

挫折したらそのままってのが、いつものパターンだったが、ゾンビランドサガを全話通して見て、再度チャレンジしたくなった。

まとめ

環境

OS

$sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54

Java

$java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)

Intellij IDEA

Intellij IDEA 2018.2.6 Community Edition

お金ないっす。。。
金がなくても、開発はできる。ちょっと手間が増えるだけ。

micronaut

$mn -V
| Micronaut Version: 1.0.2
| JVM Version: 11.0.1

インストールは、sdkmanを利用。
sdkmanは、Java関連の開発環境を用意するためのツール。
macのhomebrewみたいなもの。
前に調べたもののリンクを貼っておく。

suzaku-tec.hatenadiary.jp

インストールは、sdk install micronaut

sqlite

$sqlite3 -version
3.24.0 2018-06-04 14:10:15 95fbac39baaab1c3a84fdfc82ccb7f42398b2e92f18a2a57bce1d4a713cbaapl

sqlite関連

SqliteManager Version 4.8.1

まとめ

流れ

  1. micronaut初期化
  2. intellij にインポート
  3. とりあえずgoodmorning Saga!
  4. Sqliteにアクセスしてみる
    1. テストデータ用意
    2. spring jdbc + sqliteを追加
    3. ファクトリクラスの実装
    4. データアクセスサービスの実装
    5. コントローラクラスからDBアクセス
    6. 起動

micronaut初期化

まずは、micronautのプロジェクト作成から。

コマンドは、下記の通り

mn create-app {プロジェクト名}

このコマンドを打つと、カレントディレクトリにプロジェクト名のディレクトリが掘られて、gradle関連のソースが格納される。

今回は、mn create-app murakumoで作成

叢雲を選んだのは、個人のセンスです。

intellij にインポート

intellij を起動して、初期画面から import Project を選択してインポート。
インポートする際は、gradleのプロジェクトとしてインポートさせる。

じゃないと、いろいろエラーが出て挫折する。
たぶん、前回は、next連打してたから、気づかなかったのかも。。。
もしかしたら、import じゃなくて、openを選んで開いていたのかもしれない。

とりあえずgoodmorning Saga!

まずは、作ったら、goodmorning Saga!でしょ。
Hello Worldは、古い。

実装

package murakumo.controller;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/hello")
public class HelloController {

    @Get("/")
    public String index() {
        return "Goodmorning Saga!!";
    }
}

動作確認

下記コマンドで動かす。

$ ./gradlew run

そうすると、なんかビルドして動き出すはず。
自分の環境では、進捗が75%で止まるのだが、75%で localhost:8080/hello でアクセスすると、Goodmorning Saga!!が表示されるはず。
たぶんだが、75%のやつは、描画が更新されてないだけで、100%なんじゃなかろうか?

Sqliteにアクセスしてみる

今回は、いろいろORマッパーを探したけど、良さげなのがなかったので、Spring jdbcを使う。
本当は、脱springでやりたかったのだが、しょうがない。

テストデータ用意

まずは、DBの用意。
Sqliteは、DB作ると同時にtableも作らないとダメなので、ちょっとやっかい。

sqlite3 murakumo.db

カレントディレクトリは、murakumo直下

打つと、sqliteCLIに入るので、テーブルを作成する。 適当に、下create table sample(id, name)で、sampleテーブルを作る。
きちんとできているか確認するため、.tableを打つ。
そうすると、sampleって表示されるはず。

そしたら、一旦、sqliteCLIを抜けるため、.exitを打つ。
テーブルへのテストデータ投入は、sqlitemangerからやる。
sql文を打つのが早い人は、そっちでもいい。

spring jdbc + sqliteを追加

テストデータは用意できたので、今度はsqliteを利用するためのライブラリを追加する。

build.gradleのdependenciesに下記を追加。

    compile "io.micronaut.configuration:micronaut-jdbc-tomcat"
    compile 'org.springframework:org.springframework.jdbc:3.2.2.RELEASE'
    compile "io.micronaut:micronaut-spring"
    compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.25.2'

保存したら、勝手にライブラリのダウンロードが走るはず。

そしたら、今度は、jdbc接続用の設定を、application.ymlに追加する。
datasourcesが、今回追加した箇所。

micronaut:
    application:
        name: murakumo

datasources:
    default:
        url: jdbc:sqlite:murakumo.db
        driverClassName: org.sqlite.JDBC

ファクトリクラスの実装

今度は、jdbcアクセスようのDatasourceを生成するクラスを書く。
俺はよく知らないが、spring-jdbcは、こうやるものらしい。

package murakumo.factory;

import io.micronaut.context.annotation.Factory;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.sql.DataSource;

@Factory
public class JdbcTemplateFactory {

    @Inject
    DataSource dataSource;

    @Bean
    @Singleton
    JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }
}

JdbcTemplateを生成して返すだけ。

データアクセスサービスの実装

今度は、テーブルからデータを引っこ抜いてくるクラスを作る。

package murakumo.service;

import io.micronaut.context.annotation.Requires;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import javax.inject.Singleton;

@Singleton
@Requires(beans = JdbcTemplate.class)
public class TestService {

    private final JdbcTemplate jdbcTemplate;

    public TestService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Transactional
    public void printSampleTable() {
        jdbcTemplate.query("select * from sample", (rs) -> {
            System.out.println(rs.getString("id"));
            System.out.println(rs.getString("name"));
        });
    }

}

printSampleTableが実際にDBアクセスしている箇所。
ResultSetをLambda使って処理できるのは、今っぽい。
昔だと、resultSet取ってきたら、ぐるぐる回して結果を見るのが多かった。

コントローラクラスからDBアクセス

当然、アクセスは、DIしたものを使ってやる。
アノテーションは、@Injection でできるらしい。
Springは、たしか、@Autowired だったかな?
@Controllerや@Getは、Springに近い動きをするので、なんとなくわかる。

package murakumo.controller;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import murakumo.service.TestService;

import javax.inject.Inject;

@Controller("/hello")
public class HelloController {

    @Inject
    private TestService testService;

    @Get("/")
    public String index() {
        testService.printSampleTable();
        return "Goodmorning Saga!!";
    }
}

TestServiceをDIして、indexで使ってるだけ。

起動

./gradlew run で起動して、localhost:8080/helloにアクセス。

すると、ターミナルに、登録したデータが表示されるはず。

感想

なんでだ。。。
何に苦戦してたんだ、俺は。
すんなりできすぎて、逆に怖いんですけど。

あとは、spring-jdbcの知識がつけば、いろいろできそう。

組み込み系のDBは、もうsqlite一択な気がしてきたな。
mysqlやpostgressも考えたけど、環境準備するのが面倒くさいんだよね。
手軽に永続化できるのが、魅力だと思う。
docker使えば、mysqlとかの準備も楽そうな気もするが、dockerの習熟度がまだ足りない。

参考サイト

javaからsqliteに素早く書き込みたい - Qiita

Using Spring's JDBCTemplate with Micronaut

Spring Boot - Spring Boot MavenでSQLite3に接続したい。|teratail

データベースの作成と接続 - SQLite入門