Mybatis系列--12-一对多详解

Mybatis系列--12-一对多详解

概述

本文主要讲解一对多情况在Mybatis中的实现
还是举班主任和学生的例子,一个班主任管理多个学生,所以班主任和学生的关系为多对一,也叫集合关系
学生和老师的关系即为多对一,也叫关联关系

实践

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Mybatis-Study</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Mybatis-Study06-yiduiduo</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Mybatis-Study</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Mybatis-Study06-yiduiduo</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

db.properties

driver=com.mysql.jdbc.Driver
url=xxx
username=root
password=xxx

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.kuang.dao.TeacherMapper">
    <select id="getTeacher" resultMap="TeacherStudent">
        select *
        from teacher
        where id = #{tid}
    </select>

    <resultMap id="TeacherStudent" type="com.kuang.pojo.Teacher">
        <!--id和name不写也可以的-->
        <result property="id" column="id"></result>
        <result property="name" column="name"></result>
        <collection property="students" javaType="ArrayList" ofType="com.kuang.pojo.Student" select="getTeacherStudent"
            column="id"></collection>
    </resultMap>

    <select id="getTeacherStudent" resultType="com.kuang.pojo.Student">
        select *
        from student
        where tid = #{tid}
    </select>


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

    <resultMap id="TeacherStudent2" type="com.kuang.pojo.Teacher">
        <result property="id" column="tid"></result>
        <result property="name" column="tname"></result>
        <collection property="students" javaType="ArrayList" ofType="com.kuang.pojo.Student">
            <result property="id" column="sid"></result>
            <result property="name" column="sname"></result>
            <result property="tid" column="stid"></result>
        </collection>
    </resultMap>
</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.kuang.dao.StudentMapper">

</mapper>

MyBatisUtil.java

package com.kuang.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * 功能描述
 *
 * @since 2022-07-13
 */
public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static SqlSession getSqlsession() {
        return sqlSessionFactory.openSession(true);
    }
}

Teacher.java

package com.kuang.pojo;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 功能描述
 *
 * @since 2022-07-20
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private int id;
    private String name;
    private List<Student> students;
}

Student.java

package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 功能描述
 *
 * @since 2022-07-20
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int tid;
}

TeacherMapper.java

package com.kuang.dao;

import java.util.List;

import com.kuang.pojo.Teacher;

/**
 * 功能描述
 *
 * @since 2022-07-20
 */
public interface TeacherMapper {
    List<Teacher> getTeacher(int tid);

    List<Teacher> getTeacher2(int tid);
}

StudentMapper.java

package com.kuang.dao;

/**
 * 功能描述
 *
 * @since 2022-07-20
 */
public interface StudentMapper {

}

测试代码MyTest.java

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.kuang.dao.TeacherMapper;
import com.kuang.pojo.Teacher;
import com.kuang.util.MyBatisUtil;

/**
 * 功能描述
 *
 * @since 2022-07-21
 */
public class MyTest {
    @Test
    public void test01() {
        SqlSession sqlsession = MyBatisUtil.getSqlsession();
        TeacherMapper mapper = sqlsession.getMapper(TeacherMapper.class);
        List<Teacher> list = mapper.getTeacher(1);
        for (Teacher teacher : list) {
            System.out.println(teacher);
        }
        sqlsession.close();
    }


    @Test
    public void test02() {
        SqlSession sqlsession = MyBatisUtil.getSqlsession();
        TeacherMapper mapper = sqlsession.getMapper(TeacherMapper.class);
        List<Teacher> list = mapper.getTeacher2(1);
        for (Teacher teacher : list) {
            System.out.println(teacher);
        }
        sqlsession.close();
    }
}

分析

方式一:按照查询嵌套处理

getTeacher方法是这个方式的实现,可以看到mapper.xml文件中包含两个select语句,第一个是从teacher中查询,第二个是从student中查询
将两个查询语句嵌套起来

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

getTeacher2方法是这个方式的实现,可以看到resultMap中将students这个属性进行了嵌套表示,将从数据库中查出来的所有信息嵌套到resultMap中,其实就是做了一个sql结果集的映射

posted @ 2022-07-21 19:41  Oh,mydream!  阅读(479)  评论(0编辑  收藏  举报