Spring Bootのバージョン3系とMySQL(MariaDB)を連携した簡単なWeb系開発の説明をしています。Spring Bootプログラミングに興味のある入門者、初心者、独学者の方は参考にしてください。
※ 本ページはプロモーションが含まれています。
Javaで人気のWebフレームワークのSpring Bootのバージョン3系が出たみたいなので、本記事でMySQL(MariaDB)データベースと連携した簡単なSpring Boot3のWebアプリ・WebサイトなどのWeb系の開発入門記事を書いています。Spring Boot3を始めてみたい方、Spring Boot自体が初めて、入門者の方、独学で勉強したい方は是非参考にしてください。
◾️動作環境とバージョン情報です
OS:macOS Big Sur(バージョン11.7.7)
開発環境:Eclipse(Pleiades All in One Java Full Edition版)
Spring Bootバージョン:3.1
Java:Java17(OpenJDK17 Eclipse Temurin)
DB:MySQL Community Server 8.0.31 、MariaDB Server 10.6
本記事で説明しているSpring Boot3のウェブアプリの開発はDBにMySQL(MariaDB)を使っているので、前提としてMySQL(MariaDB)環境がある事としています。別ページでMySQL(MariaDB)のインストール方法について説明しているので、MySQL環境がない人は良ければ参考にしてください。
MySQLのインストール【macOS】
MySQL8のインストール方法(ec2,CentOS7)
MariaDB10.6(10.5)のインストール(Amazon Linux2(ec2),CentOS7)、WordPressの環境構築
本記事ではSpring Bootの開発環境はEclipseを使っています。開発環境は他のIntelliJ IDEAとかでももちろん良いですが、別ページでEclipseのインストール方法について説明しているので、まだ開発環境がない方は参考にしてください。
Eclipse(Pleiades All in One)をインスールしてJava開発環境を作る【macOS版】
まず、Spring Bootアプリの開発をする前にDB(MySQL,MariaDB)側の準備をします。Spring Bootアプリで使用するDBのテーブル作成やユーザ作成とユーザの権限設定をしておきます。
MariaDBはMySQLから派生したデータベースなので、以下のコマンドはMySQL、MariaDBどちらでも実行できます。
MySQLプロンプトにrootログインしてDBを作成します。hogedbという名前のDBを作成します。
> create database hogedb;
hogedb上にhoge_dataというテーブルを作成します(3カラムのシンプルなテーブル)。
> use hogedb;
Database changed
> create table hoge_data (id integer auto_increment, content varchar(512), updated_at timestamp not null, primary key (id));
hoge_dataテーブルのスキーマの確認です。
> desc hoge_data;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| content | varchar(512) | YES | | NULL | |
| updated_at | timestamp | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
> show full columns from hoge_data;
+------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| content | varchar(512) | utf8mb4_0900_ai_ci | YES | | NULL | | select,insert,update,references | |
| updated_at | timestamp | NULL | NO | | NULL | | select,insert,update,references | |
+------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
hoge_dataテーブルに初期データを少し作っておきます。
> INSERT INTO hoge_data(content, updated_at) VALUES('コンテンツ1', LOCALTIME()),
('コンテンツ2', LOCALTIME()),
('コンテンツ3', LOCALTIME());
> select * from hoge_data;
+----+--------------------+---------------------+
| id | content | updated_at |
+----+--------------------+---------------------+
| 1 | コンテンツ1 | 2023-06-06 17:39:23 |
| 2 | コンテンツ2 | 2023-06-06 17:39:29 |
| 3 | コンテンツ3 | 2023-06-06 17:39:34 |
+----+--------------------+---------------------+
次に、hogedbデータベース用のユーザ作成と権限設定をします。ユーザ名はhogeuser、パスワードはhogepassとします。
> CREATE USER 'hogeuser'@'localhost' IDENTIFIED BY 'hogepass';
> GRANT ALL PRIVILEGES ON `hogedb`.* TO "hogeuser"@"localhost";
作成したhogeuserユーザには、hogedbデータベースの操作権限を全て与えています。もしもSpring BootアプリとMySQL(MariaDB)サーバが別マシンというネットワーク環境の場合、MySQL(MariaDB)サーバは別マシンからのアクセスも許可する必要があるので、このコマンドでユーザ作成と権限設定をします。
> CREATE USER 'hogeuser'@'%' IDENTIFIED BY 'hogepass';
> GRANT ALL PRIVILEGES ON `hogedb`.* TO "hogeuser"@"%";
(*ここでは話を解りやすくするため全てのマシン(%)からアクセス許可するようにしていますが、セキュリティを考慮した場合はアクセス元を絞って権限設定した方が良いと思います。)
ここまでやったら一度MySQLプロンプトからログアウトして、新しく作ったhogeuserユーザでログインできるかを確認します。
$ mysql -uhogeuser -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.31 MySQL Community Server - GPL
〜
mysql:hogeuser@[(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hogedb |
| information_schema |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
できました!これでMySQL(MariaDB)側の準備は終了です。
作成したMySQL(MariaDB)ユーザを削除したい場合のコマンドです。
> drop user 'hogeuser'@'localhost';
MySQLのユーザ一覧の情報を確認したい場合は、mysqlデータベースのuserテーブルで確認できます(rootユーザで)。
> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| hogeuser | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
Spring Bootアプリの開発をやっていきます。ここでの開発環境はEclipseです。
Eclipseのプロジェクト作成->Springスターター・プロジェクトでプロジェクトを作成します。
Javaバージョンは17を選択しました(2023/6/6時点でJava17はLTSで最新バージョンです。LTSはLong Term Supportで長期サポート安定版の事。)
Spring Bootのバージョンは3.1を選択しました(2023/6/6時点で選択できる最新版)。
依存関係ライブラリは今回7つを選択しました。
(*DBにMariaDBを使う場合、MySQL DriverではなくMariaDB Driverを使います。)
■作成したSpring Boot3プロジェクトのJava(JDK)のバージョンが17より下のバージョンの場合
自分の環境では、Spring Bootプロジェクト作成後、EclipseのパッケージエクスプローラービューでJREシステムライブラリーを確認したら、Java(JDK)のバージョンが14になっていました(プロジェクト作成時にJavaバージョンは17を選択したのに)。これは自分の環境のEclipseにバンドルされているJavaの最新バージョンが14だからだと思います。
ただ、Spring Boot3のシステム要件としてJavaのバージョンはJava17以上なので、作成したSpring Bootプロジェクトで使用するJavaをJava17(JDK17)以上に変更する必要があります。
Javaのバージョンが17より低いままでSpring Boot3のアプリを起動すると、起動時にこんなエラーメッセージが出て起動できない。
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 58.0
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
〜
Eclipseのプロジェクトで使用するJava(JDK)を変更する設定方法については別ページで説明しているので、そちらを参考にしてください。
EclipseのJavaプロジェクトで使うJDK(Java)を新規追加して設定する
また、そもそもJava17(JDK17)以上の環境が無い場合はインストールして用意する必要があります。別ページでOpenJDK17のインストール方法について説明しているので、良ければそちらも参考にしてください。
OpenJDK17をインストールする【macOS】
Spring Bootプロジェクトを作成したら、とりあえずSpring Bootアプリを起動してみます。
起動するには、TmpSpringboot310Application.java(作成したプロジェクト名 + Applicationというファイル名)のJavaファイルが1つ作成されていると思うので、そのファイルを右クリック->実行->Spring Bootアプリケーションを選択して起動します。
Spring Bootプロジェクトを作成してすぐにアプリを起動したら、「APPLICATION FAILED TO START」というエラーが出ました。
2023-06-24T20:10:50.067+09:00 ERROR 22342 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
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
〜
このエラーの原因は、Spring BootアプリとMySQL(MariaDB)の接続設定をしていないからです(ちなみにDBにH2を使用する場合はこのエラーは出ない)。
ですので、Spring Bootアプリの設定ファイルapplication.propertiesでMySQLの接続設定をします。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/hogedb
spring.datasource.username=hogeuser
spring.datasource.password=hogepass
#SQLログ出力
spring.jpa.show-sql=true
DBがMariaDBで、MariaDBサーバがSpring Bootアプリとは別マシン(例えばIPアドレスが192.168.33.10)にある場合、pring.datasource.driver-class-nameとspring.datasource.urlはこんな感じで。
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://192.168.33.10:3306/hogedb
MySQL(MariaDB)のDB名と接続ユーザ/パスワードは、作ったものに合わせます(ここでは、DB名はhogedb、MySQLユーザ名はhogeuser、パスワードはhogepassです。)
また、Spring Bootアプリの実行時にEclipseのコンソール上にSQLのログ出力(HibernateのSQLロギング)をしたいのでをしたいので、その設定も1行書いています。
これでMySQL(MariaDB)との連携設定ができたので、Spring Bootアプリを起動できるはずです。
あと、起動時に「OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 〜」という警告メッセージが出ましたが、スルーしても問題なさそうなので今回は無視しました。
この警告の詳細と解決方法については別ページで説明しているので、もしこの警告が気になる人は参考にしてください。
警告メッセージ「OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated 〜」
Spring Bootのエンティティクラスを作成します。MySQL(MariaDB)で作ったhoge_dataテーブル用のエンティティクラスです。
クラス名はHogeData、パッケージはデフォルトのcom.example.demoにします。
HogeDataクラスのソースコードです。
package com.example.demo;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
//@Table(name = "hoge_Data") //クラス名とDBのテーブル名が一致しない場合は@Tableでテーブル名を明示する
public class HogeData {
public HogeData(String content, LocalDateTime updatedAt) {
this.content = content;
this.updatedAt = updatedAt;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private String content;
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;
}
HogeDataエンティティクラスではLombokを使っています。Lombokがあるとアノテーションを付けるだけでセッター・ゲッター・コンストラクタなどのコードを自動で生成してくれます。開発環境がPleiades All in OneのEclipseなら、デフォルトでLombokは入っていて使えるので何もする必要はないけど、もしLombokがない開発環境ならEclipseで使えるようにLombokをインストールする必要があります。
次に、リポジトリインタフェースを作成します。hoge_dataテーブル用のリポジトリインタフェースです。
インタフェース名はHogeDataRepositoryです。
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
public interface HogeDataRepository extends CrudRepository<HogeData, Integer> {
}
HogeDataRepositoryは特に何もメソッドを宣言していないけど、CrudRepositoryを継承している事で基本的なCRUDのSQLを実行するメソッドを呼び出して使えるようになります。ただ、条件付きのSQLやちょっと複雑なSQLを実行したい場合は、リポジトリインタフェース内で宣言しておく必要があります。宣言だけで実装はしなくてもいいのでかなり便利です。
リポジトリインタフェースのもっと詳細なプログラミングやSpring Data JPAについては別ページで説明しているので、Spring Bootでもう少し複雑なDB操作のプログラミングをしたい人は参考にしてください。
Spring Bootでリポジトリインタフェースのプログラミング
今回はCrudRepositoryを継承したリポジトリインタフェースを作ったけど、他のJpaRepositoryを継承しても問題なくできます。JpaRepositoryはCrudRepositoryや他のインタフェースを継承しているので高機能だと思います。
Spring Bootのコントローラクラスを作成します。クラス名はHogeDataControllerにします。
package com.example.demo;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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;
@Controller
@RequestMapping("hoge")
public class HogeDataController {
@Autowired
HogeDataRepository hogeDataRepository;
//データ一覧を取得
@GetMapping("list")
public String list(Model model) {
Iterable<HogeData> hogeDatas = hogeDataRepository.findAll();
model.addAttribute("hogeDatas", hogeDatas);
return "list";
}
//引数idのデータを削除
@PostMapping("delete")
public String delete(@RequestParam Integer id) {
hogeDataRepository.deleteById(id);
return "redirect:/hoge/list";
}
//データの追加
@PostMapping("add")
public String add(@RequestParam String newHogeData) {
HogeData hogeData = new HogeData(newHogeData, LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
hogeDataRepository.save(hogeData);
return "redirect:/hoge/list";
}
}
今回、HogeDataControllerコントローラークラスで作成したメソッドは3つです。
listメソッドは、hoge_dataテーブルのデータ一覧を取得してクライアント側(画面側)に返します。
deleteメソッドは、引数idを条件にhoge_dataテーブルのレコードを削除します。
addメソッドは、hoge_dataテーブルに新規レコード(引数の値)を追加します。
次に、画面側(クライアント側、HTML)の作成です。Spring Bootの画面側はThymeleafというテンプレートファイルで作るのが一般的です。(ThymeleafだとHTMLにサーバから返された変数を埋め込む事ができたり、他にも色々とプログラミングぽい事ができる。)
プロジェクトのsrc/main/resources/templateディレクトリ下にlist.htmlファイルを作成します。(ファイル名のlistは、HogeDataControllerコントローラクラスのlistメソッドのreturn値のlistに合わせる必要がある。)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot3アプリ + MySQL</title>
</head>
<body>
<h1>Spring Boot3アプリ + MySQL</h1>
<h2>hogeDataのデータ一覧</h2>
<table>
<tr><th>コンテンツ</th><th>更新日時</th><th></th></tr>
<tr th:each="hogeData : ${hogeDatas}">
<td th:text="${hogeData.content}"></td>
<td th:text="${hogeData.updatedAt}"></td>
<td>
<form th:action="@{/hoge/delete}" method="post">
<input type="hidden" name="id" th:value="${hogeData.id}"/>
<input type="submit" value="削除"/>
</form>
</td>
</tr>
</table>
<h3>新規データ追加</h3>
<form th:action="@{/hoge/add}" method="post">
<input type="text" name="newHogeData">
<button type="submit">データ追加する</button>
</form>
</body>
</html>
画面側では、hoge_dataテーブルのデータ一覧表示と削除ボタンと新規データ追加機能を付けています。
これまでに設定ファイルapplication.propertiesでMySQL(MariaDB)の接続設定をして、エンティティクラス、リポジトリインタフェース、コントローラクラス、テンプレートファイルの作成をしてきました。とりあえずこれでSpring Bootアプリが動作するはずなので、動作確認をします。
アプリを起動して、ブラウザで「http://localhost:8080/hoge/list」にアクセスします。
MySQL(MariaDB)のhogeDataテーブルのデータ一覧が見れるはずです。
あと、削除ボタンでデータ削除、新規データ追加からデータ追加もできると思います。
また、一覧表示やデータ追加、削除を実行した時にEclipseのコンソールログを確認したら、select,insert,delete文などのSQLログも出力されていると思います。
以上簡単でしたが、MySQL(MariaDB)と連携したSpring Boot3のウェブアプリの開発をしてきました。ここで説明したのはSpring Bootのほんの一部分だけなので、Spring Bootを使いこなすにはまだまだ色々と勉強する事があると思います。例えば、リポジトリ、コントローラークラス、Thymeleafの詳細や、フォームやバリデーション、アノテーション、セッション、ログイン認証周り(Spring Security)、DBテーブルの結合、セキュリティなどです(極めるなら他にもいっぱい、Spring Test、IoC、AOP(アスペクト指向プログラミング)、、)。
Spring BootはJava開発の仕事の現場でもよく使われる、かつとっつきやすいフレームワークだと思うので、Javaエンジニアや、これからJavaプログラマを目指す人にはお勧めです。Spring Boot3を学習するならやっぱり入門書などが体系的に勉強できるので良いと思います。
別ページでSpring Bootアプリ開発のCRUD、バリデーション、Bootstrapデザインの適用などについて説明しているので、良ければ参考にしてください。
Spring Bootで日記投稿ウェブアプリ開発入門
今回Spring Bootのバージョン3系を試してみて、Spring Bootのバージョン3系とバージョン2系の違いですが、正直3系はまだちょっとしか触ってないからそこまで違いを感じていません。エンティティクラスのアノテーションクラスのパッケージデザインが変わったなとは感じたぐらいです。個人的にはまだこれからバージョン3系の勉強をする必要があると感じています。
EclipseでSpring Boot開発をしている場合はEclipse上で実行・デバッグ起動して動作確認すれば良いですが、Spring Bootアプリがある程度開発できたら、アプリをjarファイル化してLinuxサーバ上でjavaコマンドで実行したくなります。
別ページでSpring Bootアプリをjar化してコマンド実行したり、Linuxサーバ上で起動する方法について説明しているので、参考にしてください。
Spring Bootをjavaコマンドで起動する
Spring Boot + MySQL(MariaDB)の実行環境を作る