Spring BootでMybatisを使ってみる

GitHubhttps://github.com/n-yata/mybatis-sample.git

pom.xml

pom.xmlは下のような感じ。
mybatis-spring-boot-starterを入れる。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>example</groupId>
    <artifactId>Mybatis-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Mybatis-sample</name>
    <description>Spring sample project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

DBの接続情報とmybatisの設定を書く。

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver

# MybatisマッピングJavaクラスのパッケージ
mybatis.type-aliases-package=example.mapper
# xmlマッピングファイルの場所
mybatis.mapper-locations=classpath:mapper/*.xml
# アンスコ→キャメルケースに変換
mybatis.configuration.map-underscore-to-camel-case=true

propertiesに書いたJavaファイルとxmlファイルのパスは下のような感じ。
f:id:n-yata:20210425131353p:plain

Modelクラス

User.java
Lombok便利。フィールドだけ書いて簡単実装。

package example.model;

import lombok.Data;

@Data
public class User {
   private String userId;
    private String firstName;
    private String lastName;
    private String password;
    private String roleName;
}

対応するテーブルのcreate文(PostgreSQLを使用)

CREATE TABLE IF NOT EXISTS usr(
  user_id VARCHAR(255) NOT NULL,
  first_name VARCHAR(255) NOT NULL,
  last_name VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL,
  role_name VARCHAR(255) NOT NULL,
  PRIMARY KEY (user_id)
);

適当にインサート

INSERT INTO usr (user_id, first_name, last_name, role_name, password)
VALUES ('test01', '太郎', '山田', 'USER', 'password');

INSERT INTO usr (user_id, first_name, last_name, role_name, password)
VALUES ('test02', '花子', '田中', 'USER', 'password');

INSERT INTO usr (user_id, first_name, last_name, role_name, password)
VALUES ('test03', '次郎', '佐藤', 'USER', 'password');

JavaxmlファイルのMapper

SampleMybatis.java
インタフェースを書く。@Mapperアノテーション忘れずに。

package example.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import example.model.User;

@Mapper
public interface SampleMybatis {
    List<User> selectAll();
}

SampleMybatis.xml
Javaに書いたメソッドに対応するSQLを書く。
mapperタグのnamespace属性はパッケージ名.クラス名
selectタグ内のresultType属性でモデルクラス指定はパッケージ名.クラス名

<?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="example.mapper.SampleMybatis">
  <select id="selectAll" resultType="example.model.User">
    select * from usr
  </select>
</mapper>

HomeController

Mapperインタフェース呼び出してSQL実行、画面に表示する。

package example.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import example.mapper.SampleMybatis;
import example.model.User;

@Controller
public class HomeController {
    @Autowired
    SampleMybatis mapper;

    @GetMapping(value = "/")
    public String get() {
        return "index";
    }

    @PostMapping(value = "/")
    public String post(Model model) {
        List<User> userList = mapper.selectAll();
        List<String> lines = new ArrayList<>();

        for(User user : userList) {
            lines.add(user.getLastName() + " " + user.getFirstName() + ", " + user.getRoleName());
        }

        model.addAttribute("file_contents", lines);
        return "index";
    }
}

index.html

ボタン押したらSQLの結果を表示

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="https://www.thymeleaf.org"
    xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form method="post" action="/">
        <input type="submit" value="selectAll">
    </form>
    <table>
        <tr th:each="line:${file_contents}">
            <td th:text=${line}></td>
        </tr>
    </table>
</body>
</html>

参考文献

https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/