SpringBoot + MyBatis ふりかえり

# 記事を書く理由
業務で初めて、SpringBoot + MyBatisを使ったバックエンドの開発を行ったので
忘れないように備忘録として残そうと思ったからです。
それと、私と同じように初めて触れる人の助けになれたらなと思っています。

# そもそもMyBatisって？

>MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。

と書くのは簡単なのですが、私は配属されるまで、O/Rマッパーというものを私はよく理解していませんでした。

以下の記事がとても参考になりました。
https://qiita.com/wanko5296/items/d7829f18d4827cecd4f6

端的にオブジェクトとリレーショナルデータベースの紐づけですね。

以上で、MyBatisの説明を終えて
次からは、私が実際に作ったコードのサンプルと一緒に解説していこうと思います。

# ディレクトリ構成

- entity
　┗Test.java
- controller
  ┗TestController.java
- model
  ┗impl
    　┗TestServiceImpl.java
  ┗TestService.java(Interface)
- domain
  ┗repository
    　┗TestRepository.java(Interface)
- infra
  ┗datasource
    　┗TestRepositoryImpl.java
  ┗mapper
    　┗TestMapper.java(Interface)
- resources
  ┗ TestMapper.xml

# 各コードの説明

### Test
``` java
@Data
public Test {
    int id;
    String name;
}
```

### TestController
``` java
@Controller
@RequiredArgsConstructor
public TestController {

	private final TestService testService;

	@GetMapping("/test/{testId}")
	public getTestList(@PathVariable("testId") String testId) {
		return testService.getTestList(Integer.parseInt(testId)));
	}
}
```
@RequiredArgsConstructorアノテーションにより
Serviceを呼び出しています。
私は、少し前までAutoWiredを使っていたのですが、非推奨になっていました。
技術のキャッチアップはこまめに行わないといけないな...と深く思いました。

### TestService
``` java
public interface TestService {
	List<Test> getTestList(int testId);
}
```
こちらがServiceになっております。
implディレクトリで実際のふるまいを書いていきます。

### TestServiceImpl
``` java
@Service
@RequiredArgsConstructor
public TestServiceImpl implements TestService {
	
	private final TestRepository testRepository;

	@Override
	List<Test> getTestList(int testId) {
		return testRepository.getTestList(testId);
	}
	
}
```

### TestRepository
```java
public Interface TestRepository {
    List<Test> getTestList(int testId);
}
```

### TestRepositoryImpl
```java
@Repository
@RequiredArgsConstructor
public TestRepositoryImpl implements TestRepository {
    private final TestMapper testMapper;

    @Override
    List<Test> getTestList(int testId){

        return testMapper.getTestList(int testId);
    
    }
}


```

### TestMapper

``` java
@Mapper
public Interface TestMapper {
    List<Test> getTestList(@Param("testId") int testId);
}
```
ここでXMLファイルと紐づけるTestMapper.javaを作成します。
マッパーを書くときは、@Mapperアノテーションを必ずつけましょう。
よくこれを忘れてエラーを起こしていました。
引数の@Paramで指定した文字列はXMLファイルでSQL文を書くときの変数名として扱うことができます。

### TestMapper.xml

``` xml
~~~ヘッダ省略
<mapper namespace="紐づけるMapperクラスのパスを記載（ここだと ~/infra/mapper/TestMapperとなります)">
    <resultMap id="TestBody" type="参照したいエンティティのパスを記載(ここでは、entity/Testとなります）">
        <id property="id(オブジェクトの変数を記載）" column="id(DBのカラム名)"/>
        <result property="name" column="name"/>
    </resultMap>

    <select id="getTestList" resultMap="testBody">
        SELECT
            *
        FROM test
        WHERE id = #{testId}
</mapper>
```

ここでは、sql文を書いています。
resultMapはselect文などで返ってくる値のマッピングと私は理解しています。
selectのidはTestMapper.javaのメソッド名と同じにすることでマッピングされます。
resultMapはresultMapタグで指定したIDを指定することで、返り値のマッピングをしています。
まだまだ使いこなせていませんが、下記のサイトで詳しく説明があるので
是非参考にしてください。
↓↓
[mybatis](https://mybatis.org/mybatis-3/ja/sqlmap-xml.html)

以上がコードの説明でした。

# 最後に
間違っているところなどあったら、ご指摘してください。
まだまだ未熟ですが、業務や勉強で得た知識をこれからもアウトプットしていこうと思います。
ここまで、読んでいただきありがとうございました！
それでは、また！