Spring BootでDoma-Gen2を使う方法

Springbootで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

ここではゼロからアプリを作っていますが、こちらも参考にしてみてください。

  1. Spring Bootを使ってWebアプリを作る方法
  2. Spring BootとDoma2を連携してOracle接続する方法

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 は環境によって変更してください。

ここまで作るとこんな感じになります。

Spring Bootのサンプルアプリ作成

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 2.0 ドキュメント

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 ドライバです。利用するデータベースに合わせて変更してください。

Doma GenとFree Makerを準備する

テーブルとデータを用意する

下記の 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 を右クリックし、[実行]-[外部ツールの構成]をクリックします。

doma-gen-build.xmlを実行

[Ant ビルド]を右クリックして「新規」をクリックします。

[Ant ビルド]を右クリックして「新規」をクリック

[リフレッシュ]タブを開き、[完了時にリソースをリフレッシュ。]にチェックを入れ、[選択されたリソースを含むプロジェクト]を選択します。これで Ant 実行後、エンティティ、DAO クラスが自動生成されてもリフレッシュせずにクラスが表示されます。

完了時にリソースをリフレッシュ

次に[クラスパス]タブを開き、右側の[JARの追加]から、lib フォルダに入れた3つの jar ファイルを選択します。

クラスパスタブから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

おおお、自動生成されたーー^^

Doma Genにより自動生成された

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 って出れば完了です^^

Spring BootでDoma Gen検証

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 実行しても上書きされるわけではありませんのでご安心を。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。