GraalVMのnative-imageを少し試してみる

GraalVMのnative-imageがそろそろ色々使えそうなので、試してみる。

Javaやってる人は SDK Man は入ってると思うので、それ前提でメモします。
(SDK Man のインストールはこちら -> https://sdkman.io/ )

GraalVM のインストール

まずは、GraalVMのインストールを行う。

$ sdk install java 20.0.0.r11-grl

GraalVMを使ってnative-imageをinstallする

GraalVMのパッケージツールでnative-imageをinstallする。

$  gu install native-image

これでnative-imageのinstallが完了。

かんたんなJavaコードを書く

Sample.java

class Sample {
  public static void main(String[] args) {
   System.out.println("Hello World");
  }
}

Javaをコンパイルする。

$ javac Sample.java

コンパイルすると、classファイルができる。

Sample.class

native-imageでコンパイルする


$ native-image Sample sample // 最後のファイル名を指定しないと、デフォルトで小文字になる

下記、ファイルができる。

Sample

このファイルは実行できる。

./sample

比較する

JavaVMでの実行とnative-imageでの実行を比較する

$ time ./sample
real    0m0.007s
user    0m0.003s
sys     0m0.003s

======

$ time javac Sample
real    0m0.179s
user    0m0.110s
sys     0m0.035s

JavaVMの起動速度が入ってしまっていると思うが、結構違う。
JVMの起動後にどのくらい違うのかはまた次回。
あと、こんな1ファイルで使う人もいないと思うので、Jar での作成方法もまた次回。

MyBatisが色々てんこ盛りになっていい感じになっている件

久しぶりにSpringBootの環境構築をやろうかと思い、ORMをどうするか選定していたところ、MyBatisが結構進化していたので、メモ。

MyBatis3DynamicSql

  • XMLが不要になる
  • コード量が小さくなる
  • JavaでタイプセーフにSQLがかける(JOOQみたい)
  • https://mybatis.org/generator/quickstart.html

こんな感じでかけます。

        List<TableCode> records = mapper.selectByExample()
                .where(id, isEqualTo(3))
                .build()
                .execute();       

        List<TableCode> records = mapper.selectByExample()
                .where(id, isEqualTo(3))
                .or(description, isLike("f%"))
                .build()
                .execute();    

        List<TableCode> records = mapper.selectByExample()
                .where(id, isLessThan(10), and(description, isEqualTo("foo")))
                .or(description, isLike("b%"))
                .orderBy(id.descending())
                .build()
                .execute(); 

JOOQみたいに、タイプセーフでSQLがかけるのはとてもすごい進化だと思います。

FreeMarker Tempalte

前に書いたとおりのFreeMarker Templateは健在。XMLがいやでFreeMarkerにしたけど、複雑なクエリはやはりJavaコードじゃなくて、素のSQLの方がいいイメージなので、継続して使用します。

“`sample.ftl

select
*
from
sample_table
where
id = <@p name="param.id" />

<pre><code>こんな感じでかける。

from句とかを別のftlファイルにして、includeして使うことも可能です。

## Thymeleaf Template
Doma2とかでやっている2WaySQLがThymeleaf Templateで実現している。Doma2より書き方は野暮ったいけど、一応2waySQLはできる。

</code></pre>

SELECT * FROM names
WHERE 1 = 1
/<em>[# th:if="${not #lists.isEmpty(ids)}"]</em>/
AND id IN (/<em>[# mb:p="ids"]</em>/ 1 /<em>[/]</em>/)
/<em>[/]</em>/
ORDER BY id
“`

MyBatis Migrate

これは前からあったみたいなんだが、Flywayの陰に隠れて知らなかった。
機能的には十分っぽいので、試してみる。

詳細 => https://mybatis.org/migrations/

Mybatis Log Plugin (Intellijのみ)

これがあると、条件分岐があって、引数のバインドが全部終わったSQLを出力してくれるので、デバッグに便利です。
必需品かと思います。(Domaは標準でありますが)

https://plugins.jetbrains.com/plugin/10065-mybatis-log-plugin

最後に

タイプセーフでSQLかけるし、2WaySQLあるし、Migrateあるし、なんかMyBatisで全部OKなんじゃないかとおもいました。おそらくThymeleafは