Dao・Entity・Sqlファイルの自動生成(Doma Codegen Plugin)

Dao・Entity・Sqlファイルの自動生成

doma-codegen-pluginは、データベースに接続しテーブルのメタデータからDao/Entity/Sqlファイルを自動作成するツールである。

自動生成時に、カラムを任意の方にマッピングさせたい場合は、以下の記事も合わせて参照すると良い。
olafnosuke.hatenablog.com

環境変数の設定

下記の環境変数を設定する

環境変数 設定内容
DATASOURCE_URL jdbc:postgresql://localhost:ポート番号/データベース名
DATASOURCE_SCHEMA_NAME ユーザー名
DATASOURCE_PASSWORD パスワード
DATASOURCE_SCHEMA_NAME スキーマ

※上記はJDBCドライバはPostgreSQLを想定


doma-codegen-pluginプラグインの設定

doma-codegen-pluginの設定はbuild.gradleに記述する。
GitHub:doma-codegen-plugin

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots/'
        }
    }

    dependencies {
        classpath 'org.postgresql:postgresql:42.5.4'
    }
}

plugins {
    id 'org.seasar.doma.codegen' version '1.4.1'
}

domaCodeGen {
    dev {
        // 環境変数から接続先を取得
        url = "$System.env.DATASOURCE_URL"
        user = "$System.env.DATASOURCE_USER_NAME"
        password = "$System.env.DATASOURCE_PASSWORD"
        schemaName = "$System.env.DATASOURCE_SCHEMA_NAME"

        // 自動生成ファイルの出力先パッケージ
        def outputPackage = 'jp.co.sample.persistence'

        // 自動生成対象外のテーブル名の正規表現を指定
        ignoredTableNamePattern = 'hoge$'

        // Domaテンプレートを編集したため、自動生成時にそれを使用するように設定
        // Daoに@org.seasar.doma.boot.ConfigAutowireableを付与するようにテンプレート編集
        // Entityに@lombok.ToStringと@lombok.EqualsAndHashCodeを付与するようにテンプレート編集
        templateDir = file('src/main/resources/doma/template')

        // Daoの設定
        dao {
            packageName = "${outputPackage}.plain.dao"
            overwrite = true
        }

        // Entityの設定
        entity {
            packageName = "${outputPackage}.plain.entity"
            overwrite = true
            useListener = false
            useMappedSuperclass = false
            useMetamodel = false
            entityPropertyClassNamesFile = file("$projectDir/codegen-enum-mapping.properties")
        }

        // SQLファイルの設定
        sql {
            overwrite = true
        }
    }
}

Dao/Entity/Sqlファイルの出力先を変更したい場合

build.gradleoutputPackageの値を変更する


Dao/Entity/Sqlファイルの自動生成

Dao/Entity/Sqlファイルを同時に生成するコマンド

>gradlew domaCodeGenDevDao domaCodeGenDevEntity domaCodeGenDevSql

Daoのみ自動生成するコマンド

>gradlew domaCodeGenDevDao

Entityのみ自動生成するコマンド

>gradlew domaCodeGenDevEntity

Sqlファイルのみ自動生成するコマンド

>gradlew domaCodeGenDevSql

出力例

Daoの出力例

package jp.co.sample.persistence.plain.dao;

import jp.co.sample.persistence.entity.Goods;
import org.seasar.doma.Dao;
import org.seasar.doma.Delete;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.Update;
import org.seasar.doma.boot.ConfigAutowireable;

/**
 */
@ConfigAutowireable
@Dao
public interface GoodsDao {

    /**
     * @param id
     * @return the Goods entity
     */
    @Select
    Goods selectById(Integer id);

    /**
     * @param entity
     * @return affected rows
     */
    @Insert
    int insert(Goods entity);

    /**
     * @param entity
     * @return affected rows
     */
    @Update
    int update(Goods entity);

    /**
     * @param entity
     * @return affected rows
     */
    @Delete
    int delete(Goods entity);
}

Entityの出力例

package jp.co.sample.persistence.plain.entity;

import org.seasar.doma.Column;
import org.seasar.doma.Entity;
import org.seasar.doma.Id;
import org.seasar.doma.Table;
import lombok.ToString;
import lombok.EqualsAndHashCode;

import jp.co.sample.persistence.EntityContext;
import jp.co.sample.persistence.listener.MyEntityListener;

/**
 */
@Entity(listener = MyEntityListener.class)
@Table(name = "goods")
@ToString
@EqualsAndHashCode
public class Goods implements EntityContext {

    /** */
    @Id
    @Column(name = "id")
    Integer id;

    /** */
    @Column(name = "name")
    String name;

    /**
     * Returns the id.
     *
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * Sets the id.
     *
     * @param id the id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Returns the name.
     *
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the name.
     *
     * @param name the name
     */
    public void setName(String name) {
        this.name = name;
    }
}

Sqlファイルの出力例

select
  /*%expand*/*
from
  goods
where
  id = /* id */1