Spring Boot/MyBatis/Mapper

Spring Boot/MyBatis/Mapper

名前の通り ORM の中心機能で、よくある実装では DAO と呼ばれるようなモノにあたる。

DI 起点となる interface だけ作って、後の実装は設定ファイルで指定してそれに基づいて自動的に実装されるという流れになる。 なので設定ファイルで頑張れば色々頑張れる仕組みになっている。

Basic

Mapper のエントリーポイントとして Java の interface として宣言する。 その際に Mapper アノテーションをつける。

HogeMapper.java

@Mapper
public interface HogeMapper {
    public List<Hoge> findAll();
}

SQL はあのテーションで書く↑の interface に直接付与もできるのだが読みづらいので別の XML ファイルに分割する。

同パッケージに 同名.xml で設置する。HogeMapper.xml という感じ

<?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.unko.sample.mybatis.mapper.HogeMapper">
  <select id="findAll" resultType="com.unko.sample.mybatis.domain.Hoge">
    SELECT * FROM hoge
  </select>
</mapper>

これで HogeMapper に DI 指定すると何か実体が自動構築されて実行される。 ここで指定されている Hoge というクラスは単なる POJO の入れ物で getter setter を備えていれば何でもよいようだ。 フィールド名を基準に自動的にマッピングされる。

キャメルとスネークの自動変換

Java は内部の命名がキャメルケースであることがほとんどであるが、DBはスネークケースだったりすることがある。 この変換を自動的にやってくれる設定がある。

application.yml にこのように書く

mybatis:
  configuration:
     mapUnderscoreToCamelCase: true

ルール

mapper の interface と mapper の xml は必ず同名で同一パッケージに対である必要がある。 単純に設定だけ書いて別の mapper xml から呼び出そうという用途の xml を作ったとしてもそれに対応する interface が必ず必要になる。

java/spring/spring_boot/mybatis/mapper/start.txt · 最終更新: 2021-06-28 13:00 by ore