MyBatis Spring Bootを使ってみた

目次

  1. Projectの作成
  2. 設定
  3. Entityの定義
  4. Mapper定義
  5. 所感
  6. ところで…
  7. 関連記事

こんにちは。karintomania(twitter)です。
今回はJavaのORマッパー、Mybatisを使ってみます。

Projectの作成

MybatisはSpring Initializrに採用されているため、簡単に使えます。
SpringInitializr

Initializrでは以下をDependencyとして入れてください。
今回はDBとしてH2を使用するので、H2も追加しましょう。

  • web
  • jdbc
  • mybatis
  • H2

ビルドツールはGradleを使いますが、Mavenを使いたい人は適宜、読み替えてください。

build.gradle は以下のようになります。

build.gradle
1
2
3
4
5
6
7
8
9
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}

設定

mybatis spring bootを使って驚いたのが、
その設定の少なさです。
今日は、何とapplication.propertiesを一行も書かずにコードが動きます。

Javaだけ書きましょう!

ただ、テスト用にテーブルを作る必要があるので、
src/main以下のresourceフォルダにschema.sqlを作成します。

これもSpring Bootなら空気を読んで、resourceフォルダに置くだけで勝手に実行してくれます。
超便利。

schema.sql
1
2
3
4
5
6
7
8
9
10
DROP TABLE IF EXISTS BOOK_MASTER;

CREATE TABLE BOOK_MASTER (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(250) NOT NULL,
author VARCHAR(250) NOT NULL
);

INSERT INTO BOOK_MASTER (title, author) VALUES ('kokoro','Soseki Natsume');
INSERT INTO BOOK_MASTER (title, author) VALUES ('rashoumon','Ryunosuke Akutagawa');

Entityの定義

BOOK_MASTERに対応するEntityクラスを作ります。
特にアノテーションとかは不要です。

Book.java
1
2
3
4
5
6
7
8
9
10
package com.example.mybatis;

public class Book{

int id;
String title;
String author;

// getter, setter
}

Mapper定義

次にMapperと呼ばれるクラスを作成します。
ここに実際のSQLを記載していきます。
@Mapperアノテーションが必要です。

.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.mybatis;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookMapper {
// 1件検索
@Select("SELECT * FROM BOOK_MASTER WHERE id = #{id}")
Book findOneById(@Param("id") int id);

// 1件挿入
@Insert("INSERT INTO BOOK_MASTER (title, author) VALUES (#{title},#{author})")
// Auto Incrementに対応する
@Options(useGeneratedKeys=true, keyProperty="id")
void insert(Book book);

// 全件選択
@Select("SELECT * FROM BOOK_MASTER")
List<Book> findAll();

}

@Optionsアノテーションでは、Auto_incrementで生成されたIDを取得するように設定しています。
idが0のBookクラスを渡しても自動で値を更新してくれます。

さて、BookMapperを呼び出すControllerを書いてみます。
GETで検索、POSTで挿入ですね。

BookMapperはAutowiredでDIすることができます。

.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.mybatis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
class BookController{

@Autowired
BookMapper bm;


@GetMapping("/test")
public Book get(@RequestParam int id){
return bm.findOneById(id);
}
@GetMapping("/test/all")
public List<Book> getAll(){
return bm.findAll();
}
@PostMapping("/test")
public Book post(@RequestBody Book book){
bm.insert(book);
return book;
}
}

curlコマンドでテストしてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 全件選択
$ curl -X GET http://localhost:8080/test/all

// 出力結果
[{"id":1,"title":"kokoro","author":"Soseki Natsume"},{"id":2,"title":"rashoumon","author":"Ryunosuke Akutagawa"}]



// idでのSELECT
$ curl -X GET http://localhost:8080/test?id=1

// 出力結果
{"id":1,"title":"kokoro","author":"Soseki Natsume"}



// INSERT
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"ningen shikkaku", "author":"Osamu Dazai"}' http://localhost:8080/test

// 出力結果
{"id":3,"title":"ningen shikkaku","author":"Osamu Dazai"}

ちゃんと動きました!!!

所感

設定が少なく動作するのがいいですね。
これまでJPAしか使っていなかったのですが、
より軽量な代替案として使っていこうと思います。

それでは今日はこの辺で。

ところで…

仕事で扱っている技術がレガシーだったり、同じことの繰り返しだったりで
最近、成長してないと感じてませんか?

転職することで、もっと成長できるかもしれません。

いますぐ転職しない人でも、とりあえずエージェントに登録しておいて
案件や年収を眺めるだけでも市場の需要を知ることができ、勉強になります。

ここでエンジニアに人気の転職サイトを紹介します。

レバテックキャリア
エンジニアとして働いていて実務経験があるなら、
求人数の充実具合からレバテックキャリアがおすすめです。
IT転職ではデファクト・スタンダードですね。
▼レバテック キャリア 登録はこちら▼


Tech Clips
Tech Clipsは年収500万以上&自社サービスを持った会社に特化した求人サイトです。
首都圏限定になってはしまいますが、
収入を増やしたい、自社サービスを持った企業への転職をしたい人におすすめです。

▼Tech Clips 登録はこちら▼


関連記事

こちらの記事もおすすめです。
Macの無料SQLクライアントDBeaverを紹介する
Spring BootでJDBIを使う