9.1 表结构

现在有两张表

student

id name tid
1 Tom 1
2 Jack 1
3 Alice 1
4 Eric 2
5 Bob 2

teacher

id name
1 Teacher Zhang
2 Teacher Li

学生表的 tid 和 教师表的 id 对应。

我们不难看出这是一个多表查询

9.2 创建实体类

Student.java

  1. package com.lu.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.apache.ibatis.type.Alias;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. @Alias("Student")
  10. public class Student {
  11. private int id;
  12. private String name;
  13. private Teacher teacher;
  14. }

Teacher.java

  1. package com.lu.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import org.apache.ibatis.type.Alias;
  5. @Data
  6. @AllArgsConstructor
  7. @Alias("Teacher")
  8. public class Teacher {
  9. private int id;
  10. private String name;
  11. }

9.3 创建mapper

StudentMapper.java

  1. package com.lu.dao;
  2. import com.lu.entity.Student;
  3. import java.util.List;
  4. public interface StudentMapper {
  5. // 查询所有学生的信息,以及对应老师的信息
  6. List<Student> getStudent();
  7. }

9.4 创建xml

按照我们传统思路来进行查询试试看

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.lu.dao.StudentMapper">
  6. <select id="getStudent" resultType="Student">
  7. select * from student;
  8. </select>
  9. </mapper>
  1. package com.lu;
  2. import com.lu.dao.StudentMapper;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. /**
  9. * Hello world!
  10. */
  11. public class App {
  12. public static void main(String[] args) throws IOException {
  13. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
  14. SqlSession sqlSession = sqlSessionFactory.openSession();
  15. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  16. mapper.getStudent().forEach(System.out::println);
  17. sqlSession.close();
  18. }
  19. }

查询结果

  1. Student(id=1, name=Tom, teacher=null)
  2. Student(id=2, name=Jack, teacher=null)
  3. Student(id=3, name=Alice, teacher=null)
  4. Student(id=4, name=Eric, teacher=null)
  5. Student(id=5, name=Bob, teacher=null)

并没有得到想要的效果,我们还发现 teacher 属性是空的。

那如何解决呢,我们需要使用结果集映射

9.5 梳理思路

我们先来梳理下思路

  1. 查询所有Student
  2. 将得到的tid去查询对应的老师
  3. 将查询到的老师绑定到对应字段上

那么我们就有两种查询思路

  • 按照步骤来处理
  • 按照结果来处理

9.6 按步骤处理

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.lu.dao.StudentMapper">
  6. <!-- 查询思路:
  7. 需求分析:
  8. 我们的目标是查找所有学生
  9. 已知学生字段类型:
  10. id int
  11. name String
  12. teacher Teacher
  13. 我们发现字段 teacher 不是基本类型,并且数据库中没有这个字段,那么我们就要考虑 使用结果集映射
  14. -->
  15. <!--1. 查询所有学生,对结果进行映射-->
  16. <select id="getStudent" resultMap="StudentTeacher">
  17. select * from student;
  18. </select>
  19. <!--2. 前几个字段是默认的,不需要处理-->
  20. <resultMap id="StudentTeacher" type="Student">
  21. <!--3. 这里字段3 进行实体类关联-->
  22. <association property="teacher" column="tid" select="getTeacher" javaType="Teacher"/>
  23. </resultMap>
  24. <!--通过上面传递过来的tid 查询对应老师-->
  25. <select id="getTeacher" resultType="Teacher">
  26. select * from teacher where id = #{tid};
  27. </select>
  28. </mapper>
  1. Student(id=1, name=Tom, teacher=Teacher(id=1, name=Teacher Zhang))
  2. Student(id=2, name=Jack, teacher=Teacher(id=1, name=Teacher Zhang))
  3. Student(id=3, name=Alice, teacher=Teacher(id=1, name=Teacher Zhang))
  4. Student(id=4, name=Eric, teacher=Teacher(id=2, name=Teacher Li))
  5. Student(id=5, name=Bob, teacher=Teacher(id=2, name=Teacher Li))

我们来梳理下查询过程

  • 建立SQL
  • 对结果进行映射
  • 实体类字段进行关联

    • 子查询

      9.7 按结果处理

      既然是按照结果处理,那么我们就生成结果,然后再梳理之间的关系.

      1. select s.id,s.name,t.name
      2. from student as s,teacher as t
      3. where s.tid=t.id;

      ```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">

  1. <resultMap id="StudentTeacher2" type="Student">
  1. <result property="id" column="sid"/>
  2. <result property="name" column="sname"/>
  1. <association property="teacher" javaType="Teacher">
  1. <result property="name" column="tname"/>
  2. </association>
  3. </resultMap>

``` 我们来梳理下查询过程

  • 建立多表查询SQL
  • 给对应字段起别名
  • 绑定字段
  • 映射类型
    • 绑定字段