Java MyBatis 多表查询实战:一对一与一对多映射详解
本文详细讲解MyBatis在多表查询场景下的核心配置方法。通过Student与Banji(班级)的关联案例,演示如何利用association标签处理一对一关系,并简述一对多结构的实现逻辑,附带完整SQL语句、Mapper代码片段及运行结果验证。
准备数据表结构
在开始代码开发前需明确数据库表之间的关联关系。以常见的教务系统为例,主要涉及四张表:
- 学生表 (student)
- 班级表 (banji)
- 课程表 (course)
- 班级课程表 (banji_course)
一对一关联查询:association
在一对一关系中,例如“一个学生只属于一个班级”,我们需要将班级的信息映射到学生对象的属性中。这需要编写联合查询SQL,并在MyBatis映射文件中配置association标签。
第一步:编写联合查询SQL
为了获取学生及其所属班级的详细信息,使用INNER JOIN连接student表和banji表。注意字段别名设置,避免ID冲突。
-- 基础SQL示例
SELECT
s.id,
s.`name`,
s.age,
s.gender,
b.id AS banjiId,
b.name AS banjiName
FROM student AS s
INNER JOIN banji AS b
ON s.banji_id = b.id;
第二步:配置Mapper XML映射
在ResultMap中使用association标签来描述嵌套对象映射。该标签主要包含以下关键属性:
property:目标对象(如Student)中用于承载关联数据的属性名(如banji)。javaType:关联对象的全限定类名(如com.xxx.Banji)。column:数据库中用于关联的字段名或别名(如banji_id)。
配合resultMap定义,可以将SQL查询结果自动封装为带有班级信息的Student对象列表。
第三步:执行测试与验证
通过MyBatis工具类获取SqlSession,调用对应的selectList方法执行查询。以下是典型的测试代码结构与控制台输出结果:
public void testOne2One() {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 查询携带班级信息的学生列表
List<Student> list = sqlSession.selectList("student.findStudentBanjiInfo");
for (Student student : list) {
System.out.println(student);
}
}
控制台输出示例显示,每个Student对象内部都正确包含了Banji对象的数据:
Student [id=1, name=张三, age=21, gender=男, banji=Banji [id=1, name=java1807] ]
Student [id=2, name=zhangsan, age=12, gender=男, banji=Banji [id=1, name=java1807] ]
Student [id=4, name=王五2, age=12, gender=男, banji=Banji [id=2, name=java1812]]
在后续的前端展示或业务逻辑中,可通过${student.banji.id}或${student.banji.name}直接访问嵌套属性。
一对多关联查询:collection
一对多关系通常表现为“一个班级包含多名学生”。在MyBatis中,除了association外,还需使用collection标签来处理集合类型的关联数据。
多对多关系处理
在实际数据库设计中,多对多关系(如学生与课程)通常不直接建立关联表映射,而是分解为两个一对多关系进行处理。即:一个学生对应多个选修记录,一个课程对应多个选修记录。
总结
MyBatis通过association和collection标签优雅地解决了多表查询中的数据组装问题。掌握这两种映射方式,能够有效简化Java后端在复杂业务场景下的SQL拼接与对象映射工作量。以上就是Java MyBatis 多表查询详解的详细内容,更多关于MyBatis高级特性与Java ORM开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









