2026年5月22日金曜日

SpringBoot で MySQL に接続する方法

SpringBoot で MySQL に接続する方法

概要

前回 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 などのマイグレーションツールを使ってバージョン管理しましょう

参考サイト

0 件のコメント:

コメントを投稿