MyBatis 데이터베이스 통합 프로젝트

JavaBeginner
지금 연습하기

소개

이 프로젝트에서는 인기 있는 Java 영속성 프레임워크인 MyBatis 를 사용하여 MySQL 데이터베이스와 상호 작용하는 방법을 배우게 됩니다. 특히, SQL 쿼리에서 입력 매개변수를 사용하고 강사 이름을 기반으로 코스 정보를 검색하는 방법을 배우게 됩니다.

👀 미리보기

[labex] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Course Number: 3        Course Name: Python     Teacher: Liam
Course Number: 1        Course Name: HTML       Teacher: 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 메서드를 정의합니다. 이 메서드는 강사 이름에 지정된 값이 포함된 코스를 검색하는 데 사용됩니다.

Mapper 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 함수를 사용하여 teacher 열에 대한 퍼지 검색을 수행합니다. 여기서 강사 이름은 지정된 teacherName 값을 포함합니다. 그런 다음 결과는 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";
        //Load the MyBatis configuration file
        Reader reader = Resources.getResourceAsReader(resource);
        //Create the SqlSession factory
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //Create a SqlSession object that can execute SQL statements in the SQL mapping file
        session = sessionFactory.openSession();
    }

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

        // Create a parameter map
        Map<String, Object> param = new HashMap<>();
        param.put("teacherName", "Am");

        // Call the method defined in 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] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Course Number: 3        Course Name: Python     Teacher: Liam
Course Number: 1        Course Name: HTML       Teacher: Amy

이는 CourseMappergetCoursesByTeacherName 메서드가 예상대로 작동하여 강사 이름에 "Am"이 포함된 코스를 검색하고 코스 번호별로 내림차순으로 정렬함을 보여줍니다.

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습