LoginSignup
1
3

More than 3 years have passed since last update.

SpringBoot + MyBatis + Thymeleaf + H2 で超簡潔なRead処理のみ実装

Last updated at Posted at 2021-04-07

MyBatisについて書籍で勉強していたところ、自分が読んでいた書籍ではMyBatisの処理以外にも色々と複雑な機能を実装しすぎていて自分には理解しづらかったので、試行錯誤してできたものを備忘として記載いたします。
(超初心者のため用語や記載コードでおかしな部分があるかもしれませんがご容赦くださいm(_ _)m)

環境

Spring Boot 2.4.4
Java 11
OS  : macOS Big Sur
IDE : SpringToolSuite4
Maven

目標

employeeテーブル(id=1, name=Tom, age=30)の中身をブラウザに表示すること。

各コード

application.properties

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql

spring.h2.console.enabled=true

H2を使用する内容と、schema.sqlとdata.sqlでSQLの処理を行うよう設定しています。

schema.sql

CREATE TABLE if NOT EXISTS employee (
    id VARCHAR(50) PRIMARY KEY,
    name VARCHAR(50),
    age INT
    );

data.sql

INSERT INTO employee (id, name, age)
    VALUES ('1', 'Tom', 30);

list.html

Controllerで表示させるhtmlファイル。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>EmployeeList</title>
</head>
<body>
    <table th:each="e:${employee}">
    <tr>
        <td>ID:</td>
        <td th:text="${e.id}"></td>
    </tr>
    <tr>
        <td>名前:</td>
        <td th:text="${e.name}"></td>
    </tr>
    <tr>
        <td>年齢:</td>
        <td th:text="${e.age}"></td>
    </tr>
    </table>
</body>
</html>

th:eachでキー e にControllerで宣言したフィールド employee を代入して、
th:textでid, name, ageを表示。
当初はth:eachを書いておらず詰まった。

初めはxmlファイルを別途作成せず、@Mapperインターフェイス内に@SelectアノテーションでSQL文を記載した方が詰まる可能性が低いので良いかもしれない。

EMapper.xml

SQL文を記載するファイル。

<?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.EMapper">
  <select id="find" resultType="com.example.demo.Employee">
    select  *
    from    employee
  </select>
  </mapper>

当初はnamespaceやresultTypeに「com.example.demo.」を記載しておらず詰まった。

Employee

エンティティクラス(呼び出すテーブルの中身を示したクラス)を設定。

package com.example.demo;

import lombok.Data;

@Data
public class Employee {
    private String id;
    private String name;
    private int age;
}

この各フィールドの名前(id, name, age)がDBに作成したTABLE内のカラム(各要素)と同名でないといけないので要注意!

EMapper.java

package com.example.demo;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface EMapper {
    List<Employee> find();
}

xmlファイルにてid="find"で設定したSQL文をメソッドfind()として呼び出し。

EService.java

package com.example.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EService {

    @Autowired
    EMapper mapper;

    public List<Employee> getList() {
        return mapper.find();
    }
}

EController.java

package com.example.demo;

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 lombok.AllArgsConstructor;

import java.util.List;

@Controller
public class EController {

    @Autowired
    private EService service;

    @GetMapping("/list")
    public String getEList(Model m) {
        List<Employee> employeeList =  service.getList();
        m.addAttribute("employee", employeeList);
        return "list";
    }
}

当初は@Controller@RestControllerと誤って記載していた。

参考にさせていただいたQiita記事

詰まっていた自分にとって大変参考になりました。ありがとうございました。
https://qiita.com/ozaki25/items/fe5fc876bd55a9d7daa9
https://qiita.com/sumichan/items/bdc2a0e909416ae55162

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3