Проект интеграции базы данных MyBatis

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь использовать 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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashmap("HashMap") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/generics("Generics") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/jdbc("JDBC") java/SystemandDataProcessingGroup -.-> java/xml_dom4j("XML/Dom4j") subgraph Lab Skills java/collections_methods -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/classes_objects -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/interface -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/hashmap -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/generics -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/jdbc -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} java/xml_dom4j -.-> lab-300374{{"Проект интеграции базы данных MyBatis"}} end

Реализация интерфейса CourseMapper

В этом шаге вы реализуете интерфейс CourseMapper для получения информации о курсах по имени преподавателя.

  1. Откройте файл 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 для получения курсов по имени преподавателя.

  1. Откройте файл 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.

  1. Откройте файл 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.

✨ Проверить решение и практиковаться

Запуск тестового случая

Для запуска тестового случая следуйте шагам:

  1. В терминале используйте следующую команду для запуска базы данных MySQL и импорта файла course.sql:
sudo service mysql start
mysql -u root < course.sql
  1. Перейдите в директорию проекта MyBatisCourseDemo с помощью следующей команды:
cd ~/project/MyBatisCourseDemo/
  1. Запустите следующую команду для выполнения тестового случая:
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, чтобы улучшить свои навыки.