きっかけ
年始が暇だから、何か作ろうと思い立った。
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みたいなもの。
前に調べたもののリンクを貼っておく。
インストールは、sdk install micronaut
sqlite
$sqlite3 -version 3.24.0 2018-06-04 14:10:15 95fbac39baaab1c3a84fdfc82ccb7f42398b2e92f18a2a57bce1d4a713cbaapl
sqlite関連
SqliteManager Version 4.8.1
まとめ
流れ
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直下
打つと、sqliteのCLIに入るので、テーブルを作成する。
適当に、下create table sample(id, name)
で、sampleテーブルを作る。
きちんとできているか確認するため、.table
を打つ。
そうすると、sampleって表示されるはず。
そしたら、一旦、sqliteのCLIを抜けるため、.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