Spring BootでDoma-Gen2を使う方法
SpringbootでDoma-Gen2を使う方法です。
Doma-Gen は Doma2 のためのコードジェネレーターです。エンティティ、DAO、SQL ファイルを自動生成してくれます。Ant タスクとして作成されているため、Ant はもちろん、Gradle などのビルドツールから実行できます。利用には Doma-gen の他に、FreeMarker が必要です。
・Welcome to Doma-Gen — Doma-Gen 2.0 ドキュメント
Spring Boot で 2 Way SQL をやりたい って方のお役に立てるとうれしいです。
目次
環境
今回のサンプルは下記の環境で検証しました。
- Spring Boot 1.4.1
- Thymeleaf 3.0.2
- Windows7
- Java8
- Eclipse 4.6 Neon
- Oracle 11g
- Doma2
- Doma Gen 2.13.0
- FreeMarker 2.3.20
ここではゼロからアプリを作っていますが、こちらも参考にしてみてください。
pom.xmlを準備
Eclipse から Maven プロジェクトを追加し、pom.xml を編集します。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.doma2.gen.spb</groupId>
<artifactId>spring-boot-doma2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.5</thymeleaf-layout-dialect.version>
<thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
<thymeleaf-extras-data-attribute.version>2.0.5</thymeleaf-extras-data-attribute.version>
<thymeleaf-extras-java8time.version>3.0.0.RELEASE</thymeleaf-extras-java8time.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0</version>
</dependency>
<dependency>
<groupId>org.seasar.doma.boot</groupId>
<artifactId>doma-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/lib/ojdbc7.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Spring Bootセットアップ
エントリポイントとなる Application クラスと、コントローラークラス、トップページを作ります。
・Application クラス
package jp.doma2.gen.spb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
・Doma2Controller
package jp.doma2.gen.spb;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class Doma2Controller {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main(Model model) {
return "index";
}
}
・index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Spring Boot de Doma2</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<span th:text="${userName}">userName</span>
</body>
</html>
・application.yml
spring:
profiles:
active: dev
datasource:
url: jdbc:oracle:thin:@localhost:1521:oracle
username: scott
password: tiger
driverClassName: oracle.jdbc.driver.OracleDriver
thymeleaf:
cache: false
thymeleaf:
mode: HTML
application.yml の datasource は環境によって変更してください。
ここまで作るとこんな感じになります。
AppConfigクラスを用意する。
AppConfig クラス作り、下記のソースをコピペします。
package jp.doma2.gen.spb;
import javax.sql.DataSource;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.dialect.Dialect;
public class AppConfig implements Config {
private Dialect dialect;
private DataSource dataSource;
@Override
public Dialect getDialect() {
return dialect;
}
public void setDialect(Dialect dialect) {
this.dialect = dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
詳しくはこちらのページを参照ください。
Doma GenとFree Makerを準備する
Doma Gen と Free Maker を準備します。
下記サイトから jar ファイルをダウンロードします。
・Maven Repository org.seasar.doma » doma-gen » 2.13.0
・Maven Repository org.freemarker » freemarker » 2.3.20
・Oracle Database 12c Release 1 JDBC Driver Downloads
プロジェクトのルートに lib フォルダーを作成して、ダウンロードした jar を配置します。
ojdbc7.jar は Oracle 用の jdbc ドライバです。利用するデータベースに合わせて変更してください。
テーブルとデータを用意する
下記の SQL を実行してデータとテーブルを用意します。
CREATE TABLE RESERVATION
(
ID NUMBER(5,0) NOT NULL,
NAME NVARCHAR2(255) NOT NULL,
CONSTRAINT PK_RESERVATION PRIMARY KEY (ID) USING INDEX
);
INSERT INTO RESERVATION VALUES(1,'hoge');
INSERT INTO RESERVATION VALUES(2,'piyo');
INSERT INTO RESERVATION VALUES(3,'fuga');
INSERT INTO RESERVATION VALUES(4,'foo');
INSERT INTO RESERVATION VALUES(5,'bar');
INSERT INTO RESERVATION VALUES(6,'baz');
INSERT INTO RESERVATION VALUES(7,'saka');
doma-gen-build.xmlを作成する
次に、プロジェクトのルートに doma-gen-build.xml を作成します。
下記の xml を貼り付けてください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<project name="doma-gen-example" default="gen" basedir=".">
<property name="javaDestDir" value="src/main/java/"/><!-- エンティティ、DAOが作成されるルート -->
<property name="sqlDestDir" value="src/main/resources/"/><!-- SQLファイルが作成されるルート -->
<property name="dialectName" value="oracle"/><!-- 利用するデータベース -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><!-- jdbcドライバ -->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:oracle"/><!-- 接続先 -->
<property name="user" value="scott"/><!-- ユーザー -->
<property name="password" value="tiger"/><!-- パスワード -->
<property name="entityPackageName" value="jp.doma2.gen.spb.entity"/><!-- エンティティが作成されるパッケージ -->
<property name="daoPackageName" value="jp.doma2.gen.spb.dao"/><!-- DAOが作成されるパッケージ -->
<property name="configClassName" value="jp.doma2.gen.spb.AppConfig"/><!-- AppConfigの場所 -->
<property name="sqlFilePattern" value="META-INF/**/*.sql"/><!-- SQLファイルが作成されるフォルダ -->
<path id="classpath">
<fileset dir="lib"/>
</path>
<taskdef name="gen" classname="org.seasar.doma.extension.gen.task.Gen" classpathref="classpath" loaderref="loader"/>
<typedef name="entityConfig" classname="org.seasar.doma.extension.gen.task.EntityConfig" loaderref="loader"/>
<typedef name="daoConfig" classname="org.seasar.doma.extension.gen.task.DaoConfig" loaderref="loader"/>
<typedef name="sqlConfig" classname="org.seasar.doma.extension.gen.task.SqlConfig" loaderref="loader"/>
<target name="gen">
<gen
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}">
<entityConfig
destdir="${javaDestDir}"
packageName="${entityPackageName}"
/>
<daoConfig
destdir="${javaDestDir}"
packageName="${daoPackageName}"
configClassName="${configClassName}"
/>
<sqlConfig
destdir="${sqlDestDir}"
/>
</gen>
</target>
</project>
doma-gen-build.xml を右クリックし、[実行]-[外部ツールの構成]をクリックします。
[Ant ビルド]を右クリックして「新規」をクリックします。
[リフレッシュ]タブを開き、[完了時にリソースをリフレッシュ。]にチェックを入れ、[選択されたリソースを含むプロジェクト]を選択します。これで Ant 実行後、エンティティ、DAO クラスが自動生成されてもリフレッシュせずにクラスが表示されます。
次に[クラスパス]タブを開き、右側の[JARの追加]から、lib フォルダに入れた3つの jar ファイルを選択します。
右下の[実行]ボタンを押下すれば、おしまいです。下記のようなログが出れば成功です。
Buildfile: C:/Eclipse/4.6/workspace/spring-boot-doma2/doma-gen-build.xml
gen:
[gen] [DOMAGEN0017] 方言にはクラス[org.seasar.doma.extension.gen.dialect.OracleGenDialect]が使用されます。
[gen] select comments from all_tab_comments where owner = 'SCOTT' and table_name = 'RESERVATION' and table_type in ('TABLE', 'VIEW')
[gen] select column_name, comments from all_col_comments where owner = 'SCOTT' and table_name = 'RESERVATION'
[gen] [DOMAGEN0019] ファイルを作成しました。C:/Eclipse/4.6/workspace/spring-boot-doma2/src/main/java/jp/doma2/gen/spb/entity/Reservation.java
[gen] [DOMAGEN0019] ファイルを作成しました。C:/Eclipse/4.6/workspace/spring-boot-doma2/src/main/java/jp/doma2/gen/spb/entity/ReservationListener.java
[gen] [DOMAGEN0019] ファイルを作成しました。C:/Eclipse/4.6/workspace/spring-boot-doma2/src/main/java/jp/doma2/gen/spb/dao/ReservationDao.java
[gen] [DOMAGEN0019] ファイルを作成しました。C:/Eclipse/4.6/workspace/spring-boot-doma2/src/main/resources/META-INF/jp/doma2/gen/spb/dao/ReservationDao/selectById.sql
BUILD SUCCESSFUL
Total time: 4 seconds
おおお、自動生成されたーー^^
DAOにConfigAutowireableアノテーション付与
自動生成された DAO に ConfigAutowireable のアノテーションを付与します。
これをしないと「No qualifying bean of type・・・」のエラーが出てデータアクセスできません。
@Dao(config = AppConfig.class)
@ConfigAutowireable
public interface ReservationDao {
・・・
}
コントローラークラスを変更
早速データアクセスしてみましょう。コントローラークラスを下記のように変更します。
・Doma2Controller
package jp.doma2.gen.spb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import jp.doma2.gen.spb.dao.ReservationDao;
import jp.doma2.gen.spb.entity.Reservation;
@Controller
public class Doma2Controller {
@Autowired
private ReservationDao reservationDao;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main(Model model) {
Reservation re = reservationDao.selectById(1);
model.addAttribute("userName", re.getName());
return "index";
}
}
検証
pom.xml を右クリックして、[実行]-[Maven clean]と[Maven test]を実行し、Application クラスを[実行]します。
Spring Boot が起動したら、http://localhost:8080/ へアクセスします。
画面に hoge って出れば完了です^^
VIEW (ビュー)を対象する
Oracle の VIEW (ビュー)を対象にしたい場合、トップレベルパラメータである tableTypes に "TABLE, VIEW" と指定すれば対応できます。
具体的には、こうです。
(・・・省略・・・)
<property name="tableTypes" value="TABLE, VIEW"/>
(・・・省略・・・)
<gen
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}"
tableTypes="${tableTypes}">
(・・・省略・・・)
詳しくは Doma - Genタスク に掲載されています。
まとめ
Spring BootでDoma-Gen2を使う方法を紹介しました。
正直、DAO に ConfigAutowireable アノテーションを付与しなければならないというところで、だいぶハマりました^^;
テーブル数が多い場合には、ちょっとめんどくさいなーなんて思ったりもしますが、仕方ないのかなー・・・。自動付与してくれれば楽ちんなんですけど、やり方がわかりません・・。どなたかご存知の方がいらっしゃいましたら、コメントお待ちしております。
ともあれ、2 Way SQL の環境はこれでできますので、後は粛々と作るのみですね。
ちなみにアノテーション付与した後に、再度 Ant 実行しても上書きされるわけではありませんのでご安心を。
おつかれさまでした。