Spring Boot DB連携

MyBatisのSQL文をXMLファイルに配置してみた

MyBatisを利用するプログラムで、これまではMapperクラスに直接SQL文を記載していたが、今回はXMLファイルにSQL文を移動してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

Spring BootのWEB画面上でサービスクラスを利用してみたこれまではコントローラクラスに主要な処理を記載していたが、MVCモデルに従うと、C(コントローラ)とM(モデル)で明確に分割した方が望ま...

完成した画面イメージ

下記記事の「完成した画面イメージの共有」を参照のこと。

Spring BootのWEB画面上でCRUDを含むOracleアクセス処理を実装してみた(完成イメージ編)今回は、C(Create)・R(Read)・U(Update)・D(Delete)を一通り含むOracle接続処理をSpring Boo...



作成したサンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。「前提条件」で記載したソースコードと異なるプログラムを赤枠で囲っている。
サンプルプログラムの構成

「UserDataMapper.java」の内容は以下の通り。SQL文の記載をこのプログラムから削除している。

package com.example.demo;

import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;

@Mapper
public interface UserDataMapper {

    /**
     * ユーザーデータテーブル(user_data)を全件取得する
     * @return ユーザーデータテーブル(user_data)を全データ
     */
    Collection<UserData> findAll();

    /**
     * 指定したIDをもつユーザーデータテーブル(user_data)のデータを取得する
     * @param id ID
     * @return ユーザーデータテーブル(user_data)の指定したIDのデータ
     */
    UserData findById(Long id);

    /**
     * 指定したIDをもつユーザーデータテーブル(user_data)のデータを削除する
     * @param id ID
     */
    void deleteById(Long id);

    /**
     * 指定したユーザーデータテーブル(user_data)のデータを追加する
     * @param userData ユーザーデータテーブル(user_data)の追加データ
     */
    void create(UserData userData);

    /**
     * 指定したユーザーデータテーブル(user_data)のデータを更新する
     * @param userData ユーザーデータテーブル(user_data)の更新データ
     */
    void update(UserData userData);

    /**
     * ユーザーデータテーブル(user_data)の最大値IDを取得する
     * @return ユーザーデータテーブル(user_data)の最大値ID
     */
    long findMaxId();
}
freelance hubを利用して10万件を超える案件情報からJava Spring案件を検索してみたfreelance hubは、レバテックフリーランスやフリエン(furien)を始めとした多くのフリーランスエージェントの案件をまとめて...

新規追加した「UserDataMapper.xml」の内容は以下の通り。

<?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.demo.UserDataMapper">
    <select id="findAll" resultType="com.example.demo.UserData">
        SELECT u.id, u.name, u.birth_year as birthY, u.birth_month as birthM
               , u.birth_day as birthD, u.sex as sex, m.sex_value as sex_value
        FROM USER_DATA u, M_SEX m WHERE u.sex = m.sex_cd ORDER BY u.id
    </select>
    <select id="findById" resultType="com.example.demo.UserData">
        SELECT id, name, birth_year as birthY
               , birth_month as birthM , birth_day as birthD, sex
        FROM USER_DATA WHERE id = #{id}
    </select>
    <delete id="deleteById" parameterType="java.lang.Long">
        DELETE FROM USER_DATA WHERE id = #{id}
    </delete>
    <insert id="create" parameterType="com.example.demo.UserData">
        INSERT INTO USER_DATA ( id, name, birth_year, birth_month, birth_day, sex )
        VALUES (#{id}, #{name}, #{birthY}, #{birthM}, #{birthD}, #{sex})
    </insert>
    <update id="update" parameterType="com.example.demo.UserData">
        UPDATE USER_DATA SET name = #{name}, birth_year = #{birthY}
            , birth_month = #{birthM}, birth_day = #{birthD}, sex = #{sex}
        WHERE id = #{id}
    </update>
    <select id="findMaxId" resultType="long">
        SELECT NVL(max(id), 0) FROM USER_DATA
    </select>
</mapper>

xmlファイルはresourcesフォルダ下のMapperインタフェースと同じディレクトリ下に配置し、mapperタグには、Mapperインタフェースのクラスパスを指定している。

また、select, insert, update, deleteの各タグを利用し、idタグにMapperインタフェースのメソッド名を指定している。さらに、resultTypeで戻り値のデータ型を、parameterTypeで引数のデータ型を指定している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-mybatis-xml/demo

要点まとめ

  • MyBatisのSQL文をXMLファイルに配置する場合、XMLファイルは、resourcesフォルダ下のMapperインタフェースと同じディレクトリ下に配置する。
  • XMLのmapperタグには、Mapperインタフェースのクラスパスを指定する。
  • SQL文は、select, insert, update, deleteの各タグ内に記載し、idタグにMapperインタフェースのメソッド名を指定する。さらに、resultTypeで戻り値のデータ型を、parameterTypeで引数のデータ型を指定することができる。