はじめに
このプロジェクトでは、人気のある 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インターフェイスを実装します。
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 クエリを実装します。
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の実装をテストします。
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"を設定します。
最後に、CourseMapperのgetCoursesByTeacherNameメソッドを呼び出し、取得したCourseオブジェクトを出力します。
テストケースを実行する
テストケースを実行するには、次の手順に従ってください。
- ターミナルで、次のコマンドを使用して MySQL データベースを起動し、
course.sqlファイルをインポートします。
sudo service mysql start
mysql -u root < course.sql
- 次のコマンドを使用して、
MyBatisCourseDemoプロジェクトディレクトリに移動します。
cd ~/project/MyBatisCourseDemo/
- 次のコマンドを実行して、テストケースを実行します。
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
これは、CourseMapperのgetCoursesByTeacherNameメソッドが期待通りに機能しており、教師の名前に「Am」が含まれるコースを取得し、コース番号で降順にソートしていることを示しています。
まとめ
おめでとうございます!このプロジェクトを完了しました。実験技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。



