MyBatis framework 03 realiza consultas relacionadas

1. Crear una tabla de base de datos
(1) Crear una tabla de profesores
Ejecutar sentencias SQL para crear una tabla de profesores t_teacher

CREATE TABLE `t_teacher` (
`t_id` int(11) NOT NULL AUTO_INCREMENT,
`t_name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

Inserte la descripción de la imagen aquí

(2) Crear tabla de estudiantes
Ejecutar declaración SQL para crear tabla de estudiantes t_student

CREATE TABLE `t_student` (
  `s_id` int(11) NOT NULL AUTO_INCREMENT,
  `s_name` varchar(30) DEFAULT NULL,
  `s_gender` varchar(10) DEFAULT NULL,
  `s_age` int(9) DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`s_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `t_student` VALUES('1','佟大为','男','20','1');
INSERT INTO `t_student` VALUES('2','李芳玉','女','20','1');
INSERT INTO `t_student` VALUES('3','郑大林','男','19','2');
INSERT INTO `t_student` VALUES('4','温晓辉','男','22','1');
INSERT INTO `t_student` VALUES('5','吴文静','女','18','2');
INSERT INTO `t_student` VALUES('6','肖文艳','女','20','3');
INSERT INTO `t_student` VALUES('7','杨文军','男','23','3');
INSERT INTO `t_student` VALUES('8','唐雨涵','女','20','2');
INSERT INTO `t_student` VALUES('','金雨欣','女','20','2');
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210310151909149.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RyaWV0,size_16,color_FFFFFF,t_70)

Inserte la descripción de la imagen aquí

(3) Crear tabla de clases
Ejecutar declaración SQL, crear tabla de clases t_class

CREATE TABLE `t_class` (
  `c_id` int(11) NOT NULL AUTO_INCREMENT,
  `c_name` varchar(20) DEFAULT NULL,
  `teacher_id` int(11) DEFAULT NULL,
PRIMARY KEY (`c_id`),
KEY `fk_teacher_id` (`teacher_id`),
CONSTRAINT `fk_teacher_id` FOREIGN KEY (`teacher_id`) REFERENCES `t_teacher` (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `t_class` VALUES ('1', '2020软件1班', '3');
INSERT INTO `t_class` VALUES ('2', '2020软件2班', '2');
INSERT INTO `t_class` VALUES ('3', '2020软件3班', '1');

Inserte la descripción de la imagen aquí
2. Cree una clase de entidad correspondiente a la tabla de la base de datos
(1) Cree una clase de entidad de profesor
Inserte la descripción de la imagen aquí

package net.tjl.mybatis.bean;
/**
 * 功能:教师实体类
 * 作者:谭金兰
 * 日期:2021年03月10日
 */

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

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    @Override
    public String toString() {
    
    
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

(2) Cree una clase de entidad de estudiante
Inserte la descripción de la imagen aquí

package net.tjl.mybatis.bean;
/**
 * 功能:学生实体类
 * 作者:谭金兰
 * 日期:2021年03月10日
 */

public class Student {
    
    
    private int id;
    private String name;
    private String gender;
    private int age;
    private Clazz clazz;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getGender() {
    
    
        return gender;
    }

    public void setGender(String gender) {
    
    
        this.gender = gender;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public Clazz getClazz() {
    
    
        return clazz;
    }

    public void setClazz(Clazz clazz) {
    
    
        this.clazz = clazz;
    }

    @Override
    public String toString() {
    
    
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", clazz=" + clazz.getName() +
                '}';
    }
}


(3) Cree una clase de entidad de clase
Inserte la descripción de la imagen aquí

package net.tjl.mybatis.bean;
/**
 * 功能:
 * 作者:谭金兰
 * 日期:2021年03月10日
 */

import java.util.List;

public class Clazz {
    
    
    private int id;
    private String name;
    private Teacher teacher;
    private List<Student> students;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Teacher getTeacher() {
    
    
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
    
    
        this.teacher = teacher;
    }

    public List<Student> getStudents() {
    
    
        return students;
    }

    public void setStudents(List<Student> students) {
    
    
        this.students = students;
    }

    @Override
    public String toString() {
    
    
        return "Clazz{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher.getName() +
                ", students=" + students +
                '}';
    }
}

Tres, cree un archivo de configuración de asignador de clases
Inserte la descripción de la imagen aquí

<?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="net.tjl.mybatis.mapper.ClazzMapper">
    <!--三表关联查询-->
    <select id="findById" parameterType="int" resultMap="clazzResultMap">
        SELECT * FROM t_teacher INNER JOIN t_class ON t_class.teacher_id = t_teacher.t_id
        INNER JOIN t_student ON t_class.c_id = t_student.class_id WHERE c_id = #{
    
    id};
    </select>

    <!--定义班级结果映射-->
    <resultMap id="clazzResultMap" type="Clazz">
        <result property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <!--一对一-->
        <association property="teacher" column="teacher_id" javaType="Teacher">
            <result property="id" column="t_id"/>
            <result property="name" column="t_name"/>
        </association>
        <!--一对多-->
        <collection property="students" ofType="Student">
            <result property="id" column="s_id"/>
            <result property="name" column="s_name"/>
            <result property="gender" column="s_gender"/>
            <result property="age" column="s_age"/>
            <association property="clazz" column="class_id" javaType="Clazz">
                <result property="name" column="c_name"/>
            </association>
        </collection>
    </resultMap>



    <!--通过嵌套查询实现一对一关联-->
    <select id="findAll" resultMap="clazzResultMap2">
        SELECT * FROM t_class;
    </select>

    <!--定义班级结果映射-->
    <resultMap id="clazzResultMap2" type="Clazz">
        <result property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <association property="teacher" column="teacher_id" javaType="Teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="Teacher">
       SELECT t_id id, t_name name FROM t_teacher WHERE t_id = #{
    
    id};
    </select>
</mapper>

4. Modificar el archivo de configuración de MyBatis
. Configurar los nombres de categoría de entidad de clase, profesor y alumno en la configuración, y el archivo de configuración del mapeador de clases.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
5. Definir la interfaz de mapeo de clases ClazzMapper
Inserte la descripción de la imagen aquí

package net.tjl.mybatis.mapper;


import net.tjl.mybatis.bean.Clazz;

import java.util.List;

public interface ClazzMapper {
    
    
    Clazz findById(int id);
    List<Clazz>findAll();
}

Seis, crea una clase de prueba TestClazzMapper
Inserte la descripción de la imagen aquí

package net.tjl.mapper;

import net.tjl.mybatis.bean.Clazz;
import net.tjl.mybatis.bean.Student;
import net.tjl.mybatis.mapper.ClazzMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

/**
 * 功能:测试班级映射器接口
 * 作者:谭金兰
 * 日期:2021年03月10日
 */
public class TestClazzMapper {
    
    

    private SqlSession sqlSession; // SQL会话
    private ClazzMapper clazzMapper; // 班级映射器

    @Before
    public void init() {
    
    
        try {
    
    
            // 读取MyBatis配置文件作为字符输入流
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            // 基于MyBatis配置文件构建SQL会话工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
            // 利用SQL会话工厂获取SQL会话
            sqlSession = factory.openSession();
            // 利用SQL会话获取班级映射器对象
            clazzMapper = sqlSession.getMapper(ClazzMapper.class);
            System.out.println("sqlSession对象已创建");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    @Test
    public void testFindById() {
    
    
        int id = 1;
        Clazz clazz = clazzMapper.findById(id);
        System.out.println(clazz);

        System.out.println("班级编号[" + id + "]的学生:");
        List<Student> students = clazz.getStudents();
        students.forEach(student -> System.out.println(student));
    }

    @Test
    public void testFindAll() {
    
    
        List<Clazz> clazzes = clazzMapper.findAll();
        clazzes.forEach(clazz -> System.out.println(clazz));
    }

    @After
    public void destroy() {
    
    
        // 关闭SQL会话
        sqlSession.close();
        //提示用户SQL会话对象关闭
        System.out.println("sqlSession对象已关闭");
    }
}

(1) Ejecute el método de prueba testFindById () para ver los resultados
Inserte la descripción de la imagen aquí
(2) Ejecute el método de prueba testFindAll () para ver los resultados
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/triet/article/details/114635836
Recomendado
Clasificación