一对多的处理

HeJin大约 2 分钟数据库技术Mybatis

一个老师拥有多个学生。对于老师而言,就是一对多的关系。

实体类修改

Student.java

/**
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/28 13:38
 */
@Data
public class Student {

    private int id;
    private String name;
    private int tid;

}

Teacher.java

/**
 * @Description TODO
 * @Author Administrator
 * @Date 2020/11/28 13:39
 */
@Data
public class Teacher {
    private int id;
    private String name;
    /**
     * 一个老师拥有多个学生
     */
    private List<Student> students;
}

mapper文件TeacherMapper.xml修改

按结果嵌套

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.TeacherMapper">
    
    <!--按结果嵌套查询-->
    <select id="getTeacherById" resultMap="TeacherStudent">
        select t.id tid,t.name tname,s.id sid,s.name sname
        from teacher t,student s
        where t.id=s.tid and t.id=#{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--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>

按查询嵌套

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.TeacherMapper">
    <!--按查询嵌套-->
    <select id="getTeacherById2" resultMap="TeacherStudent2">
        select * from teacher where id = #{tid}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <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>

测试

/**
 * 按结果嵌套
 */
@Test
public void test02(){

    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = teacherMapper.getTeacherById(1);
    System.out.println(teacher);

    sqlSession.close();
}

/**
 * 按查询嵌套
 */
@Test
public void test03(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = teacherMapper.getTeacherById2(1);
    System.out.println(teacher);

    sqlSession.close();
}

结果

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Class not found: org.jboss.vfs.VFS
JBoss 6 VFS API is not available in this environment.
Class not found: org.jboss.vfs.VirtualFile
VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
Using VFS adapter org.apache.ibatis.io.DefaultVFS
Find JAR URL: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo
Not a JAR: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo
Reader entry: Student.class
Reader entry: Teacher.class
Listing file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo
Find JAR URL: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo/Student.class
Not a JAR: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo/Student.class
Reader entry: ����   4 U
Find JAR URL: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo/Teacher.class
Not a JAR: file:/E:/code/Java/mybatis-study/mybatis-06/target/classes/com/kuang/pojo/Teacher.class
Reader entry: ����   4 c
Checking to see if class com.kuang.pojo.Student matches criteria [is assignable to Object]
Checking to see if class com.kuang.pojo.Teacher matches criteria [is assignable to Object]
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 510063093.
==>  Preparing: select t.id tid,t.name tname,s.id sid,s.name sname from teacher t,student s where t.id=s.tid and t.id=? 
==> Parameters: 1(Integer)
<==    Columns: tid, tname, sid, sname
<==        Row: 1, 秦老师, 1, 小明
<==        Row: 1, 秦老师, 2, 小红
<==        Row: 1, 秦老师, 3, 小张
<==        Row: 1, 秦老师, 4, 小李
<==        Row: 1, 秦老师, 5, 小王
<==      Total: 5
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)])
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1e66f1f5]
Returned connection 510063093 to pool.

Process finished with exit code 0
image-20201129153950243
image-20201129153950243