DBアクセスフレームワークDoma2の紹介

| 3 min read
Author: koshiro-fukushima koshiro-fukushimaの画像

業務で使用させていただいおりますDBアクセスフレームワークDoma2を紹介させていただきます。(とても重宝しております。)導入方法等の詳細については公式サイトをご覧ください。

Contents

特徴(公式から引用)

#
  • 注釈処理を使用して コンパイル時 にコードの生成やコードの検証をする
  • データベース上のカラムの値を振る舞いを持った Java オブジェクトにマッピングできる
  • 2-way SQL と呼ばれる SQL テンプレートを利用できる
  • Java 8 の java.time.LocalDate や java.util.Optional や java.util.stream.Stream を利用できる
  • JRE 以外のライブラリへの依存が一切ない

導入

#

ちょっと試したい人向けに、ひな型プロジェクトが提供されております。(詳しい導入手順は公式サイトに載っておりますのでそちらを参考に)

 git clone https://github.com/domaframework/simple-boilerplate.git

検索クエリはSQLファイルと1対1のインターフェースを用意するだけで実装できます。

インターフェース側(サンプルより抜粋)

@Dao(config = AppConfig.class)
public interface EmployeeDao {
// (中略)
@Select
Employee selectById(Integer id);
// (中略)

SQLファイル(サンプルより抜粋)

select
/*%expand*/*
from
employee
where
id = /* id */0

→ /* id */ の部分はメソッドのパラメータid と置き換えられて実行されます。

単一エンティティの更新・挿入・削除操作はインターフェースを用意し、エンティティクラスを引数に、@Insert/@Update/@Deleteのアノテーションを設定するだけでOKです。(SQLファイルを準備する必要はありません)

インターフェース側(サンプルより抜粋)

@Dao(config = AppConfig.class)
public interface EmployeeDao {
// (中略)
@Insert
int insert(Employee employee);

@Update
int update(Employee employee);

@Delete
int delete(Employee employee);
// (中略)

便利機能のご紹介

#

以上のように、いろいろ便利なのですが個人的に便利だと思った機能をかいつまんで紹介させていただきます。

  • 2-way SQL
    SQLテンプレートの文法はSQLのブロックコメント /* */ をベースにしたもので あるためコメントアウトされたものとして 静的な SQL としても実行できます。

  • Doma-Gen2 を使ったエンティティの自動生成
    わざわさ自分でエンティティを作成しなくても付属のツールでDDLから自動で作成してくれます。(なんと便利な)

  • 条件式の構築でIF文やFOR文が使える。
    条件が不一致でwhere句以降の構文が出力されない場合、where は自動的に除去されます。次のサンプルにはありませんが、複数条件の and が出力されなかった場合も自動的に除去されます。参考:条件ディレクティブの句の削除

-- IF文
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
-- FOR文
select * from employee where
/*%for name : names */
employee_name like /* name */'hoge'
/*%if name_has_next */
/*# "or" */
/*%end */
/*%end*/

最後に

#

環境構築についてはかなり端折って書きました。通常は Spring Framework 等のDIコンテナと組み合わせるのがメジャーな使い方です。とても便利なDBアクセスフレームワークです。よかったら選択肢の1つとしていかがでしょうか。

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)
  2. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  3. GitHub Codespaces を使いはじめる (2022-05-18)
  4. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  5. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  6. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  7. Nuxt3入門(第3回) - ユニバーサルフェッチでデータを取得する (2022-10-06)
  8. 第1回 OpenAPI Generator を使ったコード生成 (2022-06-04)
  9. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  10. Nuxt3入門(第2回) - 簡単なNuxtアプリケーションを作成する (2022-10-02)