今回は、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)
全体像
大まかな構成は以下の通りです。
上記には自動生成用の設定ファイル(generatorConfig.xml)や、
自動生成されたサンプルファイル(UserExample)も含まれていますが、無くても支障がありません。
MyBatisの自動生成機能を使用することで、以下のファイルを自動生成することができます。
- Modelクラス
- サンプルクラス
- Mapperインターフェース
- Mapper XMLファイル
自動生成については、以下を参照ください。
ビルド設定(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はあまり細かな設定を行わなくても簡単に導入できます。
XMLにSQLを定義するのは好みが分かれると思いますが、
関連ファイルを自動生成する機能も付いておりますので、サポートも充実しています。