【mybatis】关联映射
这里需要将student类当中关于teacher的字段删除。-- student类当中的关联字段。然后生成改写器与访问器,toString。然后生成改写器与访问器,toString。复杂的属性我们需要单独去处理。:--调用下一个查询语句。复杂的属性我们需要单独去处理。在集合中的泛型信息,我们使用。查询每个学生的对应的老师。(实体类与第一种形式相同)--两个表的关联字段。一般项目用这种就行。为复杂属
目录
关联映射
一、创建表结构
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());
}
}

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

所有评论(0)