N-LAB

Spring Boot × MyBatisでH2 DataBaseをインメモリで利用する

投稿日: 2024年10月21日


目標


目次

  1. 依存関係の追加
  2. プロパティファイルの設定
  3. 初期データ準備
  4. Mapperの実装
  5. Controllerの実装
  6. 動作確認


依存関係の追加

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
  // 以下を追加
    runtimeOnly 'com.h2database:h2'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
}


プロパティファイルの設定

※application.propertiesを利用している場合は適宜読み替えてください。

spring:
  datasource:
    # NON_KEYWORDSで個々の予約済みキーワードを無効にして、識別子として使用可能にする
    # DATABASE_TO_UPPER=falseでH2のデフォルトテーブル名の大文字を無効化
    # h2:memでH2をインメモリで作動させる
    url: jdbc:h2:mem:test;NON_KEYWORDS=USER;DATABASE_TO_UPPER=false;
    username: root
    password: root
    driver-class-name: org.h2.Driver
  sql:
    init:
      # 起動時に毎回初期化SQLを実行
      mode: always
      encoding: UTF-8
  h2:
    console:
      # コンソールを有効化
      enabled: true
      path: /h2-console
mybatis:
  configuration:
    # アンダースコアをキャメルケースに変換してJavaクラスにマッピング
    map-underscore-to-camel-case: true
  mapper-locations: classpath*:/mapper/*.xml
  # UserMapper.xmlのresultTypeで以下のパッケージ名の記載を省略
  type-aliases-package: com.example.demo


初期データ準備

DROP TABLE IF EXISTS user;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(255),
  password VARCHAR(255)
);

INSERT INTO user (email, password) VALUES ('foo@bar.com', 'foobar');
package com.example.demo;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
  private Long id;
  private String email;
  private String password;
}


Mapperの実装

<?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">
<!-- UserMapper.javaとUserMapper.xmlのマッピング -->
<mapper namespace="com.example.demo.UserMapper">
  <!-- select結果をUser.javaにマッピング -->
  <select id="findAll" resultType="User">
    select * from user
  </select>
</mapper>
package com.example.demo;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
  List<User> findAll();
}


Controllerの実装

※説明の簡略化のためserviceクラスの実装は省略しています。

package com.example.demo;

import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
  private final UserMapper userMapper;

  public UserController(UserMapper userMapper) {
    this.userMapper = userMapper;
  }

  @GetMapping(value = "/findAll")
  public List<User> findAll() throws Exception {
    return userMapper.findAll();
  }
}


動作確認

※ここでは初期データとして以下のinsert文を発行しています。
INSERT INTO user (email, password) VALUES ('foo@bar.com', 'foobar');
show h2 console

$ curl http://localhost:8080/findAll
StatusCode        : 200
StatusDescription : 
Content           : [{"id":1,"email":"foo@bar.com","password":"foobar"}]
~省略~


以上で全ての手順は完了になります