Введение
В этом проекте вы научитесь использовать MyBatis, популярный Java фреймворк для работы с базами данных, для взаимодействия с базой данных MySQL. В частности, вы научитесь использовать входные параметры в SQL-запросах и получать информацию о курсах по имени преподавателя.
👀 Предварительный просмотр
[labex] DEBUG [main] - Установка автокоммита в значение false для соединения JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[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для определения метода получения курсов по имени преподавателя - Написать SQL-запрос в файле
CourseMapper.xmlдля выполнения нечеткого поиска по столбцуteacherи сортировки результатов по убыванию номера курса - Протестировать реализацию
CourseMapperв классеMyBatisTestдля обеспечения требуемой функциональности
🏆 Достижения
После завершения этого проекта вы сможете:
- Использовать MyBatis для взаимодействия с базой данных MySQL
- Передавать входные параметры в SQL-запросы с использованием
Map - Выполнять нечеткий поиск по столбцу базы данных и сортировать результаты
- Тестировать функциональность мапера MyBatis с использованием тестового случая JUnit
Реализовать интерфейс CourseMapper
В этом шаге вы реализуете интерфейс CourseMapper для получения информации о курсах по имени преподавателя.
- Откройте файл
CourseMapper.java, расположенный в пакетеorg.labex.mapper.
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 определяет метод getCoursesByTeacherName, который принимает Map в качестве входного параметра. Этот метод будет использоваться для получения курсов, у которых имя преподавателя содержит указанное значение.
Реализовать SQL-запрос в XML-файле маппера
В этом шаге вы реализуете SQL-запрос в файле CourseMapper.xml для получения курсов по имени преподавателя.
- Откройте файл
CourseMapper.xml, расположенный в директорииsrc/main/java/org/labex/mapper.
<?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> определяет SQL-запрос, который будет выполнен при вызове метода getCoursesByTeacherName. Атрибут parameterType задает, что входной параметр - это HashMap, а атрибут resultType указывает, что результат будет сопоставлен с классом Course.
SQL-запрос использует оператор LIKE с функцией CONCAT для выполнения нечеткого поиска по столбцу teacher, где имя преподавателя содержит указанное значение teacherName. Затем результаты сортируются по убыванию по столбцу cNo (номер курса).
Тестировать CourseMapper в классе MyBatisTest
В этом шаге вы будете тестировать реализацию CourseMapper, создав тестовый случай в файле MyBatisTest.java.
- Откройте файл
MyBatisTest.java, расположенный в пакетеorg.labex.test.
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);
//Создать объект SqlSession, который может выполнять SQL-операторы в файле SQL-отображения
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 мы сначала получаем экземпляр интерфейса CourseMapper с помощью session.getMapper(CourseMapper.class). Затем мы создаем HashMap в качестве входного параметра и помещаем ключ "teacherName" со значением "Am".
Наконец, мы вызываем метод getCoursesByTeacherName из CourseMapper и выводим полученные объекты Course.
Запустить тестовый случай
Для запуска тестового случая следуйте шагам:
- В терминале используйте следующую команду для запуска базы данных MySQL и импорта файла
course.sql:
sudo service mysql start
mysql -u root < course.sql
- Перейдите в директорию проекта
MyBatisCourseDemoс помощью следующей команды:
cd ~/project/MyBatisCourseDemo/
- Запустите следующую команду для выполнения тестового случая:
mvn test
Вывод должен быть похож на следующий:
[labex] DEBUG [main] - Установка автокоммита в значение false для соединения JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[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
Это показывает, что метод getCoursesByTeacherName в CourseMapper работает как ожидается, получая курсы, у которых имя преподавателя содержит "Am", и сортируя их по убыванию номера курса.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете выполнить больше лабораторных работ в LabEx, чтобы улучшить свои навыки.



