初めに
以前、O/Rマッパーの選定でdbfluteとDOMA2の比較調査をする機会があったのでメモ程度に。
公開してみたものの、あくまでも自分用メモの位置づけなので人に読まれる想定はしていないため、わかりづらい点があるかもしれませんがご容赦ください。
SQLの比較
実行したいSQL
SELECT
hoge.id,
, hoge.name
, hoge.age
, fuga.height
, fuga.weight
FROM
hoge
INNER JOIN
fuga
ON hoge.id = fuga.id
WHERE
hoge.id = 1234
dbfluteでの書き方
hogeBhv.selectEntity { // Bhv=From句
it.specify().columnId() // SELECT句
it.specify().columnName() // SELECT句
it.specify().columnAge() // SELECT句
it.setupSelect_Fuga() // ここでINNER JOIN
it.specify().specifyFuga().columnHeight() // SELECT句(結合先のテーブルは書き方が冗長になる)
it.specify().specifyFuga().columnWeight() // SELECT句(結合先のテーブルは書き方が冗長になる)
it.query().setId_Equal(1234) // WHERE句の条件指定
}
DOMA2(DSLスタイル)での書き方
// 自動生成されるクラス
val hoge = Hoge_()
val fuga = Fuga_()
// 以下、dbfluteと違ってDOMA2初見でも大体わかると思う。
// コメントをつけるまでもない。
entityql
.from(hoge)
.innerJoin(fuga) {
eq(hoge.id, fuga.id)
}.where {
eq(hoge.id, 1234)
}.select(
hoge.id,
hoge.name,
hoge.age,
fuga.height,
fuga.weight
).fetch()
dbfluteの特徴
メリット
- Entityを実際のDBを基に自動生成できる。
- 外部キー制約を基にEntity同士の関連付けも自動で行われる。
- 故にDBの変更に強い。
- タイプセーフなクエリビルドができる。
- 外だしSQLという機能を使えばSQLを直接書くこともできる。
デメリット
- 初見だとdbfluteの記法がわかりづらく、発行したいSQLがよくわからない。(前述)
- マイナー故に参考になる記事がほぼなく、使い方もクセ強めなので学習コスト高め。
- 複雑なSQLが表現できない。
- GROUP BYしてCOUNTするとか
- SELECT句で文字列結合するとか
- CASE文やIF文を使えない
- Entityクラス以外にもテーブルごとにBehaviorとかいろいろクラスが生成されるので、クラスの数がかなり増える。
複雑なSQLは書けないが、その代わりにシンプルなSQLを強制することで可読性が上がるというメリットも。
たぶん、そもそもSQLで複雑なことすんなよという作者の意図が含まれているんじゃないかと思う。
DOMA2の特徴
メリット
- DSLスタイルを利用すればタイプセーフなクエリビルドができる。
- DOMA2公式がDSLスタイルを推奨している。
- DOMA2の記法を知らなくても発行したいSQLが直観的にわかる。(前述)
- dbfluteよりも圧倒的に見やすい。
- 故に可読性高め。
- dbfluteよりもSQLの自由度が高い。
- Entityを実際のDBを基に自動生成できる。
- DAOスタイルを利用すればdbfluteで言う外だしSQLと同じことができる。
- Entityの項目にValueObjectを利用できる。(DDD信者が好きなやつ)
デメリット
- Entityの自動生成をした際に、dbfluteと違ってEntity同士の関連付けまではしてくれない。
- Entity同士の関連付けは実装者が手動でやらないといけないのでひと手間かかる。
- DSLスタイルの記事が少なく、学習コストがほんのり高め。(dbfluteほどではない)
どっちを選ぶのか
以前比較調査をしたときは、DOMA2の方が良さそうな気がしたけど、以下の要因により消去法でdbfluteを採用しました。
- GradleでDAOスタイルに必要な設定を入れたつもりが何かエラーになってDAOスタイルが使えなかった(原因不明のまま)
- SpringBootを使用していたが、やり方の問題かDao、Entityql、NativeSqlのDIが良い感じにできなかった。(原因不明のまま)
- 上記2つの原因調査に時間がかかるくらいならdbfluteで良いんじゃないかという意見が出た。
皆様はぜひDOMA2を使ってください。そんで感想を教えてください。