スポンサーリンク

【SpringBoot】各レイヤーの役割。controller,form,dto,service,repository,entity,mapper

Java
スポンサーリンク

今回の記事はSpringBootの各レイヤーの役割をご紹介する記事です。紹介するレイヤはcontroller,form,dto,service,repository,entity,mapperです。役割に合わせてどのように使用するかを実際に簡単なアプリケーションのサンプルコードでも解説していきます。SpringBoot初心者の方は是非参考にしていただければ幸いです。

スポンサーリンク

SpringBootのレイヤーとは?

SpringBootのレイヤーとは下記のようなWebアプリケーションの仕組みを作るうえで、「ブラウザからのアクセスを管理する」「業務ロジック(入力チェックや計算)を行う」「DBにアクセスする」などの、各役割を持ったクラスを構成することで、プロジェクトの管理や開発効率を上げる仕組みのことです。

SpringBootの各レイヤーとデータの受け渡しに関して

続いては各レイヤーとレイヤー間のデータの受け渡し方法をご紹介します。

役割をまとめると下記のようになります。

  • controller:入力に関する処理と画面描写に処理をする
  • form:画面の入力値
  • dto:レイヤー間のデータ受け渡し用の入れ物
  • service:業務処理とDB操作クラス(repositoy)を呼び出す
  • repository:DB操作を行うmapperを呼び出す
  • entity:DBからのデータを入れる入れ物
  • mapper:SQLを実行する

それぞれ詳細に説明していきます。

controllerの役割

controllerとは文字で説明すると「入力に関する処理と画面描写に処理をする。」と説明している記事が多いです。

ここでいう「入力に関する処理」とはブラウザなどで、URL「http://localhost/sample」を叩いた時に、このURLに対応する処理を行うというルーティング機能です。

「画面描写に関する処理」は、入力あっての処理で、そのURLに対応する処理の最後に表示したいHTMLファイルを指定し、ブラウザの画面に表示するという処理です。

MVCでのcontrollerの動きとしては下記となります。

  1. SpringBootでも同じで、画面からform情報+URL情報を受け取り正しいローディングを行う。
  2. formからdtoへデータを変換
  3. serviceを呼ぶ

全体的な流れでいうと下記のようになります。

また、ロジックは基本的にcontrollerには実装せず、serviceに実装する必要があります。

formの役割

formとは文字で説明すると「画面からの入力情報を扱う。」と説明している記事が多いです。

画面の入力欄に「性別」「名前」など入力欄のある下記のような画面は見たことがあると思います。

この入力情報をcontrollerに投げるための箱のようなものをイメージしていただければそれがformです。

dtoの役割

dtoとは文字で説明すると「レイヤー間でのデータを扱う。」と説明している記事が多いです。

どういうことかというとSpringBootのレイヤーについて理解しておく必要があると思います。

SpringBootのレイヤーは主要処理のみでいうと下記です。

  1. controller:serviceを呼び出す
  2. service:ロジック関連処理+repositoryを呼んでDB操作の管理
  3. repository:mapperを呼んでDB操作の管理
  4. mapper:SQL実行

controllerからserviceを呼ぶなどのレイヤー間のデータの受け渡しを行う際に一旦入れるオブジェクトとして、dtoがあります。インスタンスを作成し、メソッドを使用します。

図で表すと下記のようにレイヤー間でのデータ受け渡しに使用されます。

ちなみにdtoの正式名称は「Data Transfer Object」で頭文字を取ってdtoです。

formとentityもデータの受け渡し用と考えると、似ていますが別物です。

serviceの役割

serviceとは文字で説明すると「controllerに対して、業務ロジックを提供する。トランザクション境界。」と説明している記事が多いです。

entityへの詰め替えはrepositoryで行うのでserviceでは純粋な業務系のロジックとrepositoryメソッドを呼び出すのみです。

図で表すと下記のような役割です。

repositoryの役割

repositoryとは文字で説明すると「Serviceに対して、データのライフサイクルを制御するための操作を提供する。」と説明している記事が多いです。

しかし、SpringBoot初心者にとってこの説明ではよくわからないと思います。ライフサイクル?

簡単に言い換えると、「Serviceから呼ばれて、DB操作をするmapperクラスを呼んで操作する。」です。

repositoryクラスを知る前に、repositoryクラスの前後の処理フローを理解しておく必要があります。

  1. serviceから呼ばる
  2. dtoを受け取り内部でentityに変換
  3. entityを渡し、mapperクラスを呼ぶ
  4. mapperによりSQL実行(mapperの処理
  5. DBから取得したデータをentityとして、mapperが受け取る(mapperの処理
  6. データをentityとしてmapperから受け取る
  7. serviceにentityとしてデータを返す

このような流れで、repositoryは動いています。

entityの役割

entityとは文字で説明すると「テーブルを写像した永続化可能なJavaオブジェクトを提供する。」と説明している記事が多いです。

しかし、SpringBoot初心者にとってこの説明ではよくわからないと思います。

簡単に言い換えると、「テーブルの1行分のデータのかたまりのようなもの」です。

さらに簡単に説明するために画像を用意します。

上記の図のようにmapperクラス(DBからデータを取ってくるのみのクラス)で発行したSQLによってデータを取得した時の、入れ物のようなものです。

データが複数になっても、このentityが配列([entity1,entity2])のように入れ物が増えるイメージです。

mapperの役割

mapperとは文字で説明すると「DBアクセスを行う。」と説明している記事が多いです。

DBアクセスとは何かというと実際にMySQLやOracleなどのデータベースにSQLを発行してデータを取得・追加・更新・削除するということです。

repositoryからmapperインスタンスを作成し、使用します。

SpringBootの各レイヤ実装

ここからはコードベースで実際に動くアプリケーションを作成して、各レイヤーの動きを理解していきます。

mapperなどはMybatisで作成していますが、今回はこの記事のコードをコピペで問題ないです。

モジュールはgradleなどでインストールしてください。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation  'org.mybatis.generator:mybatis-generator-core:1.4.1'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
	implementation 'org.springframework.boot:spring-boot-starter-web'
}

次にローカルにMySQLをインストールし、MYSQLにデータテーブルを作成します。

create dtabase javatest;

use javatest;

CREATE TABLE `user1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

では順番にコードを張っていきます。

package com.example.demo.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo.dto.SampleDto;
import com.example.demo.form.SampleForm;
import com.example.demo.service.SampleService;

@Controller
public class SampleController {
	private SampleService service;

	public SampleController(SampleService service) {
		this.service = service;
	}

	@GetMapping("/")
	public String getList(@ModelAttribute SampleForm sampleForm,Model model) {

		// 一覧取得
		List<SampleDto> result = service.getUserList();
		model.addAttribute("sampleList",result);

		return "sampleList";

	}

	@PostMapping("/regist")
	public String registUser(@ModelAttribute SampleForm sampleForm, Model model) {

		// dtoに置き換え
		SampleDto dto = new SampleDto();
		dto.setName(sampleForm.getName());
		dto.setAge(sampleForm.getAge());

		// 登録処理
		service.registUser(dto);

		// 一覧取得
		List<SampleDto> result = service.getUserList();
		model.addAttribute("sampleList",result);

		return "sampleList";

	}
}
package com.example.demo.form;

import lombok.Data;

@Data
public class SampleForm {

	// 名前
	private String name;

	// 年齢
	private Integer age;
}
package com.example.demo.dto;

import lombok.Data;

@Data
public class SampleDto {
	// ID
	private Integer id;

	// 名前
	private String name;

	// 年齢
	private Integer age;
}
package com.example.demo.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.example.demo.dto.SampleDto;
import com.example.demo.repository.SampleRepository;

@Service
public class SampleService {

	private SampleRepository repository;

	public SampleService(SampleRepository repository) {
		this.repository = repository;
	}


	// ユーザ登録
	public void registUser(SampleDto dto){
		// 入力チェック

		// ロジック系の処理

		Integer result = repository.insertUser(dto);

		if (result.equals(1)) {
			// エラー処理
		}

		// 正常処理
		return;
	}


	// 一覧取得
		public List<SampleDto> getUserList(){

			List<SampleDto> result = repository.selectAll();
			return result;
		}
}
package com.example.demo.repository;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.dto.SampleDto;
import com.example.demo.entity.User1;
import com.example.demo.mapper.User1Mapper;

@Repository
public class SampleRepository {
	private User1Mapper mapper;

	public SampleRepository(User1Mapper mapper) {
		this.mapper = mapper;
	}

	// データ取得
	public List<SampleDto> selectAll(){

		// 一覧取得
		List<User1> data = mapper.selectByExample(null);

		List<SampleDto> result = new ArrayList<SampleDto>();
		for (User1 param : data) {
			SampleDto dto = new SampleDto();
			dto.setId(param.getId());
			dto.setName(param.getName());
			dto.setAge(param.getAge());

			result.add(dto);
		}

		return result;
	}

	// インサート
	public Integer insertUser(SampleDto dto){

		// dtoからentityに置き換え
		User1 user1 = new User1();
		user1.setName(dto.getName());
		user1.setAge(dto.getAge());

		Integer result = mapper.insert(user1);

		return result;
	}
}
package com.example.demo.entity;

public class User1 {

	/**
	 * This field was generated by MyBatis Generator. This field corresponds to the database column user1.id
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	private Integer id;
	/**
	 * This field was generated by MyBatis Generator. This field corresponds to the database column user1.name
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	private String name;
	/**
	 * This field was generated by MyBatis Generator. This field corresponds to the database column user1.age
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	private Integer age;

	/**
	 * This method was generated by MyBatis Generator. This method returns the value of the database column user1.id
	 * @return  the value of user1.id
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * This method was generated by MyBatis Generator. This method sets the value of the database column user1.id
	 * @param id  the value for user1.id
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * This method was generated by MyBatis Generator. This method returns the value of the database column user1.name
	 * @return  the value of user1.name
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public String getName() {
		return name;
	}

	/**
	 * This method was generated by MyBatis Generator. This method sets the value of the database column user1.name
	 * @param name  the value for user1.name
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * This method was generated by MyBatis Generator. This method returns the value of the database column user1.age
	 * @return  the value of user1.age
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public Integer getAge() {
		return age;
	}

	/**
	 * This method was generated by MyBatis Generator. This method sets the value of the database column user1.age
	 * @param age  the value for user1.age
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	public void setAge(Integer age) {
		this.age = age;
	}
}
package com.example.demo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.example.demo.entity.User1;
import com.example.demo.entity.User1Example;

@Mapper
public interface User1Mapper {

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int countByExample(User1Example example);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int deleteByExample(User1Example example);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int deleteByPrimaryKey(Integer id);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int insert(User1 record);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int insertSelective(User1 record);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	List<User1> selectByExample(User1Example example);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	User1 selectByPrimaryKey(Integer id);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int updateByExampleSelective(@Param("record") User1 record, @Param("example") User1Example example);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int updateByExample(@Param("record") User1 record, @Param("example") User1Example example);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int updateByPrimaryKeySelective(User1 record);

	/**
	 * This method was generated by MyBatis Generator. This method corresponds to the database table user1
	 * @mbggenerated  Fri Jul 14 14:21:29 JST 2023
	 */
	int updateByPrimaryKey(User1 record);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.User1Mapper">
  <resultMap id="BaseResultMap" type="com.example.demo.entity.User1">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="age" jdbcType="INTEGER" property="age" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    id, name, age
  </sql>
  <select id="selectByExample" parameterType="com.example.demo.entity.User1Example" resultMap="BaseResultMap">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    select 
    <include refid="Base_Column_List" />
    from user1
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    delete from user1
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="com.example.demo.entity.User1Example">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    delete from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.example.demo.entity.User1" useGeneratedKeys="true">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    insert into user1 (name, age)
    values (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.example.demo.entity.User1" useGeneratedKeys="true">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    insert into user1
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="name != null">
        name,
      </if>
      <if test="age != null">
        age,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        #{age,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <select id="countByExample" parameterType="com.example.demo.entity.User1Example" resultType="java.lang.Integer">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    select count(*) from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>
  <update id="updateByExampleSelective" parameterType="map">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    update user1
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.name != null">
        name = #{record.name,jdbcType=VARCHAR},
      </if>
      <if test="record.age != null">
        age = #{record.age,jdbcType=INTEGER},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    update user1
    set id = #{record.id,jdbcType=INTEGER},
      name = #{record.name,jdbcType=VARCHAR},
      age = #{record.age,jdbcType=INTEGER}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="com.example.demo.entity.User1">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    update user1
    <set>
      <if test="name != null">
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        age = #{age,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.example.demo.entity.User1">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jul 14 14:21:29 JST 2023.
    -->
    update user1
    set name = #{name,jdbcType=VARCHAR},
      age = #{age,jdbcType=INTEGER}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

上記までが各レイヤーとレイヤー間のデータ受け渡し用の実装です。

これに加えて、画面を表示する用のHTMLとDBに接続するための設定ファイルも用意します。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
</head>
<body>
	<form th:action="@{/regist}" th:object="${sampleForm}" method="post">
		<div class="field">
			<label>名前</label>

			<input type="text" placeholder="名前" th:field="*{name}" >
			<div class="ui pointing red basic label" th:errors="*{name}"></div>
		</div>
		<div>
			<label>年齢</label>
			<input type="text" placeholder="年齢" th:field="*{age}" >
		</div>
		<button>登録</button>
	</form>

	<table>
        <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
        </tr>
        <tr th:each="list:${sampleList}">
            <td th:text="${list.id}"></td>
            <td th:text="${list.name}"></td>
            <td th:text="${list.age}"></td>
        </tr>
    </table>
</body>
</html>
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/javatest?enabledTLSProtocols=TLSv1.2
    username: root
    password: 〇〇〇〇

これで、プロジェクトを起動させると動くと思います。もし何かあればコメントください。

では今回の記事は以上です。ほかにもSpringBoot関連の記事を記載しているので、是非参考にしてみてください。

コメント

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