SpringBoot MyBatis 設定 実装 サンプル

今回は、SpringBootでMyBatisを利用する為の基本設定や簡単な実装例のメモです。
MySQLに接続して、データを簡単なWeb画面に表示するところまでの内容になります。
MyBatis 公式ページ

検証環境・バージョン

  • MacOS:Sonoma 14.6
  • Amazon Corretto:17
  • SpringBoot:3.4.0
  • MyBatis:3.0.4
  • MyBatis generator-core:1.4.0
  • IntelliJ IDEA:2024.2 (Ultimate Edition)

全体像

大まかな構成は以下の通りです。

MyBatis Sample IntelliJ

上記には自動生成用の設定ファイル(generatorConfig.xml)や、
自動生成されたサンプルファイル(UserExample)も含まれていますが、無くても支障がありません。

MyBatisの自動生成機能を使用することで、以下のファイルを自動生成することができます。

  • Modelクラス
  • サンプルクラス
  • Mapperインターフェース
  • Mapper XMLファイル

自動生成については、以下を参照ください。

MyBatis Generator 自動生成 設定


ビルド設定(Gradle)

MyBatisをSpringBootで扱うためのモジュール指定と、
MySQLのコネクターのみ指定します。

dependencies {
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.4'
    runtimeOnly 'com.mysql:mysql-connector-j'
}

プロパティファイル設定

DBの接続設定のみです。MyBatis特有の設定などは不要です。

spring.application.name=SpringbootMyBatis

spring.datasource.url=jdbc:mysql://localhost:3497/test_db
spring.datasource.username=test_db
spring.datasource.password=test_db_pass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

SpringBootApplicationクラス MyBatisマッパー指定

SpringBootApplicationの基底クラスに、アノテーションで以下の指定を入れます。

@MapperScan("com.springbootmybatis.mapper")

package com.springbootmybatis;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.springbootmybatis.mapper")
public class SpringbootMyBatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMyBatisApplication.class, args);
    }
}

Modelクラス作成

DBテーブルに対応するモデルクラスを作成します。
今回はDBテーブルを以下の内容で想定して作成します。

CREATE TABLE `test_db`.`user` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NULL,
`age` INT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC));

INSERT INTO `test_db`.`user` (`id`, `name`, `age`) VALUES ('1', 'テスト1ユーザー', '20');
INSERT INTO `test_db`.`user` (`id`, `name`, `age`) VALUES ('2', 'テスト2ユーザー', '25');
INSERT INTO `test_db`.`user` (`id`, `name`, `age`) VALUES ('3', 'テスト3ユーザー', '30');

モデルクラス

以下は自動生成されたファイルを流用していますが、
手動でUserテーブルの内容を定義しても問題なく動作します。
Lombokなどを利用しても問題なく動作します。

package com.springbootmybatis.model;

public class User {
    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.id
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    private Integer id;

    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.name
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    private String name;

    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.age
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    private Integer age;

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user.id
     *
     * @return the value of user.id
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public Integer getId() {
        return id;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user.id
     *
     * @param id the value for user.id
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user.name
     *
     * @return the value of user.name
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public String getName() {
        return name;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user.name
     *
     * @param name the value for user.name
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user.age
     *
     * @return the value of user.age
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public Integer getAge() {
        return age;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user.age
     *
     * @param age the value for user.age
     *
     * @mbg.generated Sun Dec 15 23:11:21 JST 2024
     */
    public void setAge(Integer age) {
        this.age = age;
    }
}

Mapperインターフェース作成

今回はSELECT文を実行するだけの簡易的な内容で作成します。

package com.springbootmybatis.mapper;

import com.springbootmybatis.model.User;
import com.springbootmybatis.model.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    // mapper xmlファイルのselectタグのidと同じ文字列を指定
    List<User> selectByExample();
}

Mapper XMLファイル作成

SELECT文を実行するだけの簡単な内容です。

<?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">
<!-- namespaceは、パッケージ.ファイル名を指定します -->
<mapper namespace="com.springbootmybatis.mapper.UserMapper">
  <!-- idは、interface名と合わせます -->
  <!-- resultTypeは、返却したい型に合わせます -->
  <select id="selectByExample" resultType="com.springbootmybatis.model.User">
    SELECT id, name, age
    FROM user
  </select>
</mapper>

挙動確認用実装

  • サービスクラス
package com.springbootmybatis.service;

import com.springbootmybatis.mapper.UserMapper;
import com.springbootmybatis.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional(readOnly = true)
    public List getAllUsers() {
        return userMapper.selectByExample();
    }
}
  • コントローラクラス
package com.springbootmybatis.controller;

import com.springbootmybatis.model.User;
import com.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
public class SampleController {

    @Autowired
    UserService userService;

    @GetMapping("/")
    public ModelAndView index() {
        // Get all users from the database
        final List users = userService.getAllUsers();
        // Create a new ModelAndView object
        final ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("Users", users);
        modelAndView.setViewName("index");
        return modelAndView;
    }
}
  • 画面表示用テンプレート
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MyBatis Sample</title>
</head>
<body>
<h1>MyBatis Sample</h1>
<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
    </tr>
    </thead>
    <tbody>
        <tr th:each="user : ${Users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.name}"></td>
            <td th:text="${user.age}"></td>
        </tr>
    </tbody>
</table>
</body>
</html>

挙動確認

MyBatis SpringBoot Sample MyBatis SpringBoot Sample


今回のメモは以上となります。
MyBatisはあまり細かな設定を行わなくても簡単に導入できます。
XMLにSQLを定義するのは好みが分かれると思いますが、
関連ファイルを自動生成する機能も付いておりますので、サポートも充実しています。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 175

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る