概要
前回 SpringBoot の開発環境を構築しました
今回はアプリケーションを修正し MySQL を使ったアプリにします
環境
- macOS 26.4.1
- openjdk 26.0.1
- SpringBoot 4.0.6
- gradle 9.5.1
- VSCode 1.121.0
- MySQL 9.6.0
MySQL 準備
使えれば何でも OK です
- brew install mysql
あとで説明もしますが今回は docker compose を使ってアプリ起動時に自動で mysql も起動して勝手にその mysql を使ってくれる構成なので最悪 mysql はインストールしないでも OK です
Spring Initializr を使ってプロジェクトを作成
https://start.spring.io/ でプロジェクトの雛形を作成します
前回と違うのは Dependencies に MySQL に関連する項目も選択する部分です
- Project -> Gradle - Groovy
- Language -> Java
- Spring Boot -> 4.0.6
- Dependencies -> Spring Web, Spring Data JPA, MySQL Driver, Testcontainers, Docker Compose Support
- Java -> 26
で Generate すると demo.zip がダウンロードできます
demo.zip を展開し VSCode で開く
展開してできた demo フォルダを VSCode で開きましょう
拡張は以下をインストールします
- Extension Pack for Java
- Spring Boot Extension Pack
Entity ファイルの作成
データベースの構造を定義します
Spring はこの Entity ファイルの定義に従って自動的にデータベースをマイグレートとしてくれます
- vim src/main/java/com/example/demo/User.java
package com.example.demo;
import org.jspecify.annotations.Nullable;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity // これはHibernateにこのクラスからテーブルを作成するように指示します
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private @Nullable Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Repository の作成
Spring は Entity 用のリポジトリを作成すると最低限の CRUD 処理を暗黙的に作成してくれます
それ以外の複雑な SQL を実行したい場合はここに別途定義します
ファイルに基本的な CRUD 処理がないのは Spring が自動で生成してくれているためです
- vim src/main/java/com/example/demo/UserRepository.java
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
// これはSpringによってuserRepositoryというBeanに自動的に実装されます
public interface UserRepository extends CrudRepository<User, Integer> {
}
コントローラの作成
今回はユーザを登録する処理と登録したユーザを取得する処理を追加します
- vim src/main/java/com/example/demo/MainController.java
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // これは、このクラスがコントローラーであることを意味します
@RequestMapping(path = "/demo") // これはURLが/demoで始まることを意味します(アプリケーションパスの後)
public class MainController {
@Autowired // これは、userRepositoryというBeanを取得することを意味します
// Springによって自動的に生成されるため、データ処理に使用します
private UserRepository userRepository;
@PostMapping(path = "/add") // POSTリクエストを/demo/addにマッピングします
public @ResponseBody String addNewUser(@RequestParam String name, @RequestParam String email) {
// @ResponseBody は、返される文字列がレスポンスであり、ビュー名ではないことを意味します
// @RequestParam は、GET または POST リクエストからのパラメータであることを意味します
User n = new User();
n.setName(name);
n.setEmail(email);
userRepository.save(n);
return "Saved";
}
@GetMapping(path = "/all")
public @ResponseBody Iterable<User> getAllUsers() {
// これはユーザーのJSONまたはXMLを返します
return userRepository.findAll();
}
}
メインアプリケーションの作成
@Controller で定義したクラスは自動的に読み込まれるので特にアプリケーション側で指定する必要はありません
- vim src/main/java/com/example/demo/AccessingDataMysqlApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMysqlApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataMysqlApplication.class, args);
}
}
アプリ起動
ローカルでアプリを起動します
-
./gradlew bootRun
各種必要な jar のダウンロードなどが始まります
基本的には ~/.gradle/ にダウンロードされます
最終的に EXECUTING になれば起動しています
また今回は docker compose plugin を使用しているためプロジェクト配下に compose.yaml を自動的に作成しその compose.yaml を bootRun 時に自動で起動します
なので mysql コンテナが自動的に作成されかつ Entity に定義したテーブル情報も自動で生成されます
mysql> use mydatabase;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| user |
| user_seq |
+----------------------+
2 rows in set (0.002 sec)
動作確認
-
$ curl http://localhost:8080/demo/add -d name=First -d email=someemail@someemailprovider.com
Saved
-
curl http://localhost:8080/demo/all
[{"email":"someemail@someemailprovider.com","id":1,"name":"First"}]
他のデータベースに接続する方法
org.springframework.boot:spring-boot-docker-compose は自動的に compose.yaml を読み込み接続します
手動で設定した MySQL に接続する場合は application.properties に以下のように記載します
spring.application.name=demo
# update はアプリケーション起動時に、Entityに対応するテーブルがなければ作成します
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=
これで更にプロジェクトは以下にある compose.yaml を削除するかサブディレクトリに移動するか compose.yaml にラベルを追記すれば application.properties にあるデータベースに接続します
services:
mysql:
image: 'mysql:latest'
environment:
- 'MYSQL_DATABASE=mydatabase'
- 'MYSQL_PASSWORD=xxx'
- 'MYSQL_ROOT_PASSWORD=xxx'
- 'MYSQL_USER=myuser'
ports:
- '3306'
labels:
org.springframework.boot.ignore: true
最後に
SpringBoot で MySQL に接続する方法を紹介しました
Rails や Jango の用に CRUD ツールも備わっているのでかなり簡単に接続/操作できる印象です
本番では Liquibase や Flyway などのマイグレーションツールを使ってバージョン管理しましょう