MyBatis を使ったデータベース統合プロジェクト

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

はじめに

このプロジェクトでは、人気のある Java 永続化フレームワークである MyBatis を使って MySQL データベースとやり取りする方法を学びます。具体的には、SQL クエリで入力パラメータを使って、教師の名前に基づいてコース情報を取得する方法を学びます。

👀 プレビュー

[labex] DEBUG [main] - JDBCコネクション [com.mysql.cj.jdbc.ConnectionImpl@642a7222] のオートコミットをfalseに設定しています
[labex] DEBUG [main] - ==> 準備中: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> パラメータ: Am(String)
[labex] DEBUG [main] - <==      合計: 2
コース番号: 3        コース名: Python     教師: Liam
コース番号: 1        コース名: HTML       教師: Amy

🎯 タスク

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

  • CourseMapperインターフェイスを実装して、教師の名前に基づいてコースを取得するメソッドを定義する
  • CourseMapper.xmlファイルに SQL クエリを書いて、teacher列でファジー検索を行い、コース番号で降順に結果をソートする
  • MyBatisTestクラスでCourseMapperの実装をテストして、期待通りの機能を確認する

🏆 成果

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

  • MyBatis を使って MySQL データベースとやり取りする
  • Mapを使って入力パラメータを SQL クエリに渡す
  • データベース列でファジー検索を行い、結果をソートする
  • JUnit テストケースを使って MyBatis マッパーの機能をテストする

CourseMapper インターフェイスを実装する

このステップでは、教師の名前に基づいてコース情報を取得するために、CourseMapperインターフェイスを実装します。

  1. org.labex.mapperパッケージにあるCourseMapper.javaファイルを開きます。
package org.labex.mapper;

import java.util.List;
import java.util.Map;

import org.labex.pojo.Course;

public interface CourseMapper {
    List<Course> getCoursesByTeacherName(Map<String, Object> params);
}

CourseMapperインターフェイスは、入力パラメータとしてMapを受け取るgetCoursesByTeacherNameメソッドを定義しています。このメソッドは、教師の名前に指定された値が含まれるコースを取得するために使用されます。

マッパーXML ファイルに SQL クエリを実装する

このステップでは、教師の名前に基づいてコースを取得するために、CourseMapper.xmlファイルに SQL クエリを実装します。

  1. src/main/java/org/labex/mapperディレクトリにあるCourseMapper.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="org.labex.mapper.CourseMapper">
    <select id="getCoursesByTeacherName" parameterType="java.util.HashMap" resultType="org.labex.pojo.Course">
        SELECT * FROM course
        WHERE teacher LIKE CONCAT('%', #{teacherName}, '%')
        ORDER BY cNo DESC
    </select>
</mapper>

<select>要素は、getCoursesByTeacherNameメソッドが呼び出されたときに実行される SQL クエリを定義します。parameterType属性は、入力パラメータがHashMapであることを指定し、resultType属性は、結果がCourseクラスにマッピングされることを指定します。

SQL クエリは、LIKE演算子とCONCAT関数を使用して、教師の名前に指定されたteacherName値が含まれるようにteacher列でファジー検索を行います。その後、結果はcNo(コース番号)列で降順にソートされます。

MyBatisTest クラスで CourseMapper をテストする

このステップでは、MyBatisTest.javaファイルにテストケースを作成することで、CourseMapperの実装をテストします。

  1. org.labex.testパッケージにあるMyBatisTest.javaファイルを開きます。
package org.labex.test;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
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.After;
import org.junit.Before;
import org.junit.Test;
import org.labex.mapper.CourseMapper;
import org.labex.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);
        //SqlSession ファクトリを作成する
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //SQL マッピングファイル内の SQL 文を実行できる SqlSession オブジェクトを作成する
        session = sessionFactory.openSession();
    }

    @Test
    public void testCourseMapper() {
        CourseMapper courseMapper = session.getMapper(CourseMapper.class);

        // パラメータマップを作成する
        Map<String, Object> param = new HashMap<>();
        param.put("teacherName", "Am");

        // CourseMapper で定義されたメソッドを呼び出す
        List<Course> courses = courseMapper.getCoursesByTeacherName(param);
        for (Course course : courses) {
            System.out.println(course);
        }
    }

    @After
    public void after() {
        session.close();
    }

}

testCourseMapperメソッドでは、まずsession.getMapper(CourseMapper.class)を使ってCourseMapperインターフェイスのインスタンスを取得します。その後、入力パラメータとしてHashMapを作成し、"teacherName"キーに値"Am"を設定します。

最後に、CourseMappergetCoursesByTeacherNameメソッドを呼び出し、取得したCourseオブジェクトを出力します。

テストケースを実行する

テストケースを実行するには、次の手順に従ってください。

  1. ターミナルで、次のコマンドを使用して MySQL データベースを起動し、course.sqlファイルをインポートします。
sudo service mysql start
mysql -u root < course.sql
  1. 次のコマンドを使用して、MyBatisCourseDemoプロジェクトディレクトリに移動します。
cd ~/project/MyBatisCourseDemo/
  1. 次のコマンドを実行して、テストケースを実行します。
mvn test

出力は次のようになるはずです。

[labex] DEBUG [main] - JDBCコネクション [com.mysql.cj.jdbc.ConnectionImpl@642a7222] のオートコミットをfalseに設定しています
[labex] DEBUG [main] - ==> 準備中: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> パラメータ: Am(String)
[labex] DEBUG [main] - <==      合計: 2
コース番号: 3        コース名: Python     教師: Liam
コース番号: 1        コース名: HTML       教師: Amy

これは、CourseMappergetCoursesByTeacherNameメソッドが期待通りに機能しており、教師の名前に「Am」が含まれるコースを取得し、コース番号で降順にソートしていることを示しています。

まとめ

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

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