MyBatis(二)——多对一、一对多

1. 多对一

多个学生都关联同一个老师,以多个学生为中心

1.1 在MySQL中创建student表、teacher表

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,`student``student``user``teacher`
  `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'); 

在这里插入图片描述
在这里插入图片描述

1.2 编写实体类

Teacher类:

package com.zz.pojo;

import lombok.Data;

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

Student类:

package com.zz.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    //学生关联老师
    private Teacher teacher;
}

1.3 编写接口

TeacherMapper 接口为空:

package com.zz.mapper;

public interface TeacherMapper {

}

StudentMapper 接口:
有得到student列表的方法

package com.zz.mapper;

import com.zz.pojo.Student;

import java.util.List;

public interface StudentMapper {

    //获取所有学生及学生对应老师的信息
    List<Student> getStudents();
}

1.4 编写接口对应的配置文件

TeacherMapper.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">
<mapper namespace="com.zz.mapper.TeacherMapper">
   
</mapper>

StudentMapper.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">
<mapper namespace="com.zz.mapper.StudentMapper">

    <!--获取所有学生及学生对应老师的信息:
      1. 获取所有学生的信息
      2. 获取所有学生的tid,然后再去老师表中查询这个id所对应的老师
    -->

    <resultMap id="StudentTeacher" type="Student">

        <id property="id" column="sid"/>
        <result property="name" column="sname"/>

        <!--数据库中的tid是一个字段,而teacher是一个对象,所以不能使用result标签
          这是多对一的情况,采用association标签(关联) student表关联teacher表,
          且这个teacher对象是Teacher类型
        -->

        <association property="teacher" javaType="Teacher">
            <id property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>

    </resultMap>

    <select id="getStudents" resultMap="StudentTeacher">
        select s.id sid,s.name sname,t.name tname,t.id tid
        From student s,teacher t
        WHERE s.tid=t.id
    </select>
</mapper>

1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中

采用扫描包的方法来绑定,就不用一个个分别绑定

 <mappers>
        <!--通过扫描包来绑定-->
        <package name="com.zz.mapper"/>
    </mappers>

1.6 编写测试类

因为是多对一,采用学生绑定老师,所以编写学生对应的测试类
编写StudentMapperTest测试类

package com.zz.mapper;

import com.zz.pojo.Student;

import com.zz.utils.MyBatisUtils;

import org.junit.Test;

import java.util.List;

public class StudentMapperTest {
    @Test
     public void testGetStudents(){
        StudentMapper mapper = MyBatisUtils.getSession().getMapper(StudentMapper.class);

        List<Student> students = mapper.getStudents();

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

运行结果:
在这里插入图片描述

2. 一对多

通过老师获取学生,以老师为中心
步骤与上相同,在此只写与上面不同之处
(1)编写实体类

package com.zz.pojo;

import lombok.Data;

import java.util.List;

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

    //老师对应多个学生 (包含:集合)
    private List<Student> students;
}
package com.zz.pojo;

import lombok.Data;

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

(2)编写接口

package com.zz.mapper;

import com.zz.pojo.Teacher;

public interface TeacherMapper {
    //获取这个老师下的所有学生
    public Teacher getTeacher(int id);
    
}

(3)编写接口的配置文件

<?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">
<mapper namespace="com.zz.mapper.TeacherMapper">

    <resultMap id="TeacherStudent" type="Teacher">

    <id property="id" column="tid"/>
    <result property="name" column="tname"/>

        <!--如果是集合(包含关系)-->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <!--学生的tid就是老师的id-->
            <result property="tid" column="tid"/>

        </collection>

    </resultMap>

    <!--Teacher里有个list集合,所以不能使用resultType,采用resultMap-->
    <select id="getTeacher" 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=#{id}

    </select>

</mapper>

(4)编写测试类

package com.zz.mapper;

import com.zz.pojo.Teacher;
import com.zz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class TeacherMapperTest {
    @Test
    public void testGetTeacher(){
        SqlSession session = MyBatisUtils.getSession();
        TeacherMapper mapper = session.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);

    }
}

运行结果:
在这里插入图片描述
总结:

  • 关联 - association 【多对一】
  • 集合 - collection 【一对多】
  • javaType & ofType
    javaType 用来指定实体类中属性的类型
    ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!
发布了62 篇原创文章 · 获赞 2 · 访问量 2719

猜你喜欢

转载自blog.csdn.net/nzzynl95_/article/details/104432275