LoginSignup
4
1

More than 1 year has passed since last update.

dbfluteとDOMA2の特徴とSQLの書き方の比較

Last updated at Posted at 2023-01-17

初めに

以前、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を使ってください。そんで感想を教えてください。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1