Spring Boot × MyBatisでH2 DataBaseをインメモリで利用する
投稿日:2024/10/21
目標
- Spring BootプロジェクトでMyBatisを使ってH2 DataBaseをインメモリで利用する
- ここではJavaのバージョンは21を使用しています
目次
依存関係の追加
- build.gradleに以下を追加します。mavenを利用している場合は適宜読み替えてください。
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'
}プロパティファイルの設定
- resources直下にapplication.ymlを新規作成してDB接続情報を記載します。
※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初期データ準備
- resources配下にschema.sqlを新規作成して以下の内容で保存します。
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');- エンティティとしてUser.javaを新規作成して以下の内容で保存します。
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の実装
- resources/mapper配下にUserMapper.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">
<!-- UserMapper.javaとUserMapper.xmlのマッピング -->
<mapper namespace="com.example.demo.UserMapper">
<!-- select結果をUser.javaにマッピング -->
<select id="findAll" resultType="User">
select * from user
</select>
</mapper>- UserMapper.javaを新規作成して以下の内容で保存します。
package com.example.demo;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
List<User> findAll();
}Controllerの実装
- UserController.javaを新規作成して以下の内容で保存します。
※説明の簡略化のため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();
}
}動作確認
- H2のコンソールより初期データが正しく登録できているかを確認します。
- Spring Bootプロジェクトを起動後にhttp://localhost:8080/h2-consoleにアクセスします。schema.sqlに記載した初期データが登録されていることを確認します。
※ここでは初期データとして以下のinsert文を発行しています。
INSERT INTO user (email, password) VALUES ('foo@bar.com', 'foobar');
- MyBatisで上記初期データを検索できているかの動作確認をします。
- 以下のCurlコマンドを実行します。Contentに初期データが設定されていることを確認します。
$ curl http://localhost:8080/findAll
StatusCode : 200
StatusDescription :
Content : [{"id":1,"email":"foo@bar.com","password":"foobar"}]
~省略~
以上で全ての手順は完了になります