MyBatis - 基础学习7 - 多表查询

一.按照查询嵌套处理

1.写接口

 List<Student> getstudent();

 

2.在mapper.xml中写相关的sql语句

@Data
public class Teacher {
    private int id;
    private String name;
    private List<Student> student;
}

  

  

@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}

  

<!--
思路:
1.查询所有的学生信息
2.根据查询出来的学生的tid,寻找对应的老师
-->
<select id="getstudent" resultMap="StudentTeacher">
    SELECT * FROM student
</select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <!--复杂的属性单独处理:
        对象:association
        集合:collection
        -->
        <association property="teacher" column="tid" javaType="Teacher" select="getteacher"/>
    </resultMap>
    <select id="getteacher" resultType="Teacher">
        SELECT * from teacher where id = #{tid}
    </select>

 

多对一:

多个学生对应一个老师,所以查询的思路是要把学生全部查出来去找对应的老师

由于这是不同的表查询,所以在返回值上:就不能简单的返回实体类(student,teacher是两个实体类,不能一下返回),我们就需要用到结果集映射resultMap

由于是多对一;返回值类型依旧是学生(student),普通的字段就是一一对应映射,但是对于要找的老师来说,在不同表中,这是一个对象,所以需要另外的关键字:association,专门负责对象映射

property:实体类中的属性      column:数据库中的字段     javaType:实体类中的属性在那个表中,就写它对饮的实体类    select:(子查询)这个查询的结果要有与column(数据库字段)对应的字段,他们才可以联系起来,这里是(student中的tid  =   teacher中的id)

子查询负责和column进行对应就好了,其中:id=#{ tid } 这个id(teacher表中的)会自动去匹配上面的column:tid(student表中的)

3.测试:

    @Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> getstudent = mapper.getstudent();
        for (Student student : getstudent) {
            System.out.println(student);
        }
        sqlSession.close();
    }

 

二.按照结果嵌套处理

1.先写对应的接口

 List<Student> getstudent();

 

2.在mapper.xml中写对应的方法

<!--按照结果嵌套处理-->
    <select id="getstudent" resultMap="studentteacher">
SELECT s.id sid,s.name sam,t.name tam
from student s,teacher t
WHERE s.tid=t.id
    </select>
    <resultMap id="studentteacher" type="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sam"/>
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tam"/>
        </association>

    </resultMap>

 

这种写法的解题思路就是sql语句的查询方式

语句其实没什么大问题,因为就是淳朴的sql语句,直接写里面就行了,问题在于mybayis的返回值又是两个表中的字段;所以又要用到结果集映射

前面的步骤都是一样的;property对应student实体类中的属性  column对应数据库中的字段

在使用association   property:student实体类中的字段   javaType:就是property的返回值是那个表里面的,然后还要在里面写:javaType对应的实体类:中的属性要和数据库的字段对应(由于取了别名,所以用:tam)

3.测试

    @Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> getstudent = mapper.getstudent();
        for (Student student : getstudent) {
            System.out.println(student);
        }
        sqlSession.close();
    }

 

 

====一对多(集合)=====

一.按照结果嵌套处理

1.编写接口

 List<Teacher> getstudent();

 

2.在对应的mapper.xml中写sql语句

<select id="getstudent" resultMap="Teacher1">
SELECT s.id sid,s.name sam,t.name tam FROM student s,teacher t where s.tid=t.id
</select>
    <!--
    javaType=“”  指定属性的类型
    集合中的泛型信息用ofType
    -->
<resultMap id="Teacher1" type="Teacher">
    <collection property="student" ofType="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sam"/>
    </collection>
</resultMap>

 

这里的一对多和多对一都是一个概念,只不过是结果集映射不同

对象:association

集合:collection

3.测试

@Test
    public void test(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    List<Teacher> getstudent = mapper.getstudent();
    for (Teacher teacher : getstudent) {

        System.out.println(teacher);
    }
    sqlSession.close();
}

 

二.按照查询嵌套处理

1.编写接口

 List<Teacher> getstudent();

 

2.在mapper中写sql

<select id="getstudent" resultMap="Teacher1">
SELECT * FROM teacher
</select>
    <!--
    javaType=“”  指定属性的类型
    集合中的泛型信息用ofType
    -->
<resultMap id="Teacher1" type="Teacher">
    <collection property="student" javaType="ArrayList" ofType="Student" column="id" select="sell">
    </collection>
</resultMap>
    <select id="sell" resultType="Student">
        SELECT  * from student where tid =#{id}
    </select>

 

子查询相对来说没有直接将其它表的字段和java类中的属性对应,我们就需要加上javaType,来告诉编译器,也就是property的类型,在Teacher这个实体类定义了是List,也就是数组(最准确是一个集合),

column就是子查询语句要和主查询产生关联的一个字段(它们都是Student类中的)

3.测试

@Test
    public void test(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    List<Teacher> getstudent = mapper.getstudent();
    for (Teacher teacher : getstudent) {

        System.out.println(teacher);
    }
    sqlSession.close();
}

 

posted @ 2022-11-20 20:31  回忆也交给时间  阅读(57)  评论(0编辑  收藏  举报