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