resultMap の実際の使い方

JavaScriptBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、MyBatis を使ってデータベースからコース情報を取得し、その結果をカスタム Java オブジェクトにマッピングする方法を学びます。また、データベーステーブル構造とエンティティクラスのプロパティの間の不一致を処理する方法も学びます。

👀 プレビュー

MyBatis コースマッピングプレビュー

MyBatis resultMap 例

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • エンティティクラスのプロパティとメソッドを変更して、データベーステーブル構造に一致させる方法。
  • コース情報を照会するメソッドを定義するためにマッパーインターフェイスを構成する方法。
  • SQL クエリと結果マッピングを定義するためにマッパーXML ファイルを構成する方法。
  • マッパーの機能を検証するためのテストケースを実装する方法。

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • MyBatis を使ってデータベースとやり取りし、データを取得する。
  • resultMapを使って、データベーステーブル構造とエンティティクラスのプロパティの間の不一致を処理する。
  • MyBatis マッパーの機能を検証するためのテストケースを書く。

エンティティクラスを変更する

このステップでは、Course クラスのプロパティとメソッドをデータベーステーブル構造に合わせる方法を学びます。

  1. /org/lanqiao/pojo ディレクトリにある Course.java ファイルを開きます。
  2. プロパティの cNocNameteacher をそれぞれ idnamelecturer に変更します。
  3. 新しいプロパティ名に合わせて、getter と setter メソッドを変更します。
  4. Course.java ファイルに変更を保存します。
package org.lanqiao.pojo;

/**
 * Course クラスを定義する
 * @author lanqiao
 */
public class Course {
    // コース番号を id に変更する
    private int id;
    // コース名を name に変更する
    private String name;
    // 講師を lecturer に変更する
    private String lecturer;

    public Course() {

    }

    public Course(int id, String name, String lecturer) {
        this.id = id;
        this.name = name;
        this.lecturer = lecturer;
    }

    // getter と setter メソッド名を変更する
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLecturer() {
        return lecturer;
    }

    public void setLecturer(String lecturer) {
        this.lecturer = lecturer;
    }

    @Override
    public String toString() {
        return "Course ID: " + this.id + "\tCourse Name: " + this.name + "\tLecturer: " + this.lecturer;
    }
}

マッパーインターフェイスを構成する

このステップでは、コース情報を照会するメソッドを定義するために CourseMapper インターフェイスをどのように構成するかを学びます。

  1. /org/lanqiao/mapper ディレクトリにある CourseMapper.java ファイルを開きます。
  2. インターフェイスを変更して、以下のメソッドを追加します。
    • selectAllCourses():すべてのコース情報を取得します。
    • selectCourseById(int id):指定されたコース ID のコース情報を取得します。
package org.lanqiao.mapper;

import java.util.List;
import java.util.Map;
import org.lanqiao.pojo.Course;

public interface CourseMapper {
    List<Course> selectAllCourses();
    Map<String, Object> selectCourseById(int id);
}

マッパーXML ファイルを構成する

このステップでは、SQL クエリと結果マッピングを定義するために CourseMapper.xml ファイルをどのように構成するかを学びます。

  1. プロジェクトのルートディレクトリにある CourseMapper.xml ファイルを開きます。
  2. resultMap を定義して、データベーステーブルの列と Course クラスのプロパティの間のマッピングを指定します。
  3. CourseMapper インターフェイスのメソッド用の SQL クエリを定義します。
<?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="org.lanqiao.mapper.CourseMapper">

    <!-- resultMap の定義 -->
    <resultMap id="courseResultMap" type="org.lanqiao.pojo.Course">
        <id property="id" column="cNo"/>
        <result property="name" column="cName"/>
        <result property="lecturer" column="teacher"/>
    </resultMap>

    <!-- すべてのコース情報を照会する -->
    <select id="selectAllCourses" resultMap="courseResultMap">
        SELECT * FROM course;
    </select>

    <!-- コース番号 2 のコース情報を照会する -->
    <select id="selectCourseById" resultType="java.util.HashMap">
        SELECT * FROM course WHERE cNo = #{id};
    </select>

</mapper>

テストケースを実装する

このステップでは、CourseMapper の機能を検証するためのテストケースをどのように実装するかを学びます。

  1. /org/lanqiao/test ディレクトリにある MyBatisTest.java ファイルを開きます。
  2. testSelectAllCourses() メソッドを実装して、すべてのコース情報を取得して表示します。
  3. testSelectCourseById() メソッドを実装して、コース番号 2 のコース情報を取得して HashMap に結果を格納します。
package org.lanqiao.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.lanqiao.mapper.CourseMapper;
import org.lanqiao.pojo.Course;

public class MyBatisTest {

    SqlSessionFactory sessionFactory = null;
    SqlSession session = null;

    @Before
    public void before() throws IOException{
        String resource = "mybatis-config.xml";
        // MyBatis の設定ファイルを読み込む
        Reader reader = Resources.getResourceAsReader(resource);
        // SqlSessionFactory を作成する
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        // SQL マッピングファイル内の SQL 文を実行できる SqlSession オブジェクトを作成する
        session = sessionFactory.openSession();
    }

    @Test
    public void testSelectAllCourses() throws IOException{
        // session 内の getMapper() メソッドを呼び出してインターフェイスオブジェクトを返す
        CourseMapper cMapper = session.getMapper(CourseMapper.class);
        // クエリを実行してすべての Course オブジェクトを返す
        List<Course> courses = cMapper.selectAllCourses();
        System.out.println(courses);
        session.close();
    }

    @Test
    public void testSelectCourseById() {
        // CourseMapper のインスタンスを取得する
        CourseMapper mapper = session.getMapper(CourseMapper.class);

        // コース番号 2 のコースの情報を照会するメソッドを呼び出す
        Map<String, Object> course = mapper.selectCourseById(2);

        // 照会結果を出力する
        System.out.println(course);
    }
}

これらの手順に従うことで、エンティティクラスを成功裏に変更し、マッパーインターフェイスと XML ファイルを構成し、MyBatis を使ってコース情報を取得するためのテストケースを実装しました。

実行

最後に、次のコマンドを使ってターミナルでコードをコンパイルして実行し、Maven を使ってテストファイルを確認できます。

cd MyBatisCourseDemo03
mvn test

実行結果は以下のようになります。

テスト実行結果表示

テストケース実行結果

まとめ

おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習