Contents
MySQLでDB・DBユーザーを作成
下記の手順でMySQLのDB・DBユーザーを作成します。
$ mysql --version
mysql Ver 8.0.27 for macos12.0 on arm64 (Homebrew)
$ mysql -u root -p
Enter password: (パスワードを入力する)
mysql> create database okozukai;
Query OK, 1 row affected (0.05 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| okozukai |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.05 sec)
mysql> create user 'okozukaiadmin'@'%' identified by 'password';
Query OK, 0 rows affected (0.03 sec)
mysql> grant all on okozukai.* to 'okozukaiadmin'@'%';
Query OK, 0 rows affected (0.00 sec)
DBマイグレーション flywayの設定
下記の記述をbuild.gradleに追記します。
plugins {
id "org.flywaydb.flyway" version '8.2.0'
}
dependencies {
implementation 'mysql:mysql-connector-java:8.0.27'
}
flyway {
url = 'jdbc:mysql://localhost:3306/okozukai'
user = 'okozukaiadmin'
password = 'password'
schemas = ['okozukai']
}
その後、コマンドで依存関係を更新し、flywayの動作確認を行います。
$ ./gradlew build --refresh-dependencies
$ ./gradlew flywayMigrate
> Task :flywayMigrate
Skipping filesystem location:/Users/noricgeographic/repositories/okozukai-system/src/main/resources/db/migration (not found).
No migrations found. Are your locations set up correctly?
BUILD SUCCESSFUL in 742ms
1 actionable task: 1 executed
BUILD SUCCESSFUL と表示されることを確認してください。
初回のflywayMigrateの実行により、flyway_schema_historyというテーブルが作成されていますので、MySQLを確認します。
mysql> show tables;
+-----------------------+
| Tables_in_okozukai |
+-----------------------+
| flyway_schema_history |
+-----------------------+
1 row in set (0.00 sec)
このように、flyway_schema_historyテーブルが作成されていれば、flywayによるDBマイグレーションの準備が整いました。
ここまででエラーが出力された場合は、
https://springhack.com/flyway%e3%81%a7springboot%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%aedb%e3%83%9e%e3%82%a4%e3%82%b0%e3%83%ac%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3/#Flyway
こちらのページを参考にしてください。
テーブル作成
今回は下記の赤枠2つのテーブルを作成します。
最初のテーブル作成
flywayを使ってテーブルを作成していきます。
まずはCREATE文を作成します。
flywayでは、src/main/resources/db/migrationディレクトリの中に、
V1__xxx.sql の命名ルールでSQLを配置します。
CREATE TABLE `children` (
`child_id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`birthday` date NOT NULL,
PRIMARY KEY (`child_id`)
) ENGINE=InnoDB;
配置したSQLをDBに反映させるために、gradle flywayMigrate を叩きます。
(もしくは、IDEでflywayMigrateタスクを実行します)
$ ./gradlew flywayMigrate
BUILD SUCCESSFUL in 897ms
1 actionable task: 1 executed
BUILD SUCCESSFULと出たら成功です。
この結果が、flyway_schema_historyテーブルに保存されているので確認してください。
mysql> select * from flyway_schema_history;
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
| installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success |
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
| 1 | 1 | create children | SQL | V1__create_children.sql | -1123835275 | okozukaiadmin | 2022-01-26 09:04:58 | 36 | 1 |
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
1 row in set (0.00 sec)
2回目以降のテーブル作成
やはりまずはCREATE文を作成します。
CREATE TABLE `helps` (
`help_id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
`unit_price` int NOT NULL,
PRIMARY KEY (`help_id`)
) ENGINE=InnoDB;
ファイル名の先頭のバージョンをインクリメントしてください。
前回、V1を実行したので、今回はV2やV1.1などにします。
現場ではV1.0.1やV1.1など小数以下が指定されてることもありますが、
あまりその指定でメリットがあると感じたことはありません。
小数なしの方がわかりやすいので、小数なしにしておくと良いと思います。
SQLファイルを作成したら、flywayMigrateを実行します。
$ ./gradlew flywayMigrate
BUILD SUCCESSFUL in 897ms
1 actionable task: 1 executed
BUILD SUCCESSFULが表示されたら成功です。
flyway_schema_historyテーブルで確認してください。
mysql> select * from flyway_schema_history;
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
| installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success |
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
| 1 | 1 | create children | SQL | V1__create_children.sql | -1123835275 | okozukaiadmin | 2022-01-26 09:04:58 | 36 | 1 |
| 2 | 2 | create helps | SQL | V2__create_helps.sql | 1519032896 | okozukaiadmin | 2022-01-26 09:16:12 | 24 | 1 |
+----------------+---------+-----------------+------+-------------------------+-------------+---------------+---------------------+----------------+---------+
2 rows in set (0.01 sec)
今回実行したファイルが記録されていることが確認できました。
この要領で、どのDDLまで実行したか?をバージョン管理できるため、flywayは現場で非常に愛されています。
ORマッパーの準備・テスト
ここではSpring-MyBatisを使っていきます。
MyBatisを依存関係に追加する
build.gradleにmybatis-spring-boot-starterを追加してください。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'mysql:mysql-connector-java:8.0.27'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.1'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
この状態でSpringBootを起動すると、次のように怒られます。
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
DBの接続情報が指定されてません。と怒られます。
DBの接続情報を下記の要領でapplication.ymlに定義します。
spring:
## DB接続情報
dataSource:
url: jdbc:mysql://localhost:3306/okozukai
username: okozukaiadmin
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
この状態で再度SpringBootを起動してみてください。
正常に起動できていれば、MyBatisを使う準備が整いました。