Java MyBatis 多表查询实战:一对一与一对多映射详解

阿橙
阿橙
发布时间:2026-10-16 | 4人浏览过
原创

本文详细讲解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开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表