Mybatis链表查询---多对一和一对多的处理

x33g5p2x  于2022-02-07 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(355)

首先新建两张表

CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

结构如图:

方法一:按查询嵌套处理

首先说实体类:

我们发现实体类的第三个是一个对象:Teacher

这里使用的association就是为了对象产生的,然后后面多了参数,也就是嵌套查询,多了一个getTeacher查询

方法二:按照结果嵌套处理

<select id="getStudents2" resultMap="StudentTeacher2" >
select s.id sid, s.name sname , t.name tname
from student s,teacher t
where s.tid = t.id
</select>

<resultMap id="StudentTeacher2" type="Student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<!--关联对象property 关联对象在Student实体类中的属性-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>

对比:

一对多:

按结果嵌套查询:

首先是实体类改变:

package com.ftz.Demo.po;

import lombok.Data;

import java.util.List;

@Data
public class Teacher {
    private  int id;
    private  String name;

    // 一个老师拥有多个学生
    private List<Student> students;

}

然后是老师的接口:

然后是配置文件,这里有两个不一样的地方:

<select id="getTeacher2" resultMap="TeacherStudent">
        select s.id sid,s.name sname ,t.name tname ,t.id tid
        from student s,teacher t
        where s.tid = t.id and t.id = #{tid}
    </select>

    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

测试结果:

总结:

1:关联:-association 多对一

2:集合:-collection 一对多

3:javaType && ofType

  • JavaType是用来指定pojo中属性的类型
  • ofType指定的是映射到list集合属性中pojo的类型。

相关文章