Spring BootとMySQLの連携方法

## はじめに
私は現在、Spring Bootフレームワークを使ったWebアプリケーションの制作を勉強中です。
独学で開発を進めるにあたり学んだことは随時この場をお借りしてアウトプットしていく予定です。これは自身の備忘録として書き記すものですが、同じように独学で学習を進めている方にとって、少しでも参考になれば幸いです。

## 開発環境
| 項目 | 内容 | 
|:----------|------------:|
| OS       | Windows11 |
| IDE | Eclipse2025(Pleiades All in one) |
| JDK | Java21 |
| ビルドツール | Maven |
| データベース | MySQL | 
| JDBCドライバ     | com.mysql.cj.jdbc.Driver |

## ステップ1：プロジェクト作成と準備
1.　Eclipseを起動しファイル→新規→Springスターター・プロジェクトを選択する。
2.　名前欄にプロジェクト名を入力する。今回は「learninglog」とする。
3.　タイプはMaven、Javaバージョンは21を選択する。
4.　パッケージ名を任意で設定する。今回は「jp.meb.learninglog」とする。
5.　次へを選択し、任意の依存関係を選択する。MySQLとの連携には`Spring Data JPA`と`MySQL Driver` を選択しておくこと。
6.　完了ボタンを押してプロジェクトを立ちあげる。
7.　src/main/java/jp.meb.learninglog配下にサブパッケージとしてentityパッケージを作成する。
8.　entityパッケージ内にentityクラスを作成する。今回は学習記録を持つオブジェクトとしてLearningRecordクラスを作成し、以下にコードを記す。
```java: LearningRecord.java
package jp.meb.learninglog.entity;

import java.time.LocalDate;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity // JPAにより、このクラスがテーブルと対応するエンティティであることを示す
public class LearningRecord {
	
	@Id // 主キーを示す
	@GeneratedValue(strategy = GenerationType.IDENTITY)  // DB側で自動採番（AUTO_INCREMENT）される設定
	
	private Long id;
	private String title;
	private String description;
	private LocalDate learningDate;
	
	public LearningRecord() {}
	
	public LearningRecord(Long id, String title, String description, LocalDate learningDate) {
		super();
		this.id = id;
		this.title = title;
		this.description = description;
		this.learningDate = learningDate;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public LocalDate getLearningDate() {
		return learningDate;
	}

	public void setLearningDate(LocalDate learningDate) {
		this.learningDate = learningDate;
	}
}
```

## ステップ2：MySQLとの連携設定

### ①MySQLにアプリ用のデータベースを作成する。

##### 1.　コマンドプロンプトでMySQLにログインする。
##### 2.　ログイン後以下のコマンドを入力する。
```bash
 CREATE DATABASE learning_log CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
#### コマンドの意味
●```CREATE DATABASE learning_log```はlearning_logという名前でデータベースを作成。
　※データベース名は各々お好きなものを指定してください。
●```CHARACTER SET utf8mb4```は文字コードを決めるもので、```utf8mb4```はUTF-8の完全版という認識でOK。絵文字、漢字、記号、特殊文字などを正しく保存・表示できる。```utf8```は古く、一部の文字が保存できないため、現在は```utf8mb4```がデファクトスタンダードである。
●```COLLATE utf8mb4_unicode_ci```は照合順序＝(文字列の比較や並べ方をどうするかを指定するのもの)でunicodeは国際化対応の並べ替えルール、ciはcase-insensitive(大文字小文字を区別しない)という意味である。

### ②Spring Bootとの接続設定

Spring Bootプロジェクト内のsrc/main/resources/application.propertiesに以下の内容を記載し、MySQLとの接続設定を行う。
```properties:application.properties
spring.application.name=LearningLog

#接続設定↓

# 使用するデータベースのURLを指定（ホスト名:ポート番号/DB名）
# localhostのポート番号はMySQLのセットアップ時に設定したものを記載する。デフォルトは3306。
spring.datasource.url=jdbc:mysql://localhost:3306/learning_log

# JDBCドライバのクラス名（MySQL用の標準ドライバ）
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# データベース接続に使用するユーザー名（MySQLインストール時に設定したユーザー）
spring.datasource.username=root

# データベース接続に使用するパスワード（各自のMySQLパスワードに書き換えること）
spring.datasource.password=（MySQLのパスワードを入力してください）

# JPAによるスキーマ自動生成の設定（update = エンティティに合わせてテーブルを自動更新）
# ※updateは開発環境では推奨されるが、本番環境では非推奨らしい。
spring.jpa.hibernate.ddl-auto=update

# 実行されるSQLをコンソールに出力する（デバッグ用）
spring.jpa.show-sql=true

# 使用するデータベースの方言（MySQL 8 に対応したSQLを生成するための指定）
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
```

##  ステップ3：MySQLとの連携確認
##### 1.　Bootダッシュボードからアプリケーションを実行する。

Eclipse の「Bootダッシュボード」から、作成した learninglog プロジェクトを右クリックし、「実行」または「再起動」を選択することで、Spring Boot アプリケーションが起動する。

##### 2.　ログにエラーが出ていないか確認する。

コンソールに以下のようなログが出力されていれば、MySQLとの接続は成功している。
```
... HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect 　... HHH000272: Table 'learning_log.learning_record' doesn't exist... 　... Hibernate: create table learning_record ... 　
```
※上記のように create table のSQLが出力されれば、エンティティクラス LearningRecord が元になって、テーブルが自動生成されたことを示している。

##### 3.　MySQLに接続し、テーブルが作成されているか確認する。

再度MySQLにログインし、以下のコマンドでテーブルの存在を確認する。
```sql
USE learning_log;
SHOW TABLES;
```
結果にlearning_recordテーブルが表示されていれば成功。

## おわりに
これでSpringBootとMySQLの連携はばっちりです。
今後はこのアプリケーションの開発を進めながら随時更新を続けたいと思います。
最後までご覧いただきありがとうございました。