1. 程式人生 > 實用技巧 >Mybatis 實現多對一和一對多的資料庫操作

Mybatis 實現多對一和一對多的資料庫操作

Mybatis 實現多對一和一對多的資料庫操作

第一步:建立對應資料庫表:

CREATE TABLE `teacher` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '傅老師'); 

建立一個老師表並插入一個老師(注意建立和插入要分開執行)

CREATE TABLE `student` (
  `id` INT
(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); INSERT
INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小紅', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小張', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

建立一個學生表並插入五個學生(注意建立和插入要分開執行)

第二步:建立pojo實體類:

Teacher:

package com.xiaofu.pojo;

public class Teacher {
    private int id;
    private String name;
    //無參構造
    public Teacher() {
    }
    //有參構造
    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }

    //get set 方法
    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;
    }
    
    //重寫toString
    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Student:

package com.xiaofu.pojo;

public class Student {
    private int id;
    private String name;
    //學生需要關聯一個老師 所以這裡封裝一個Teacher型別
    private Teacher teacher;
    //無參構造
    public Student() {
    }
    //有參構造
    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }
    //get set 方法
    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;
    }
    //重寫toString
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher +
                '}';
    }
}

第三步:建立介面:

第四步:建立實現介面的Mapper.xml:

第五步:在核心配置檔案中註冊 寫好的Mapper.xml:

第六步:實現多對一:

package com.xiaofu.dao;
import com.xiaofu.pojo.Student;
import java.util.List;

public interface StudentMapper {
    //查詢所有的學生資訊及對應老師的資訊(多對一)
    List<Student> getStudent();
}

在StudentMapper中編寫一個介面來完成多對一的查詢

然後在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.xiaofu.dao.StudentMapper">
<!--    查詢所有的學生資訊及對應老師的資訊(多對一)-->
<!--    第一種解決方式:按照查詢巢狀處理-->
<!--    先查出所有的學生-->
    <select id="getStudent" resultMap="StudentTeacher">
        select * from student
    </select>
<!-- resultMap 結果集對映 這裡的id 對應上面的resultMap   -->
    <resultMap id="StudentTeacher" type="com.xiaofu.pojo.Student">
        <result property="id" column="id"/> <!--模型類中的id(property)對應查出來的id(column)-->
        <result property="name" column="name"/><!--模型類中的name(property)對應查出來的name(column)-->
        <!--模型類中的teacher對應下面的查詢語句  -->
        <!--為什麼呢?因為column="tid" 被傳到了下面查詢語句的#{tid} javaType 確定了欄位的型別 select="getTeacher" 執行了下面的查詢語句 -->
        <association property="teacher" column="tid" javaType="com.xiaofu.pojo.Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="com.xiaofu.pojo.Teacher">
        select * from teacher where id = #{tid}
    </select>

</mapper>

第二種查詢方式:按照結果巢狀處理:

<?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.xiaofu.dao.StudentMapper">
<!--    查詢所有的學生資訊及對應老師的資訊(多對一)-->
<!--    第二種解決方式:按照結果巢狀處理-->
    <select id="getStudent" resultMap="StudentTeacher">
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid = t.id
    </select>
<!-- resultMap 結果集對映 這裡的id 對應上面的resultMap   -->
    <resultMap id="StudentTeacher" type="com.xiaofu.pojo.Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <!-- 因為teacher對應的是一個物件 所以在對映對應的內容   -->
            <association property="teacher" javaType="com.xiaofu.pojo.Teacher">
                <result property="name" column="tname"/>
            </association>
    </resultMap>

</mapper>

編寫測試類:

    @Test
    public void getlist(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);


        List<Student> list = mapper.getStudent();

        for (Student student : list) {
            System.out.println(student);
        }
        sqlSession.close();
    }

分別執行一下:

都查了出來。

第七步:一對多:

做一對多需要先更改一下實體類:

Sutdent:

package com.xiaofu.pojo;

public class Student {
    private int id;
    private String name;
    //學生需要關聯一個老師 所以這裡封裝一個Teacher型別
    private int tid;

    public Student() {
    }

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

    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 int getTid() {
        return tid;
    }

    public void setTid(int tid) {
        this.tid = tid;
    }

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

Teacher:

package com.xiaofu.pojo;

import java.util.List;

public class Teacher {
    private int id;
    private String name;
    //一個老師擁有多個學生
    private List<Student> students;

    public Teacher() {
    }

    public Teacher(int id, String name, List<Student> students) {
        this.id = id;
        this.name = name;
        this.students = 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 List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", students=" + students +
                '}';
    }
}

在TecherMapper下寫一個介面:

package com.xiaofu.dao;

import com.xiaofu.pojo.Teacher;

public interface TeacherMapper {

    //獲取指定老師下的所有學生(及老師的資訊和學生的資訊)
    Teacher getTeacher(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.xiaofu.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="com.xiaofu.pojo.Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
           <!--複雜的屬性,我們需要單獨處理 物件:association 集合:collection
           javaType=“ ” 指定屬性型別!
           集合中的泛型資訊,我們使用ofType獲取
           -->
            <collection property="students" ofType="com.xiaofu.pojo.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 Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaofu.dao.TeacherMapper">
    <select id="getTeacher" resultMap="TeacherStudent">
        select * from teacher where id = #{tid}
    </select>

    <resultMap id="TeacherStudent" type="com.xiaofu.pojo.Teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudent"/>
    </resultMap>

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


</mapper>

編寫測試類:

 @Test
    public void getlist(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);


        sqlSession.close();
    }

分別執行一下:

都查出來了