mybatis学习笔记三(关联关系)

Posted Hepc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis学习笔记三(关联关系)相关的知识,希望对你有一定的参考价值。

  学习mybatis的关联关系,主要注解在代码上,这里不做解释。配置文件一样的就不贴了

1.关联关系表创建(学生对应老师 多对一)

  学生老师表

 

 2.表对应的实体类

package com.home.entity;

/**
 * 此类是:学生
 * @author hpc
 * @2017年1月14日下午7:06:33
 */
public class Student {
    private Integer student_id;//学生id
    private String student_name;//学生名字
    private Integer student_number;//学生编号
    private Teacher student_teacher;//是哪个教师的学生
    public Integer getStudent_id() {
        return student_id;
    }
    public void setStudent_id(Integer student_id) {
        this.student_id = student_id;
    }
    public String getStudent_name() {
        return student_name;
    }
    public void setStudent_name(String student_name) {
        this.student_name = student_name;
    }
    public Integer getStudent_number() {
        return student_number;
    }
    public void setStudent_number(Integer student_number) {
        this.student_number = student_number;
    }
    public Teacher getStudent_teacher() {
        return student_teacher;
    }
    public void setStudent_teacher(Teacher student_teacher) {
        this.student_teacher = student_teacher;
    }
    @Override
    public String toString() {
        return "Student [student_id=" + student_id + ", student_name=" + student_name + ", student_number="
                + student_number + ", student_teacher=" + student_teacher + "]";
    }
}
package com.home.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * 此类是:老师
 * @author hpc
 * @2017年1月14日下午7:06:47
 */
public class Teacher {
    private Integer teacher_id;// 老师id
    private String teacher_name;// 老师名字
    private Integer teacher_number;// 老师编号
    private Set<Student> teacher_student = new HashSet<Student>();// 老师教过哪些学生
    
    public Integer getTeacher_id() {
        return teacher_id;
    }

    public void setTeacher_id(Integer teacher_id) {
        this.teacher_id = teacher_id;
    }

    public String getTeacher_name() {
        return teacher_name;
    }

    public void setTeacher_name(String teacher_name) {
        this.teacher_name = teacher_name;
    }

    public Integer getTeacher_number() {
        return teacher_number;
    }

    public void setTeacher_number(Integer teacher_number) {
        this.teacher_number = teacher_number;
    }

    public Set<Student> getTeacher_student() {
        return teacher_student;
    }

    public void setTeacher_student(Set<Student> teacher_student) {
        this.teacher_student = teacher_student;
    }

    @Override
    public String toString() {
        return "Teacher [teacher_id=" + teacher_id + ", teacher_name=" + teacher_name + ", teacher_number="
                + teacher_number + ", teacher_student=" + teacher_student + "]";
    }
    
}

3.核心主要是配置文件

<?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.home.entity.studentMapper"><!-- 命名空间,一定要是唯一的,只有这样才能定位到这个文件来 -->
    <!-- 多对一查询(多个学生对应一个老师) -->
    <!-- select的属性
        id:这个查找标签的唯一标识,通过id找到这条sql语句
        parameterType:传进来的参数类型
        resultMap:这条语句执行完,以什么形式返回结果集
     -->
    <select id="loadStudent" parameterType="int" resultMap="studentMap">
        select *
        from students as s join teachers as t
        on t.teacher_id=s.student_teacher
        where s.student_id=#{id}
    </select>
    <!-- 学生对象映射关系 -->
    <!--resultMap的属性
        type:以这个类型进行封装返回
        id:找到该resultMap标签的唯一标识
        resultMap的内部的标签介绍
        <id>专门用于映射主键的
        <result>普通属性映射
        <collection>集合属性映射
        <association>关系映射(1-1,1-n,n-1,n-n)
        <constructor>专门用于映射构造函数的标签
        <discriminator>鉴别器非常容易理 解,因为它的表现很像 Java 语言中的 switch 语句。
    -->
    <resultMap type="student" id="studentMap" >
        <!-- 主键映射 -->
        <id property="student_id" column="student_id" javaType="int"/>
        <!-- 普通属性映射 -->
        <!--  
        property:映射在这个属性上
        column:以这个列上的为参照
        javaType:以什么类型映射
        -->
        <result property="student_name" column="student_name" javaType="String"/>
        <result property="student_number" column="student_number" javaType="int"/>
        <!-- 关联关系映射 -->
        <association property="student_teacher" column="teacher_id" resultMap="teacherMap"/>
    </resultMap>
    <!-- 学生对象映射关系 -->
    <resultMap type="teacher" id="teacherMap">
        <id property="teacher_id" column="teacher_id" javaType="int"/>
        <result property="teacher_name" column="teacher_name" javaType="String"/>
        <result property="teacher_number" column="teacher_number" javaType="int"/>
    </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.home.entity.teacherMapper">
    <!-- teacher sql -->
    <select id="loadTeacher" parameterType="int" resultMap="teacherMapper">
        select *
        from teachers as t join students as s
        on s.student_teacher=t.teacher_id
        where teacher_id=#{teacher_id}
    </select>
    <resultMap type="teacher" id="teacherMapper">
        <id property="teacher_id" column="teacher_id" />
        <result property="teacher_name" column="teacher_name" />
        <result property="teacher_number" column="teacher_number" />
        <collection property="teacher_student" ofType="student">
            <id property="student_id" column="student_id" />
            <result property="student_name" column="student_name"
                javaType="String" />
            <result property="student_number" column="student_number"
                javaType="int" />
        </collection>
    </resultMap>
</mapper>

 4. 测试

package com.home.mybatis;

import java.io.IOException;

import org.apache.ibatis.session.SqlSession;

import com.home.entity.Student;
import com.home.entity.Teacher;

public class TestApp {
    public static void main(String[] args) throws IOException {
        // 我将获取session的代码封装成了一个工具类,直接用工具类来获取session
        SqlSession session = SessionUtils.getSession("mybatis.xml");
        String loadTeacher="com.home.entity.teacherMapper.loadTeacher";
        String loadStudent="com.home.entity.studentMapper.loadStudent";
        Teacher teacher = session.selectOne(loadTeacher,1);
        Student student = session.selectOne(loadStudent,1);
        System.out.println(student);
        System.out.println(teacher);
        // 将数据属性到数据中去
        session.commit();
        // 关闭session
        session.close();
    } 
}

5.结果

Student [student_id=4, student_name=hpc, student_number=1, student_teacher=Teacher [teacher_id=1, teacher_name=王老师, teacher_number=1, teacher_student=[]]]
Teacher [teacher_id=1, teacher_name=王老师, teacher_number=1, teacher_student=[Student [student_id=5, student_name=zll, student_number=2, student_teacher=null], Student [student_id=4, student_name=hpc, student_number=1, student_teacher=null]]]

 

以上是关于mybatis学习笔记三(关联关系)的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习笔记 关联关系

MyBatis:学习笔记——关联查询

Mybatis框架学习笔记

SSM框架MyBatis笔记 --- 表之间的关联关系;MyBatis事务;MyBatis缓存机制;ORM概述

mybatis学习笔记(11)-多对多查询

Java技术篇!硬核!阿里内部消化的Mybatis学习笔记