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)
テーブルが作られて初期値がセットされています。