Spring BootでMySQLを使う

「TomcatとApache HTTP ServerでSpring Bootアプリケーションをデプロイしてみる」では、作成したSpring BootアプリケーションをTomcat上にデプロイした。 しかし、現在の状態ではデータベースとしてH2を利用する状態になっている。 ここでは、アプリケーションを書き換え、データベースとしてMySQLを利用するようにしてみる。

環境

Ubuntu 16.04.2 LTS 64bit版

$ uname -a
Linux vm-ubuntu64 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial

サーバにMySQLをインストールする

まず、接続先となるMySQLサーバを用意する。 ここでは、TomcatをインストールしたサーバにMySQLをインストールすることにする。

aptを使い、MySQLをインストールするには次のようにする。 このとき、ダイアログに従いrootパスワードを適当に設定する。

$ sudo apt install mysql-server

MySQLに接続し、接続先となるデータベースと接続に利用するユーザを作成する。

$ mysql -u root -p
Enter password: [type root password]

mysql> CREATE DATABASE demo CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON demo.* TO demo@localhost IDENTIFIED BY 'youmustchangethis';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye

データベースの設定を行う

次に、アプリケーションを書き換え、MySQLデータベースを利用するように設定する。

MySQLを利用する場合、依存パッケージにMySQL Connector-Jを追加する必要がある。 プロジェクトにMySQL Connector-Jを追加するには次のようにする。

  • 「demo [boot]」を右クリックして、「Maven」→「Add Dependency」を選択
  • ダイアログの各フィールドに以下の文字列を入力してOK
    • GroupId: mysql
    • ArtifactId: mysql-connector-java
    • Version: (空白)

Spring Bootでは、設定ファイルとしてpropertiesファイル(またはYAMLファイル)を使用する。 まず、application.propertiesに本番環境用のプロファイルを使う設定を記述する。

  • src/main/resources/application.properties
spring.profiles.active=production

次に、本番環境用のプロファイルに接続先データベースの設定を記述する。

  • src/main/resources/application-production.properties
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=demo
spring.datasource.password=youmustchangethis

spring.jpa.hibernate.ddl-auto=createを指定することで、アプリケーション起動時に必要なテーブルが作成される。 テーブルが作成された後は、updateに変更することでコードに合わせてテーブルが修正されるようになる。

Tomcatにデプロイする

「TomcatとApache HTTP ServerでSpring Bootアプリケーションをデプロイしてみる」と同様の手順でWARファイルをエクスポートし、ROOT##002.warにリネームする。 続けて、Tomcat ManagerからROOT##002.warをデプロイする。

アプリケーションに接続し、適当なデータを追加した後、MySQLデータベースを確認すると次のようになる。

$ mysql -u root -p
Enter password: [type root password]

mysql> use demo;

Database changed
mysql> show tables;
+------------------+
| Tables_in_demo   |
+------------------+
| message          |
| user             |
| user_authorities |
+------------------+
3 rows in set (0.00 sec)

mysql> select * from message;
+----+---------------------+-------+-------------+-------+
| id | created_at          | name  | remote_addr | text  |
+----+---------------------+-------+-------------+-------+
|  1 | 2017-04-26 10:21:24 | name1 | 127.0.0.1   | text1 |
|  2 | 2017-04-26 10:21:31 | name2 | 127.0.0.1   | text2 |
|  3 | 2017-04-26 10:21:40 | name3 | 127.0.0.1   | text3 |
+----+---------------------+-------+-------------+-------+
3 rows in set (0.00 sec)

mysql> \q
Bye

上の結果から、Entityに対応するテーブルが作成されていること、追加したデータが挿入されていることが確認できる。

本番環境でMySQL、開発環境でH2を使う

本番環境ではMySQLを使うが、開発時はH2を使いたい場合がある。 このような場合は、開発時spring.profiles.activeの行を#コメントアウトしておき、WARファイルのエクスポート前にコメントアウトを外すようにすればよい。

関連リンク