Mybatis一对多处理(以老师学生为例)

1、按照结果嵌套处理
  • 接口TeacherMapper

    public interface TeacherMapper {
    
        //获取指定老师下的所有学生及老师信息
        Teacher getTeacher(@Param("tid") int id);
    
    }
    
  • 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.ping.dao.TeacherMapper">
    
        <!--按照结果嵌套查询-->
        <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 = #{tid};
        </select>
        <resultMap id="TeacherStudent" type="Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
            <!--复杂的属性,需要单独处理,  对象:association,  集合:collection
                javaType="" 指定属性的类型
                集合中的泛型信息,使用ofType获取
            -->
            <collection property="students" ofType="Student">
                <result property="id" column="sid"/>
                <result property="name" column="sname"/>
                <result property="tid" column="tid"/>
    
            </collection>
        </resultMap>
    </mapper>
    
    
  • 测试类

    public class Mytest {
        @Test
        public void test(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
            Teacher teacher = mapper.getTeacher(1);
            System.out.println(teacher);
            /*
            Teacher(id=1, name=王老师, students=[Student(id=1, name=小明, tid=1),
            Student(id=2, name=小红, tid=1),
            Student(id=3, name=小张, tid=1),
            Student(id=4, name=小李, tid=1),
            Student(id=5, name=小王, tid=1)])
            */
    
            sqlSession.close();
        }
    }
    
  • 测试结果

2、按照查询嵌套处理
  • 接口TeacherMapper

    public interface TeacherMapper {
    
        //获取指定老师下的所有学生及老师信息
        Teacher getTeacher2(@Param("tid") int id);
    
    }
    
  • 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.ping.dao.TeacherMapper">
    
        <!--按照查询嵌套处理-->
        <select id="getTeacher2" resultMap="TeacherStudent2">
            select * from teacher where id = #{tid};
        </select>
        <resultMap id="TeacherStudent2" type="Teacher">
            <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
        </resultMap>
    
        <select id="getStudentByTeacherId" resultType="Student">
            select * from student where tid = #{tid}
        </select>
    </mapper>
    
    
  • 测试类

    public class Mytest {
        @Test
        public void test2(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
            Teacher teacher = mapper.getTeacher2(1);
            System.out.println(teacher);
            /*
            Teacher(id=1, name=王老师, students=[Student(id=1, name=小明, tid=1),
            Student(id=2, name=小红, tid=1),
            Student(id=3, name=小张, tid=1),
            Student(id=4, name=小李, tid=1),
            Student(id=5, name=小王, tid=1)])
            */
    
            sqlSession.close();
        }
    }
    
  • 测试结果

假设我们的班级、老师学生的表名分别为class、teacherstudent,其中班级和老师一对多关系,老师学生也是一对多关系。 首先,在 Class 表中,我们需要添加一个外键关联 Teacher 表,即 Teacher_id 字段。在 Teacher 表中,也需要添加一个外键关联 Class 表,即 Class_id 字段。在 Student 表中,我们需要添加一个外键关联 Teacher 表,即 Teacher_id 字段。 接下来,我们需要定义相应的实体类,Class、TeacherStudent,并在实体类中定义相应的属性以及 getter 和 setter 方法。同时,我们还需要在 Class 类中添加一个 Teacher 类型的属性,表示班级对应的老师,它的 getter 和 setter 方法也需要相应定义。在 Teacher 类中,我们需要添加一个 Class 类型的属性,表示老师所在的班级,同样需要添加相应的 getter 和 setter 方法。 现在,我们可以通过 MyBatis 来实现一对多查询了。我们可以先通过 Class 表查询到所有的班级,然后再通过 Teacher 表查询到每个班级对应的所有老师,最后再通过 Student 表查询到每个老师对应的所有学生。具体实现方式如下: 1. 在 ClassMapper.xml 文件中添加以下代码: ```xml <select id="getClassWithTeachers" resultMap="classResultMap"> SELECT * FROM class c LEFT JOIN teacher t ON c.id = t.class_id </select> <resultMap id="classResultMap" type="com.example.Class"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="teachers" ofType="com.example.Teacher"> <id property="id" column="teacher_id" /> <result property="name" column="teacher_name" /> <result property="classId" column="class_id" /> </collection> </resultMap> ``` 2. 在 TeacherMapper.xml 文件中添加以下代码: ```xml <select id="getTeacherWithStudents" resultMap="teacherResultMap"> SELECT * FROM teacher t LEFT JOIN student s ON t.id = s.teacher_id WHERE t.class_id = #{classId} </select> <resultMap id="teacherResultMap" type="com.example.Teacher"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="classId" column="class_id" /> <collection property="students" ofType="com.example.Student"> <id property="id" column="student_id" /> <result property="name" column="student_name" /> <result property="teacherId" column="teacher_id" /> </collection> </resultMap> ``` 3. 在 ClassMapper.java 接口文件中添加以下代码: ```java Class getClassWithTeachers(int id); ``` 4. 在 Class.java 实体类中添加以下代码: ```java private List<Teacher> teachers; // getter 和 setter 方法 ``` 5. 在 Teacher.java 实体类中添加以下代码: ```java private Class class; private List<Student> students; // getter 和 setter 方法 ``` 现在,我们就可以通过调用 getClassWithTeachers 方法来查询所有班级以及每个班级对应的老师,然后再通过调用 getTeacherWithStudents 方法来查询每个老师对应的所有学生
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fly-ping

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值