目录

关联映射

一、创建表结构

1. 学生表

2. 老师表

 二、一般项目用

创建实体类:

mapping:

Dao层

测试:

三、关联映射

1. 一对一、多对一

$$1.第一种形式  连表查询

创建实体类:

mapping层:

Dao层:

测试:

$$2.第二种形式  分步查询

创建实体类:

mapping层:

Dao层:

测试:

2. 一对多

$$1. 第一种形式:按照结果嵌套处理

创建实体类

mapping层:

 Dao层:

测试:

$$2.第二种形式:按照查询分步处理

创建实体类:

mapping层:

Dao层:

测试:


关联映射

一、创建表结构

1. 学生表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `t_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', '男', 18, 1);
INSERT INTO `student` VALUES (2, '李四', '女', 18, 1);
INSERT INTO `student` VALUES (3, '王五', '男', 18, 1);
INSERT INTO `student` VALUES (4, '小白', '女', 18, 1);
INSERT INTO `student` VALUES (5, '小黑', '男', 18, 1);
INSERT INTO `student` VALUES (6, '小红', '女', 20, 2);
INSERT INTO `student` VALUES (7, '小李', '男', 20, 2);
INSERT INTO `student` VALUES (8, '小张', '女', 20, 2);
INSERT INTO `student` VALUES (9, '小赵', '男', 20, 2);
INSERT INTO `student` VALUES (10, '小王', '女', 20, 2);

SET FOREIGN_KEY_CHECKS = 1;

 

2. 老师表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Tname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '张老师');
INSERT INTO `teacher` VALUES (2, '李老师');

SET FOREIGN_KEY_CHECKS = 1;

 二、一般项目用

select student.*,teacher.* from student left join teacher on student.t_id=teacher.id 

 一般项目用这种就行。

IDEA:

创建实体类:

属性对应结果列名

private Integer id;
    private String Sname;
    private String sex;
    private String age;
    private String t_id;
    private String Tname;

然后生成改写器与访问器,toString。

mapping:

<select id="findStudentTeacher" resultType="com.qcby.entity.StudentTeacher">
        select student.*,teacher.* from student left join teacher on student.t_id=teacher.id
    </select>

Dao层

List<StudentTeacher> findStudentTeacher();

测试:

@Test
    public void findStudentTeacher(){
        List<StudentTeacher> studentTeachers = mapper.findStudentTeacher();
        for(StudentTeacher s:studentTeachers){
            System.out.println(s.toString());
        }
    }

三、关联映射

1. 一对一、多对一

$$1.第一种形式  连表查询
select student.*,teacher.* from student left join teacher on student.t_id=teacher.id 
创建实体类:
public class Student {

    private Integer id;
    private String Sname;
    private String sex;
    private Integer age;
    private Integer t_id;
    //这个是重点
    private Teacher teacher;
}

然后生成改写器与访问器,toString。

public class Teacher {
    private Integer id;
    private String Tname;
}
mapping层:
<select id="findStudentTeacher" resultMap="studentTeacher">
        select student.*,teacher.* from student left join teacher on student.t_id=teacher.id
    </select>
    <resultMap id="studentTeacher" type="com.qcby.entity.Student">
        <id  column="id" property="id"></id>
        <result column="Sname" property="Sname"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <result column="t_id" property="t_id"/>
<!--       association专门处理复杂对象 -->
        <association property="teacher" javaType="com.qcby.entity.Teacher">
            <id property="id" column="id"/>
            <result property="Tname" column="Tname"/>
        </association>
    </resultMap>

复杂的属性我们需要单独去处理    对象:association  集合:collection 

property="teacher"       -- student类当中的关联字段

javaType="com.javen.model.Teacher" 为复杂属性设置类类型

 查询每个学生的对应的老师

Dao层:
 List<Student> findStudentTeacher();
测试:
@Test
    public void findStudentTeacher(){
        List<Student> students = mapper.findStudentTeacher();
        for(Student s:students){
            System.out.println(s.toString());
        }
    }

$$2.第二种形式  分步查询
select * from student
select * from teacher where id=t_id
创建实体类:

(实体类与第一种形式相同)

mapping层:
<select id="findStudentTeacher1" resultMap="StudentTeacher1">
        select * from student
    </select>
    <resultMap id="StudentTeacher1" type="com.qcby.entity.Student">
        <id  column="id" property="id"></id>
        <result column="Sname" property="Sname"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <result column="t_id" property="t_id"/>
        <association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher"
                     select="com.qcby.dao.TeacherDao.findTeacherById"/>
<!--        select调用-->
    </resultMap>


<select id="getTeacher" resultType="com.qcby.entity.Teacher">
    select  * from  teacher where id = #{t_id};    <!-- #{id}; 可以写任何东西,因为会自动匹配 t_id -->
</select>

 TeacherMapper:

<select id="findTeacherById" resultType="com.qcby.entity.Teacher">
        select * from teacher where id=#{t_id}
    </select>

select="getTeacher" :--  调用下一个查询语句

 column="t_id" --  两个表的关联字段

Dao层:

TeacherDao:

Teacher findTeacherById(Integer id);
测试:
@Test
    public void findStudentTeacher1(){
        List<Student> students = mapper.findStudentTeacher1();
        for(Student s:students){
            System.out.println(s.toString());
        }
    }

2. 一对多

查询每个老师有多少学生

$$1. 第一种形式:按照结果嵌套处理
select student.*,teacher.* from student left join teacher on student.t_id=teacher.id
创建实体类
public class Student {

    private Integer id;
    private String Sname;
    private String sex;
    private Integer age;
    private Integer t_id;
    
}

这里需要将student类当中关于teacher的字段删除。

public class Teacher {
    private Integer id;
    private String Tname;
    //这个一定要有
    private List<Student> students;
}
mapping层:
<select id="TeacherStudent" resultMap="TeacherStudentMap">
        select student.*,teacher.* from student left join teacher on student.t_id=teacher.id
    </select>
    <resultMap id="TeacherStudentMap" type="com.qcby.entity.Teacher">
        <id column="id" property="id"/>
        <result column="Tname" property="Tname"/>
        <collection property="students" ofType="com.qcby.entity.Student">
            <id  column="id" property="id"></id>
            <result column="Sname" property="Sname"/>
            <result column="sex" property="sex"/>
            <result column="age" property="age"/>
            <result column="t_id" property="t_id"/>
        </collection>
    </resultMap>

复杂的属性我们需要单独去处理

对象:association 集合:collection

在集合中的泛型信息,我们使用ofType获取

 Dao层:
List<Teacher> TeacherStudent();
测试:
@Test
    public void TeacherStudent(){
        List<Teacher> teachers = mapper.TeacherStudent();
        for(Teacher t:teachers){
            System.out.println(t.toString());
        }
    }
$$2.第二种形式:按照查询分步处理
创建实体类:

不用变

mapping层:
<select id="TeacherStudent1" resultMap="TeacherStudentMap1">
        select * from teacher
    </select>
    <resultMap id="TeacherStudentMap1" type="com.qcby.entity.Teacher">
        <id column="id" property="id"/>
        <result column="Tname" property="Tname"></result>
        <collection property="students" column="id" ofType="com.qcby.entity.Student"
                    select="com.qcby.dao.StudentDao.findStudentByTid"/>
    </resultMap>

StudentMapper:

<select id="findStudentByTid" resultType="com.qcby.entity.Student" parameterType="int" >
        select * from student where t_id=#{id}
    </select>
Dao层:
List<Teacher> TeacherStudent1();

StudentDao:

List<Student> findStudentByTid(int t_id);
测试:
@Test
    public void TeacherStudent1(){
        List<Teacher> teachers = mapper.TeacherStudent1();
        for(Teacher t:teachers){
            System.out.println(t.toString());
        }
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐