Contents
SpringBootでspring-mybatisを動かすための初期構築
初期準備
初期準備として2つ必要となる。
- build.gradle…spring-mybatisの依存関係を記述する。
- 設定クラス…Mapperインターフェースの置き場所を指定する。
build.gradle
dependencies {
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter'
}
build.gradle にMybatisの依存関係を追記します。
MyBatis設定クラス
@Configuration
@MapperScan("com.noricgeographic.shopreview.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
}
MyBatisのMapperインターフェースを格納するパッケージを@MapperScanで指定します。
以降のMapperインターフェースは指定したパッケージ内に作成します。
このクラスは@SpringBootApplicationクラスが配置されているパッケージ内、もしくはサブパッケージ内に配置する必要があります。
このような設定クラスのクラス名は任意ですが、XxxConfigとするのが一般的です。ここでは、MyBatisの設定はこのクラスに集約したいため、MyBatisConfigとしています。
SELECT文発行のため最低限必要なもの
扱うテーブルに応じて準備するものは3つある。
開発メンバーはこれらを実装していく。
- SELECT結果格納用DTO…SELECTの結果をマッピングするDTOです。
- Mapperインターフェース…コントローラーやサービスにDIするインターフェース。次のXMLに定義されたSQLを呼び出すための窓口となる。
- SQLとマッピング定義用XML…Mapperインターフェース1つにつき1つのXMLを作成する。実行したいSQL文、受け取りたい戻り値の型を記述する。
SELECT結果格納用DTO/パラメータ用DTO
package com.noricgeographic.shopreview.mapper.dto;
@Data
public class ShopDto {
private String id;
private String name;
}
SQLとマッピング定義用XML
例として、SELECT文とINSERT文を記述しています。
<?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.noricgeographic.shopreview.mapper.ShopMapper">
<select id="findAll" resultType="com.noricgeographic.shopreview.mapper.dto.ShopDto">
SELECT id, name FROM SHOP
</select>
<insert id="insert" parameterType="com.noricgeographic.shopreview.mapper.dto.ShopDto">
INSERT INTO SHOP (id, name) VALUES (shop_id.nextval,#{name})
</insert>
</mapper>
- <?xml?> …定型文です。
- <!DOCTYPE>…定型文です
- <mapper>
- namespace…本XMLのSELECTやINSERT文を呼び出すためのインターフェースを完全限定名で指定します。
- <select>…SELECT文を定義することを表します。
- resultType…SELECT結果を格納するDTOを完全限定名で指定します。
- <insert>…INSERT文を定義することを表します。
- parameterType…SQLに#{xxx}で埋め込むフィールドを保持するDTOを完全限定名で指定します。
Mapperインターフェース
package com.noricgeographic.shopreview.mapper;
import java.util.List;
import com.noricgeographic.shopreview.mapper.dto.ShopDto;
public interface ShopMapper {
List<ShopDto> findAll();
boolean insert(ShopDto shopDto);
}
SQLとマッピング定義用XMLに対して1つ作ります。
①XMLファイル名、②<mapper>のnamespace属性値、③本インターフェースのインターフェース名は一致させる必要があります。
XMLにおける<select>や<insert>のid属性値をメソッド名として宣言します。
命名は「テーブル名+Mapper」または「テーブル名+Repository」が一般的です。
使用例
上記の準備ができた後は、Mapperインターフェースを@Autowiredして使用することができます。
@RestController
@RequestMapping("/list")
public class ShopListController {
@Autowired
private ShopMapper shopMapper;
@GetMapping
public List<Shop> get() {
List<ShopDto> shopDtos = shopMapper.findAll();
ここでは簡易的にControllerから呼び出していますが、ControllerとMapperの間に@ServiceをつけたServiceクラスを作成するのが一般的です。