MyBatis 数据库集成项目

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本项目中,你将学习如何使用流行的 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 接口定义了一个方法 getCoursesByTeacherName,该方法将一个 Map 作为输入参数。此方法将用于检索教师姓名包含指定值的课程。

✨ 查看解决方案并练习

在映射器 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 属性指定输入参数是一个 HashMapresultType 属性指定结果将被映射到 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";
        //加载 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

这表明 CourseMapper 中的 getCoursesByTeacherName 方法按预期工作,检索到教师姓名包含“Am”的课程,并按课程编号降序排序。

✨ 查看解决方案并练习

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。