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

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

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

特徴(公式から引用)

#
  • 注釈処理を使用して コンパイル時 にコードの生成やコードの検証をする
  • データベース上のカラムの値を振る舞いを持った 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つとしていかがでしょうか。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。