【開発環境構築】Dockerで「Spring + MYSQL」の開発環境を構築する

DB

はしめに

Dockerで「Spring + MYSQL」を使用するための開発環境を構築するとログを書いていきます。

 

前提条件

以下の条件が実施/確認済みであること。
(重複している部分が存在します)

・Dockerが設定済みであること
【開発環境構築】DockerをインストールしてPCにコンテナを作成してみる – SEもりのLog (selifemorizo.com)

・VSCodeでJavaを使用できる構築がされていること
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)

・Springプロジェクトを用意
【開発環境構築】VSCodeでSpring Bootを使用するための環境構築から実行まで実施する – SEもりのLog (selifemorizo.com)

・MYSQLのテーブル等の用意
【開発環境構築】DockerでMySQLの開発環境を構築する – SEもりのLog (selifemorizo.com)

 

フォルダ/ファイル構成を作成する

Spring_MYSQL
│  docker-compose.yml
│
├─DB                    ←Mysqlのデータをマウントするフォルダ
└─Test                  ←作成したSpring Bootプロジェクト
  └─Test                  ←作成したSpring Bootプロジェクト
     │  .gitignore

     │  HELP.md
     │  mvnw
     │  mvnw.cmd
     │  pom.xml
     │
     ├─.mvn        ←中身のファイルは省略
     ├─.vscode      ←中身のファイルは省略
     ├─src         ←中身のファイルは省略
     └─target       ←中身のファイルは省略

docker-compose.ymlを作成する

version: '3'

services:
 #Java
 java:
  container_name: JavaTest
  image: openjdk:17
  ports: 
   # 既に使用しているポートは避ける
   - 8080:8080
  volumes:
   - ./Test:/srv:cached
  # 用意したSpring Bootプロジェクト
  working_dir: /Test
  # コンテナが消えないようにtrueを設定
  tty: true


 #MYSQL
 mysql :
  container_name: MysqlTest
  image: mysql:latest
  command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  environment:
    MYSQL_ROOT_PASSWORD: rootPass
    MYSQL_DATABASE: test_database
    MYSQL_USER: testUser
    MYSQL_PASSWORD: testPass
    TZ: 'Asia/Tokyo'
  #データを保管するためにボリュームを指定する
  volumes:
    - ./db/data:/var/lib/mysql
  #MySQLのデフォルトポートは「3306」だが、既に使用している場合は、別の値を使用する
  ports:
    - '3307:3306'


 

Docker-composeコマンドを実行する

最初の実行は少し時間がかかるかもしれません。
-f 以降は自身の作成したファイルのパスを指定してください。

>docker-compose -f \docker-compose.yml up -d

 

コンテナが作成されたことを確認する

>docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                               NAMES
7d37d47052ab   openjdk:17     "jshell"                  4 minutes ago   Up 4 minutes   0.0.0.0:8080->8080/tcp              JavaTest
61c6b93d1dc0   mysql:latest   "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp   MysqlTest

 

SpringBootでMYSQLへ接続する

プロジェクトの作成やテーブルの生成等は前提条件を参照ください。

application.propertiesの編集

resourcesフォルダは以下の「application.properties」にMYSQLへの接続設定を記載します。

# ポート/psssは自身で設定したもの
spring.datasource.url=jdbc:mysql://localhost:3307
spring.datasource.username=root
spring.datasource.password=test_database
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

pom.xml

依存関係を追加定義します。

		<!-- MYSQLのJDBCドライバ -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.17</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Springが提供するjdbc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.hibernate.javax.persistence</groupId>
			<artifactId>hibernate-jpa-2.1-api</artifactId>
			<version>1.0.0.Final</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

 

フォルダ/ファイルを作成する

フォルダ/ファイルを作成する。
既に作成されているプロジェクトフォルダ構成の中に追加する

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─example
│  │  │          └─test


│  │  │              ├─Controller

│  │  │              │      MysqlTestController.java  ←追加
│  │  │              │
│  │  │              ├─Entities
│  │  │              │      TestDataEntity.java  ←追加
│  │  │              │
│  │  │              └─Repositories
│  │  │                      TestDataRepository.java  ←追加
│  │  │
│  │  └─resources
│  │      │  application.properties

│  │      └─templates

│  │              mysqlIndex.html  ←追加
│  │

 

Entityクラス

データベースのデータを関連付けるためのクラスを作成する。
【TestDataEntity.java】

package com.example.test.Entities;

import java.util.Date;
import javax.persistence.Id;

import lombok.Data;


@Data
public class TestDataEntity 
{
    public TestDataEntity(int id, String name, String createdUser, Date createdDate, String updatedUser, Date updatedDate) 
    {
            this.id = id;
            this.name = name;
            this.createdUser = createdUser;
            this.createdDate = createdDate;
            this.updatedUser = updatedUser;
            this.updatedDate = updatedDate;
    }

    @Id
	private Integer id;
    private String name;
	private String createdUser;
	private Date createdDate;
	private String updatedUser;
	private Date updatedDate;
}

 

Repositoryクラス

[test_table]テーブルへの接続(CRUD)の情報を一括管理するクラスを作成する。
【TestDataRepository.java】

package com.example.test.Repositories;

import com.example.test.Entities.TestDataEntity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class TestDataRepository
{
    @Autowired
	JdbcTemplate jdbcTemplate;

	String selectAllsql = "SELECT id ,name,createdUser,createdDate,updatedUser,updatedDate FROM mysql.test_table";
	
    public List<TestDataEntity> selectAll() 
	{
		List<Map<String, Object>> tempList = jdbcTemplate.queryForList(selectAllsql);
		List<TestDataEntity> testDataList = new ArrayList<>();
		for (Map<String, Object> testdata : tempList) 
		{
			testDataList.add(new TestDataEntity(
					(int) testdata.get("id"), 
					(String) testdata.get("name"), 
					(String) testdata.get("createdUser"), 
					(Date) testdata.get("createdDate"),
					(String) testdata.get("updatedUser"), 
					(Date) testdata.get("updatedDate")));
		}

		return testDataList;
	}
}

 

Controllerクラス

画面のデータ受け渡し制御を実施するクラスを作成する。
【MysqlTestController.java】

package com.example.test.Controller;

import java.util.List;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;

import com.example.test.Entities.TestDataEntity;
import com.example.test.Repositories.TestDataRepository;
import lombok.RequiredArgsConstructor;

@Controller
@RequiredArgsConstructor
public class MysqlTestController 
{
    private final TestDataRepository testDataRepository;

    @RequestMapping("/test2")
	public String Index(Model model) 
	{
		List<TestDataEntity> list = testDataRepository.selectAll();
		model.addAttribute("TestDataList",list);
		return "mysqlIndex";
	}
}

 

View

画面表示を実施するhtmlを作成する。
【mysqlIndex.html】

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <table border="2" cellpadding="6" cellspacing="5">
      <tr>
        <th>id</th>
        <th>name</th>
        <th>createUser</th>
        <th>createDate</th>
        <th>updateUser</th>
        <th>updateDate</th>
      </tr>
      <tr th:each="list : ${TestDataList}">
        <td th:text="${list.id}"></td>
        <td th:text="${list.name}"></td>
        <td th:text="${list.createdUser}"></td>
        <td th:text="${list.createdDate}"></td>
        <td th:text="${list.updatedUser}"></td>
        <td th:text="${list.updatedDate}"></td>
      </tr>
    </table>
  </body>
</html>

 

実行確認

F5キー、またはタブの実行からプロジェクトを実行後にブラウザで実装した内容が表示されることを確認する。

【ブラウザで指定するURL】
“http://localhost:8080/test2”

 

ドキュメント

【Docker】
Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 24.0 ドキュメント

【MySQL】
MySQL

【Spring】
Spring リファレンスドキュメント – Java フレームワーク (pleiades.io)

 

最後に

以上、ログになります。
これからも継続していきましょう!!

DBJava共通
おすすめIT本
良いコード/悪いコードで学ぶ設計入門

「ITエンジニア本大賞2023」技術書部門で大賞を受賞した本です。
・コードの可読性
・普段意識したほうが良いこと
・リファクタリング考え方
等、普段のコードを設計する際に意識することが書かれています。
コードのあるべき姿に迷ったら一度読んでみると良い本です。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

Dockerって何?となったときに私が最初に読んだ本です。
Dockerがどんな仕組みで動いているのか、コマンドでは何を命令しているのかを理解できるように、イラストを多用して説明しています。

1冊ですべて身につくJavaScript入門講座

「ITエンジニア本大賞2024」技術書部門で大賞を受賞した本です。
私が次に読もうと思っている本なのでおすすめとして挙げておきたいと思います。

コメント

タイトルとURLをコピーしました