Spring Boot / MyBatis / HelloWorld

Spring Boot / MyBatis / HelloWorld

プロジェクト作成

プロジェクト作成。ここまでは普通だが MyBatis は Spring Boot 標準でサポートされているらしく選択肢が出てくる。

なので標準的な構成にしようとして build.gradle がこうなる。

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
}
 
apply plugin: 'io.spring.dependency-management'
 
group = 'com.unko.dev'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
 
repositories {
    mavenCentral()
}
 
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

設定

application.yml にデータベースの接続設定を書く

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/hogehoge
    username: root
    password: hogehoge

Spring の動作確認

とりあえずコントローラを作って Spring 自体の動作を確認する

package com.unko.sample.mybatis.controller;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class HelloController {
    @RequestMapping("/")
    public String index() {
        return "Hello MyBatis.";
    }
}

起動して動いた。

このへんの開発は他のページ参照。

ドメインの作成

MyBatis ではテーブルと対応するものとして「ドメイン」というものを作るそうなのでそれを作る。

このように POJO でメンバに対して getter setter があるという構成。

public class Hoge {
    private Long id;
    private String name;
    private Integer age;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

自分は単に記述量を減らすしか意味が無いメタプログラミング的操作は嫌いなので全部手書きしている。

Mapper の作成

Service とか DAO に当たるような操作メソッドを持つ Mapper というものを作る

とりあえず全件抜きの findAll を作る。 これは interface として作成し、実装部分は勝手にゴニョゴニョやってくれる系のようだ。

@Mapper
public interface HogeMapper {
    public List<Hoge> findAll();
}

Mapper というアノテーションをつけておく。

このファイルと同一パッケージに同一名で HogeMapper.xml を作りこの中に実装の元になる SQL を書き込む

<?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.unko.sample.mybatis.mapper.HogeMapper">
  <select id="findAll" resultType="com.unko.sample.mybatis.domain.Hoge">
    SELECT * FROM hoge
  </select>
</mapper>

こんな感じ。namespace は対象の Mapper インターフェースに合わせて、resultType は今回の場合は List<Hoge> なのだが、その場合は中身のクラス、今回ならドメインクラスの Hoge を指定する。

使ってみる

Controller にコンストラクタインジェクションで記述すると DI される。

@RestController
public class HelloController {
    private HogeMapper hogeMapper;
 
    public HelloController(HogeMapper hogeMapper) {
        this.hogeMapper = hogeMapper;
    }
 
    @RequestMapping("/")
    public String index() {
        List<Hoge> hogeList = hogeMapper.findAll();
        return "Hello MyBatis." + hogeList.get(0).getName();
    }
}

ちゃんと動いた。非常に簡単である。

java/spring/spring_boot/mybatis/helloworld/start.txt · 最終更新: 2021-06-25 19:41 by ore