# maybatisについて
## そもそもmybatisとは
mybatisとは、DBアクセスができるシンプルでかつ軽量なフレームワークです。
[今まで](https://hackmd.io/@ka-777/SkPfjXIYd)は世界的に普及率の高いJPAやJDBCを使い、DB接続をやってきましたが、ここでは日本で普及率の高いmybatisを使っていきます。
mybatisの良い点は、軽量でSQLを完全に制御することができる点です。
ここから何個か簡単なアプリケーションを作っていきます。(全てmybatisの方法で作っていきます)
## 1つ目のアプリ
### フォルダ構造

また、SQLファイルはH2DBを使う場合この名前だとデフォルトでパスの設定がされているので動きますが、H2DB以外もしくはほかのSQLファイル名にすると適宜パスを指定する必要があります。
### プロジェクト作成
今回は新規Spring スターター・プロジェクトから作るときに以下のようにするとこの後の説明がわかりやすくなります。
・プロジェクトの名前:自由(spring-mybatis)
・Javaのバージョン:自分がインストールしているもの(今回は11でやるので前後していると動かない可能性あり)
・グループ:dev.itboot
・成果物:spring-mybatis
・バージョン1.0.0
・説明:MyBatis project for Spring Boot
・パッケージ:dev.itboot.mb
そういえば、今までここのグループとかの説明をしてなかったので
> 名前とバージョンはそのまま見てわかる通り
> グループ:プロジェクトを一意に識別する名前。 (デフォルトだとcom.example.demoにあたるとこを変更する)
> 成果物:作成する JAR や WAR, EAR ファイルなどの名前に使用される。
> 説明:説明文。後で見るときにこんな感じで作ったのかなど思い出すのに使う
> パッケージ:Javaのパッケージを使用する時に書く
> 詳しくは[ここ](https://trans-it.net/spring-boot-4-4-3-new-project/)で
### 依存関係
・Spring Boot DevTools
・Lombok
・検証
・MyBatis Framework
・H2 Database
・Thymeleaf
・Spring Web
です。ほとんどの物は今まで使いましたが新しいのはMyBatis Frameworkです。これはMyBatisのフレームワークを使うため必要なものです。今までのSpring Data JPAをいれるような感覚のものです。
### モデルの作成
今回はdev.itboot.mbを右クリックして新規、クラスから作成
パッケージはdev.itboot.mb.model(modelの部分を追加するだけ)
名前はお好きに(今回はTeacher.javaです)
Teacher.java
```
package dev.itboot.mb.model;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Teacher {
private Long id;
private String userName;
private String email;
}
```
特に新しいことはないので割愛
ここら辺はJPAの頃と変わらないので[ここ](https://hackmd.io/@ka-777/SkPfjXIYd)参照
### SQL文の作成
SQL文を作成する時は、「src/main/resources」を右クリックして、新規→ファイルを選択してそこで「schema.sql」,「data.sql」を作成する
また、どちらも編集する時にDB関連のアプリが入っていると自動でそちらが開いてしまうのでそれが嫌な場合は右クリックから「次で開く」でテキストエディタを選ぶと、STSだけで編集もできます
SQLの編集は下記の通り
schema.sql
```
CREATE TABLE IF NOT EXISTS teacher (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(60) NOT NULL,
email VARCHAR(254) NOT NULL
);
```
data.sql これはインサートする内容が入っているので好きなのを入れてもらって大丈夫です。
```
INSERT INTO teacher(user_name, email)
VALUES('中池', 'nakaike@example.com');
```
この2つのファイル名であれば、自動的に読み込んでくれるので他に記述することはありません。
### マッパーの作成
「dev.itboot.mb」を右クリック→新規→インターフェースを選択
パッケージはdev.itboot.mb.mapper(mapperを追加)
名前は自由(今回はTeacherMapper.java)
TeacherMapper.java
```
package dev.itboot.mb.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import dev.itboot.mb.model.Teacher;
@Mapper
public interface TeacherMapper {
@Select("SELECT * FROM teacher")
List<Teacher> selectAll();
}
```
> @Mapperはマッパーであることを示します。これはMyBatisが起動時にこのアノテーションを探して使えるようにしてくれます。
> @SelectはSELECT文を記述していく場合につけます
application.propertiesに以下の内容を付け足します↓↓↓↓↓↓
```
mybatis.configuration.map-underscore-to-camel-case=true
```
この内容があることでJavaのフィールド名にDBのカラム名を自動的に読み込んでくれるため面倒な手間が省けます
これがないと、SQL文の時にDBのカラム名を指定する時に「AS」等を使わないといけなくなります
Javaのフィールド名の場合は複合語(単語が2つ以上組み合わせてある単語)の時に2つ目の文字を大文字にする(キャメルケース)が、DBのカラム名は2つ目の文字の前に_を記述するため微妙に表記法が違うのでそれを合わせる必要がある
詳しくは以下の通り
```
// application.propertiesに追加しない場合
@Select("SELECT id,user_name AS userName,email FROM teacher")
```
### コントローラの作成
dev.itboot.mbを右クリック→新規→クラスを選択
パッケージ名:dev.itboot.mb.controller
(controllerを追加)s
名前:自由に(今回はTeacherController.java)
TeacherController.java
```
package dev.itboot.mb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import dev.itboot.mb.mapper.TeacherMapper;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class TeacherController {
private final TeacherMapper mapper;
@GetMapping("/")
public String getAllTeachers(Model model) {
model.addAttribute("page", mapper.selectAll());
// list.htmlを呼び出す
return "list";
}
}
```
アノテーションは以前出てきたようなものばかりなので割愛
>@GetMappingでHTTPのGETリクエストを受け付けてるのは大事なとこです
また、最後の方でmodel.addAttribute("page", mapper.selectAll());とありますがSQL文が実行されて、値を取得した時に表示するのはHTMLなのでThymeleafに渡すためにこれを使っています。
### Thymeleaf(HTML)の編集
templatesを右クリック→新規→ファイルで拡張子をHTMLにすれば大丈夫です。
今回使うHTML↓↓↓↓↓↓
list.html
```
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<th:block th:insert="fragments/base :: header"></th:block>
</head>
<body>
<div class="container-fluid">
<h4>MyBatis APP</h4>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>名前</th>
<th>E-Mail</th>
</tr>
</thead>
<tbody>
<tr th:each="teacher : ${page}" th:object="${teacher}">
<td th:text="*{id}"></td>
<td th:text="*{userName}"></td>
<td th:text="*{email}"></td>
</tr>
</tbody>
</table>
</div>
<th:block th:insert="fragments/base :: scripts"></th:block>
</body>
</html>
```
いつもながらふつうのHTMLで使わないようなものは全てThymeleafで使えるものです。
例えばth:blockではHTMLとして出力できなくしたり、th:eachで繰り返し処理を行わせることができます。ここら辺は詳しくまとめている人がいるので[そこ](https://qiita.com/NagaokaKenichi/items/c6d1b76090ef5ef39482)を参照してください。
続けてもう一つのHTML↓↓↓↓↓↓
こっちはtemplatesの下に新規フォルダでfragmentsがあります。わかりやすくするために作っただけなのでそのままでも大丈夫です。
base.html
```
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<th:block th:fragment="header">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MyBatis APP</title>
<!-- These are required CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css">
</th:block>
</head>
<body>
<!-- These are required JS -->
<th:block th:fragment="scripts">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js"></script>
</th:block>
</body>
</html>
```
また、今回は練習用なので本番では改ざん防止用のものもありますが割愛してます。
### 実行
いつも通り実行したら[ここ](http://localhost:8080/)にアクセスすると、INSERTした内容が表示されます

### まとめ
これで1つ目のアプリ完成です。
あと何個かありますが長くなるのでわけます
次のやつのURLはそのうち貼り付けます↓↓↓↓↓↓
2つ目(CRUD操作の追加)↓↓↓↓↓↓
https://hackmd.io/@ka-777/H1GFEtiod