doma-genでエンティティ/Daoを自動生成する手順
<<doma-genの作成方法の公式ドキュメントはこちらです>>
https://doma-gen.readthedocs.io/en/2.6.1/gen/
build.gradleの基本設定
build.gradleにdoma-genタスクを定義する。
dependencies {
// doma-gen設定
domaGenRuntime 'org.seasar.doma:doma-gen:2.6.1'
domaGenRuntime 'org.postgresql:postgresql:9.3-1100-jdbc41'
domaGenRuntime 'mysql:mysql-connector-java'
}
// doma-gen設定
task gen {
group = 'doma-gen'
doLast {
ant.taskdef(resource: 'domagentask.properties',
classpath: configurations.domaGenRuntime.asPath)
ant.gen(url: 'jdbc:mysql://localhost:3306/happy_library', user: 'springuser', password: 'xxx') {
entityConfig()
daoConfig()
sqlConfig()
}
}
}
生成物のカスタマイズ方法
ant.gen(url: 'jdbc:mysql...' <= トップレベルパラメータ
entityConfig(パラメータ: '値') <= エンティティクラスの生成に関する設定
daoConfig(パラメータ: '値') <= Dao インタフェースの生成に関する設定
sqlConfig(パラメータ: '値') <= SQL ファイルの生成に関する設定
上記メソッドに対して引数にオプションを渡すことで、自動生成のカスタマイズができます。カスタマイズ可能項目は、公式ドキュメントを参照してください。少なくとも下記は指定する必要があるでしょう。
No | オプション項目 | |
1 | 対象スキーマを指定する | トップレベルパラメータ.schemaName |
2 | 出力先を指定する | destDir |
3 | パッケージ名を指定する | packageName |
ant.gen(url: 'jdbc:mysql://localhost:3306/happy_library?serverTimezone=JST', user: 'springuser', password: 'xxx', schemaName: 'happy_library') {
entityConfig(destDir: 'src/main/java', packageName: 'com.springhack.happylibrary.entity')
daoConfig(destDir: 'src/main/java', packageName: 'com.springhack.happylibrary.dao')
sqlConfig(destDir: 'src/main/resources')
対象スキーマ、出力先、パッケージ名を指定した例。
課題 @Daoに@ConfigAutowirerableを付与
課題 @EntityのサフィックスにEntityを付与
genタスクを実行する
Gradleメニュー>Tasks>doma-gen>gen を押すと、自動生成されます。
doma-gen genタスク実行時のエラー
[DOMAGEN0013] プロパティ[driverClassName]が表すクラス[com.mysql.jdbc.Driver]が見つかりません。
原因:genタスク実行時にJDBCドライバーが見つからなかった。
対策:genタスク実行時の依存性にJDBCドライバーを追加する。データベースに対するドライバークラスが適切確認する。
修正前
dependencies {
runtimeOnly 'mysql:mysql-connector-java'
// doma-gen設定
domaGenRuntime 'org.seasar.doma:doma-gen:2.6.1'
domaGenRuntime 'org.postgresql:postgresql:9.3-1100-jdbc41'
}
修正後
dependencies {
runtimeOnly 'mysql:mysql-connector-java'
// doma-gen設定
domaGenRuntime 'org.seasar.doma:doma-gen:2.6.1'
domaGenRuntime 'mysql:mysql-connector-java'
}
データベースがMySQLなのに、PostgreSQLのドライバーが指定されてい田のを修正した例。
[DOMAGEN9001] 例外が発生しました。java.sql.SQLException: The server time zone value 'xxxx' is unrecognized or represents more than one time zone.
原因
修正前
ant.gen(url: 'jdbc:mysql://localhost:3306/happy_library', user: 'springuser', password: 'xxx') {
修正後
ant.gen(url: 'jdbc:mysql://localhost:3306/happy_library?serverTimezone=JST', user: 'springuser', password: 'xxx') {
?serverTimezone=JST でtimezoneを明示する。
なぜエンティティ/Daoを自動生成するか?
業務システムをはじめ、実案件ではテーブル数は最低でも10、100いくようなこともよくあります。そのときに、各テーブルに対するEntityクラスとDaoインターフェースを手で作っていたら、工数がかかりすぎ、非効率です。
また、自動生成をすることによって、同一手順で安定した品質のEntityクラスとDaoインターフェースを手に入れることができます。
Doma2に限らず、JPAでもMybatisを使う場合でも、Entityクラスの作成は必須です。
自動生成は最初の設定は難しいですが、その後の開発体験にはとても大きなプラスになります。複数人で開発している場合は、全メンバーの開発体験が向上するので、必ずプロジェクトに適用させましょう。