介绍
在本项目中,你将学习如何使用流行的 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 接口定义了一个方法 getCoursesByTeacherName,该方法将一个 Map 作为输入参数。此方法将用于检索教师姓名包含指定值的课程。
在 Mapper 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 函数对 teacher 列进行模糊搜索,其中教师姓名包含指定的 teacherName 值。然后,结果按 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 中练习更多实验来提升你的技能。



