LoginSignup
17
25

More than 5 years have passed since last update.

springbootでdoma-genを使う

Last updated at Posted at 2017-03-30

はじめに

springbootでSQLベース開発したいときはMyBatisと思ってたけど、domaの方が使いやすそう。
javaとSQLの相互遷移とか。
2waySQLとか。。
SQLコメントとか。。。
というわけで、今回はdoma-genを使ってDaoやentityを自動生成するところをゴールとして書いていきます。

開発環境

  • java8
  • STS 3.8.3.RELEASE
  • springboot 1.5.2.RELEASE
  • doma, doma-gen 2.12.0

プロジェクトの設定

  • STSからSpringStarterProjectでGradle(BuildShip)プロジェクト作成
    • Gradle(STS)は非推奨
    • PostgreSQL、Web、DevTools、Lombokあたりにチェック(適宜)
  • 依存関係の追加。springboot用のdomaを追加する。
compile('org.seasar.doma.boot:doma-spring-boot-starter:1.1.0')
  • 公式にあるようにboilerplateを参考に設定をする。
    • eclipse.gradleをクローンしてbuild.gradleと同じ階層に配置。
    • build.gradleに以下を追加
build.gradle
apply from:'eclipse.gradle'
  • Gradle Tasksのeclipseを実行。annotation processingFactory Pathが設定されるはず。。
    doma-spring-boot-starterの依存関係を追加せずにやるとFactory Pathの自動設定がされないので注意。ソース的にはココかなー
eclipse.gradle
def domaJar = configurations.compile.find {
    it.name.startsWith('doma-2')
}

doma-genの設定

  • 公式を参考に依存関係の追加。
build.gradle
configurations {
    domaGenRuntime
}
dependencies {
    def domaGenVersion = "2.12.0"
    domaGenRuntime('org.postgresql:postgresql')
    domaGenRuntime("org.seasar.doma:doma-gen:${domaGenVersion}")
}

ファイル一式を作成するスクリプト

  • 使用例を参考にファイル一式を作るスクリプトを書いていく。
    • DB接続情報はyamlからとってきて拡張プロパティとして定義。(gradle触ったことないから自信薄。。)
datasource.gradle
import org.yaml.snakeyaml.*

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.yaml:snakeyaml:1.17")
    }
}

task datasource {
    Yaml parser = new Yaml()
    ant.loadfile (
        srcfile: 'src/main/resources/application.yml',
        property: 'yaml'
    )
    def yamlObj = parser.load("${ant.properties.yaml}")
    ext.url = yamlObj.spring.datasource.url
    ext.user = yamlObj.spring.datasource.username
    ext.password = yamlObj.spring.datasource.password
}
  • DB接続情報をapplyしてdomagenタスク組み立て。
build.gradle
apply from:'datasource.gradle'

task domaGen {
    def destBaseDir = 'src/main/java/com/example/domain'
    def basePackage = 'com.example.domain'
    def resourceDir = 'src/main/resources'

    ant.taskdef(resource: 'domagentask.properties',
        classpath: configurations.domaGenRuntime.asPath)
    ant.gen(url: "${datasource.url}", user: "${datasource.user}", password: "${datasource.password}", templatePrimaryDir: "${resourceDir}/config/doma/templates", tableNamePattern: 'sns_account') {
        entityConfig(packageName: "${basePackage}.entity", useAccessor: false, useListener: false)
        daoConfig(packageName: "${basePackage}.dao", overwrite: true)
        sqlConfig()
    }
}

トップレベルで使用した変数

  1. templatePrimaryDir
    • springbootで使用する場合Daoには@ConfigAutowireableを付与しなくてはいけない。これを自動で行いたいのでカスタムテンプレートを用意する(詳細は後述)。それを配置するディレクトリの設定。
    • デフォルトはsrc/main/resources/templateなので指定しなくてもよい。
  2. tableNamePattern
    • 特定のテーブルだけ自動生成したい場合に使用。適宜。
    • 正規表現で指定可能。デフォルトは.*

entityConfigで使用した変数

  1. packageName
    • 任意のパッケージ下にentityを生成したいときに使用。
  2. useAccessor
    • domaはlombokなどと相性が悪く、フィールドをpublicで持つのが慣習らしいのでfalseを指定。
      ※ 最近では公式のドキュメントにlombokベストプラクティスがあるから、それに則ってコーディングすれば問題ないかも。ただし自動生成したファイルにアノテーションつけたりするにはカスタムテンプレートが必要。
    • falseを指定するとgetter/setterが生成されないだけではなく、修飾子も自動でpublicにしてくれる。
  3. useListener
    • 更新・削除系の前後に何かしらの処理をいれたいときに使うリスナーを自動生成するかどうか。あんまり使わない気がするからfalse

カスタムテンプレート

自動生成されたDaoに@ConfigAutowireableを自動で付与させたいときは作りましょう。自動じゃなくてもいいのであれば必要ありません。
1. doma-genからdao.ftllib.ftlを持ってきます。templatePrimaryDirで指定したディレクトリかデフォルトのディレクトリに配置します。
lib.ftlは空ファイルなので、普通に新規作成してもいいです。
2. dao.ftlで使用するアノテーション名とパッケージのハッシュをlib.ftlに定義します。

lib.ftl
<#assign annotationHash={ "ConfigAutowireable": "org.seasar.doma.boot.ConfigAutowireable" }>

 
3. dao.ftlにアノテーションとアノテーションのimportを追加するスクリプトを適当な場所に追記します。

dao.ftl
<#list lib.annotationHash?values as annotationImportName>
import ${annotationImportName};
</#list>
dao.ftl
<#list lib.annotationHash?keys as annotation>
@${annotation}
</#list>
  1. あとはタスクを実行すればファイル一式が生成されると思います。

ソース

参考

17
25
0

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
17
25