スポンサーリンク

Webアプリケーション開発

spring-mybatisでSpringBootからDBアクセス

投稿日:2021年6月30日 更新日:

SpringBootでspring-mybatisを動かすための初期構築

初期準備

初期準備として2つ必要となる。

  1. build.gradle…spring-mybatisの依存関係を記述する。
  2. 設定クラス…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つある。
開発メンバーはこれらを実装していく。

  1. SELECT結果格納用DTO…SELECTの結果をマッピングするDTOです。
  2. Mapperインターフェース…コントローラーやサービスにDIするインターフェース。次のXMLに定義されたSQLを呼び出すための窓口となる。
  3. 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クラスを作成するのが一般的です。

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Webアプリケーション開発

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.