【Spring Boot】MyBatisの導入と使用例サンプルコード

【Spring Boot】 MyBatisの導入と 使用例サンプルコード バックエンド
スポンサーリンク

はじめに

ぴんくうさぎ
ぴんくうさぎ

初アサインが決まったのだけど、
今度の現場でMyBatisを使うらしい。

少しキャッチアップしたいな。

みどりがめ
みどりがめ

今回はMyBatisの導入と
基本的な使い方を見ていくよ!

この記事では、Javaで効率的にデータベースを扱うためのフレームワークである、「MyBatis」の導入〜記述方法について説明していきます。

この記事で分かること
  • Spring BootでMyBatisを使用するための環境構築について
  • MyBatisを使用したDBへのアクセス方法

MyBatisとは?

MyBatisは、Javaプログラミング言語向けのデータベースアクセス層のフレームワークです。このフレームワークは、オブジェクトとデータベースのマッピングを行うためにSQLクエリを使用します。MyBatisは、アプリケーションとデータベース間でのデータのやり取りを簡素化し、柔軟性を提供するために設計されています。

以下に、MyBatisの主な特徴と概念を簡単に説明します:

  1. SQLとオブジェクトのマッピング:
    • MyBatisでは、SQLクエリとJavaのオブジェクトとの間でマッピングを行います。これにより、データベースの行をJavaオブジェクトに変換し、逆にJavaオブジェクトをデータベースの行に保存できます。
  2. XMLまたはアノテーションを使用した設定:
    • MyBatisでは、SQLクエリやマッピングの設定はXMLファイルかアノテーションを使用して行います。これにより、データベースとの対話を柔軟に設定できます。
  3. 動的SQLクエリ:
    • MyBatisは、動的SQLクエリの構築をサポートしています。条件に応じてクエリの一部を組み立てることができ、柔軟なデータベースアクセスが可能です。
  4. トランザクション管理:
    • MyBatisは、トランザクションの管理をサポートしています。複数のSQLクエリをまとめてトランザクション内で実行できます。
  5. 結果マッピング:
    • データベースからの結果セットは、Javaオブジェクトにマッピングされます。この際、手動でマッピングを行うことも可能です。

開発環境

私が実施した環境は以下の通りです。

  • Java11
  • Gradle
  • Spring Boot
  • MySQL
  • InteluJ CE

MyBatisの導入

buid.gradleにMyBatisの情報を追加します。私の環境でのdependenciesは以下です。

implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'mysql:mysql-connector-java'

Mavenを使用されている方は、Spring Initializrより以下の手順により生成したコードをpom.xmlにコピペしてください。
・Projectを「Maven Project」を選択。
・Dependenciesに「MyBatis」を追加。
・「EXPLORE」を押下することでMybatisの情報が含まれたpom.xmlが表示される。

application.ymlへのDB情報の設定

私の場合は、yml形式でMySQLのデータベースへの設定情報を記載しています。

spring:
  dataSource:
    url: jdbc:mysql://localhost/api_sample
    username: test_user
    password: password
    sql-script-encoding: utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver

Mapperインターフェースの作成

DBテーブルへの操作を定義するマッパーインターフェースを作成します。
ポイントは@Mapperアノテーションをinterfaceに付与することです。
今回は「ApiSampleRepository」という命名にしています。
また、赤字の各メソッドが後程作成するXMLファイルとの紐付けを担います。

import com.example.apipractice.model.ApiSampleModel;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ApiSampleRepository {

    ApiSampleModel findById(Integer id);

    void insertTopic(ApiSampleModel model);

    void updateTopic(ApiSampleModel model);

    void deleteTopic(Integer id);
}

マッパーXMLの作成

マッパーXMLはsrc.main/resources 以下に配置します。
このとき、上記で作成したパッケージ階層と同じようにディレクトリを作成し、インターフェース名と拡張子以前が同じファイル名で作成します。
下記画像を参照してファイルを作成してください。

XMLファイルの配置場所

XMLファイルの内容は以下の通りです。いくつかポイントがあります。
・赤文字で書かれたidでマッパーインターフェースとの紐付けをします。
・マッパーインターフェースから受け取る引数をSQL中で使用する場合、#{id}のように記載します。
・resultMapはselect文をした際のmodelクラスとのマッピングを行なっています。
青文字のtypeでmodelクラスと紐づけています。
・緑文字の「useGeneratedKeys=”true” keyProperty=”id”」を指定することで、自動採番された
idを取得できます。

<?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.example.apipractice.repository.ApiSampleRepository">

    <resultMap id="Api_Sample_Result_Map" type="com.example.apipractice.model.ApiSampleModel">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="title" property="title" jdbcType="VARCHAR"/>
        <result column="content" property="content" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="findById" parameterType="int" resultMap="Api_Sample_Result_Map">
        select id, title, content from topics where id = #{id}
    </select>
    <insert id="insertTopic" useGeneratedKeys="true" keyProperty="id">
        insert into topics (title,content) values (#{title},#{content})
    </insert>
    <update id="updateTopic">
        update topics set
        title = #{title},content = #{content}where id = #{id}
    </update>
    <delete id="deleteTopic">
        delete from topics where id = #{id}
    </delete>
</mapper>

これでControllerにリクエスト送ると、DBとの疎通が取れてしまうんです。。すごいですね。。

終わりに

本記事はここまでとなります。
ご覧いただきありがとうございました。ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです!🐢

コメント