tamuraです。

今回はDropwizardでデータベースを使ってみます。


Migration

Migrationという仕組みを使ってデータベースを準備していきます。
Ruby on Railsとかのやつと同じです。

https://dropwizard.github.io/dropwizard/manual/migrations.html

以下の記述をpom.xmlに追加します。

<dependency>  
  <groupId>io.dropwizard</groupId>
  <artifactId>dropwizard-migrations</artifactId>
  <version>${dropwizard.version}</version>
</dependency>

<dependency>  
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.18</version>
</dependency>  

Configuration

データベース関連の設定情報を外部ファイルから取得できるようにします。

@Valid
@NotNull
private DataSourceFactory database = new DataSourceFactory();

@JsonProperty("database")
public DataSourceFactory getDataSourceFactory() {  
    return database;
}

設定ファイルにデータベース関連の情報を追加します。
データベースはMySQLを使います。

database:  
  driverClass: com.mysql.jdbc.Driver
  user: root
  password: password
  url: jdbc:mysql://localhost/helloworld?useUnicode=true&characterEncoding=utf8
  properties:
    charSet: UTF-8
  maxWaitForConnection: 1s
  validationQuery: "/* MyService Health Check */ SELECT 1"
  minSize: 8
  maxSize: 32
  checkConnectionWhileIdle: false
  evictionInterval: 10s
  minIdleTime: 1 minute

Application

initializeメソッドを追加し、MigrationBundleを追加します。

@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {  
    bootstrap.addBundle(new MigrationsBundle<HelloWorldConfiguration>() {
        @Override
        public DataSourceFactory getDataSourceFactory(HelloWorldConfiguration configuration) {
            return configuration.getDataSourceFactory();
        }
   });
}

Migrationの定義

src/main/resources/migrations.xmlを作成し、そこにテーブル情報を追加していきます。 ここではサンプルと同じくxmlで定義します。

メッセージを格納するマスタの作成と、そのマスタの初期値を設定します。

<?xml version="1.0" encoding="UTF-8"?>  
<databaseChangeLog  
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog" "http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

  <changeSet id="1" author="tamura.shingo">
    <createTable tableName="m_message">
      <column name="id" type="char(5)">
        <constraints primaryKey="true" nullable="false"/>
      </column>
      <column name="message" type="varchar(255)" />
    </createTable>
  </changeSet>

  <changeSet id="2" author="tamura.shingo">
    <insert tableName="m_message">
      <column name="id" value="00001" />
      <column name="message" value="hello" />
    </insert>
    <insert tableName="m_message">
      <column name="id" value="00002" />
      <column name="message" value="こんにちは" />
    </insert>
    <insert tableName="m_message">
      <column name="id" value="00003" />
      <column name="message" value="bonjour" />
    </insert>
  </changeSet>
</databaseChangeLog>  

とりあえずマイグレーションの実行

ビルドした後に動かしてみます。

まずは差分の確認。

$ java -jar target/helloworld-0.0.1-SNAPSHOT.jar db status hello-world.yml
INFO  [2015-06-10 11:44:25,176] liquibase: Creating database history table with name: helloworld.DATABASECHANGELOG  
INFO  [2015-06-10 11:44:25,675] liquibase: Reading from helloworld.DATABASECHANGELOG  
2 change sets have not been applied to root@localhost@jdbc:mysql://localhost/helloworld?useUnicode=true&characterEncoding=utf8  

2つ分当たっていないと仰っています。

当てます。

$ java -jar target/helloworld-0.0.1-SNAPSHOT.jar db migrate hello-world.yml
INFO  [2015-06-10 11:46:01,115] liquibase: Successfully acquired change log lock  
INFO  [2015-06-10 11:46:02,233] liquibase: Reading from helloworld.DATABASECHANGELOG  
INFO  [2015-06-10 11:46:02,343] liquibase: migrations.xml: 1::tamura.shingo: Table m_message created  
INFO  [2015-06-10 11:46:02,343] liquibase: migrations.xml: 1::tamura.shingo: ChangeSet migrations.xml::1::tamura.shingo ran successfully in 103ms  
INFO  [2015-06-10 11:46:02,397] liquibase: migrations.xml: 2::tamura.shingo: New row inserted into m_message  
INFO  [2015-06-10 11:46:02,398] liquibase: migrations.xml: 2::tamura.shingo: New row inserted into m_message  
INFO  [2015-06-10 11:46:02,399] liquibase: migrations.xml: 2::tamura.shingo: New row inserted into m_message  
INFO  [2015-06-10 11:46:02,401] liquibase: migrations.xml: 2::tamura.shingo: ChangeSet migrations.xml::2::tamura.shingo ran successfully in 26ms  
INFO  [2015-06-10 11:46:02,685] liquibase: Successfully released change log lock  

当たりました。

確認してみます。

mysql> show tables;  
+-----------------------+
| Tables_in_helloworld  |
+-----------------------+
| databasechangelog     |
| databasechangeloglock |
| m_message             |
+-----------------------+
3 rows in set (0.00 sec)

mysql> select * from m_message;  
+-------+------------+
| id    | message    |
+-------+------------+
| 00001 | hello      |
| 00002 | こんにちは |
| 00003 | bonjour    |
+-------+------------+
3 rows in set (0.00 sec)  

テーブルが作られて初期値がセットされています。