【 MyBatis 】兩種方式實現多對一關聯查詢:子查詢、聯表查詢

什麼是多對一?舉個栗子

假如現在數據庫中有兩個表,一個是學生表student,一個是老師表teacher,現在的對應關係就是多個學生對應一個老師

當我們在查詢學生信息的時候,根據學生和老師的字段的關聯,同時查出每個學生對應的老師的信息。

具體代碼實現

兩個實體類

學生類和老師類

package com.robot.pojo;

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

    public Student() {
    }

    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher +
                '}';
    }
}
package com.robot.pojo;

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

    public Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = 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 + '\'' +
                '}';
    }
}

 兩個接口

package com.robot.dao;

import com.robot.pojo.Student;

import java.util.List;

public interface StudentMapper {

    public List<Student> getStudent();
}
package com.robot.dao;

import com.robot.pojo.Teacher;
import org.apache.ibatis.annotations.Param;

public interface TeacherMapper {

    Teacher getTeacher(@Param("tid")int id);
}

編寫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.robot.dao.StudentMapper">

    <select id="getStudent" resultMap="StudentToTeacher">
        select * from student
    </select>

    <resultMap id="StudentToTeacher" type="student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
<!--        複雜的屬性需要單獨處理,對象:association 集合:collection-->
        <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="teacher">
        select * from mybatis.teacher where id=#{id}
    </select>
</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.robot.dao.StudentMapper">

    <select id="getStudent" resultMap="StudentTeacher">
        select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t where s.tid = t.id
    </select>

    <resultMap id="StudentTeacher" type="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>

</mapper>

修改核心配置文件

修改核心配置文件中的mappers映射,映射到對應的兩個xml文件

<mappers>
    <mapper resource="com/robot/dao/StudentMapper.xml"/>
</mappers>

測試

@Test
public void getStudentTest() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> studentList = studentMapper.getStudent();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

預期的結果就是通過查詢學生的信息,從而將每個學生對應的老師的信息也查詢出來

 以上都是在搭建好MyBatis的運行環境後,才能測試成功

總結

聯表查詢是根據結果再進行查詢,比較容易理解,而且主要使用SQL語句,可以先在命令行中進行調試,成功後再編寫xml

子查詢更不容易理解,而且如果出錯的話,也不容易調錯排查

所以還是使用聯表查詢更容易些

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章