IntelliJ の File Templates で MyBatis を使ったコードをちょっと楽に書く

# IntelliJ の File Templates で MyBatis を使ったコードをちょっと楽に書く

## 概要

IntelliJ の File and Code Template という設定をカスタマイズすれば、いつもより簡単にプログラムを書けるかもよという話です。 GitHub Copilot で高度なコードを生成できる話とは違って、とても単純なことしかできませんが、それでも役に立てばいいなと思っています。

## 想定読者

- IntelliJ を使っている人
- MyBatis でデータベースアクセス処理を実装している人

## File Templates とは

IntelliJ で新しい Java のクラスを作ると、`public class Sample {}` のようなコードが書かれたファイルが作られます。 これは組み込みの File Template によって実現されています。 File Template 編集すれば、新しく作られるファイルの内容をカスタマイズすることができます。

## 設定の仕方

`Cntl + Shift + A` で Action 検索ダイアログを表示させ、 File Template を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241675/f359fb16-dad5-2628-58e5-c74ee5906dc3.png)

Create Template ボタンをクリックして、新しい File Template を作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241675/b16d6da7-3981-67f9-c496-9e0997017228.png)

## MyBatis の Mapper ファイル用の File Template を設定する

### File Templates を使って、 Mapper.xml を作るときに DOCTYPE 宣言を書き込む

- Name | MyBatis SQL Mapper
- Extension | xml
- File name | 空欄
- 内容
    ```velocity
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    ```

新しく File Template を追加すると、ファイル作成時に新しいテンプレートを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241675/8c9393df-61c1-1f89-d6f6-65f082bf34ff.png)

`com.github.kuchita_el.sample` パッケージに `SampleMapper` という名前の XML ファイルを作成すると、以下の内容のファイルが作成されました。

```SampleMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
```

### 変数を使って、 Mapper.xml に mapper 要素を書き込む

Mapper.java と同じパッケージに Mapper.xml を作成するなら、パッケージ名とファイル名から mapper 要素の namespace 属性の値を導出できます。

以下のようにテンプレートの中で変数を使えば、動的に namespace 属性の値を設定できます。

```velocity
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${PACKAGE_NAME}.${NAME}">
</mapper>
```

namespace を手動で設定したいときには、新しい変数 `Namespace` を使います。

```velocity
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${Namespace}">
</mapper>
```

新しい変数 `Namespace` を定義すれば、 ファイルを作成するときに namespace を指定できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241675/26cf591a-3f10-7e92-266f-7c787cef094f.png)

### Child Template File を使って、 Mapper インターフェースを同時に作る

Child Template File を設定すると複数のファイルを作ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241675/07322f03-9c74-8607-6cd2-05c71a8d4ab2.png)

テンプレートの名前には `${NAME}` を指定して、内容には以下のテキストを指定します。

```velocity
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ${NAME} {
}
```

このように設定すると、一つの操作で MyBatis の Mapper インターフェースと XML ファイルの両方を作成できます。

## さいごに

今回は File Templates 機能を使った効率化について紹介しました。今後は Live Templates の機能も使い倒して、 Spring MVC のリクエストハンドラを効率よく実装できるようにしたいと思いました。

## 参考サイト

- [Getting Started | MyBatis 公式リファレンス](https://mybatis.org/mybatis-3/getting-started.html)
- [File Templates | IntelliJ 公式リファレンス](https://www.jetbrains.com/help/idea/using-file-and-code-templates.html)