menu
書いてる野郎
orebike@gmail.com
名前の通り ORM の中心機能で、よくある実装では DAO と呼ばれるようなモノにあたる。
DI 起点となる interface だけ作って、後の実装は設定ファイルで指定してそれに基づいて自動的に実装されるという流れになる。 なので設定ファイルで頑張れば色々頑張れる仕組みになっている。
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 が必ず必要になる。