网站主流系统,编程做网站,制作精美网站建设服务周到,江门网站seo推广目录
一、创建表结构
1. 学生表 (student)
2. 教师表 (teacher)
二、一对一 多对一 关系映射
1. 连表查询#xff08;直接查询#xff09;
2. 分步查询#xff08;懒加载#xff09;
三、一对多 关系映射
1. 直接查询
2. 分步查询
四、MyBatis 延迟加载 多对一 关系映射
1. 连表查询直接查询
2. 分步查询懒加载
三、一对多 关系映射
1. 直接查询
2. 分步查询
四、MyBatis 延迟加载懒加载
1. 配置全局懒加载
2. 配置分步查询的懒加载
3. 测试代码
4. 强制立即加载eager 一、创建表结构
在 MyBatis 进行关联映射时我们需要创建 student学生表和 teacher教师表并建立它们之间的关联。
1. 学生表 (student)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS 0;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;INSERT INTO student VALUES (1, 张三, 男, 18, 1);
INSERT INTO student VALUES (2, 李四, 女, 18, 1);
...SET FOREIGN_KEY_CHECKS 1;2. 教师表 (teacher)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS 0;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;INSERT INTO teacher VALUES (1, 张老师);
INSERT INTO teacher VALUES (2, 李老师);SET FOREIGN_KEY_CHECKS 1;二、一对一 多对一 关系映射
1. 连表查询直接查询
实体类
public class Student {private Integer id;private String Sname;private String sex;private Integer age;private Integer t_id;private Teacher teacher; // 关联的教师对象
}public class Teacher {private Integer id;private String Tname;
}查询语句
select idgetStudent1 resultMapStudentTeacher1SELECT student.id, student.Sname, teacher.TnameFROM studentLEFT JOIN teacher ON student.t_id teacher.id
/selectresultMap idStudentTeacher1 typecom.qcby.entity.Studentresult propertyid columnid/result propertySname columnSname/association propertyteacher javaTypecom.qcby.entity.Teacherresult propertyid columnid/result propertyTname columnTname//association
/resultMap2. 分步查询懒加载
select idgetStudent resultMapStudentTeacherSELECT * FROM student;
/selectresultMap idStudentTeacher typecom.qcby.entity.Studentassociation propertyteacher columnt_id javaTypecom.qcby.entity.Teacher selectgetTeacher/
/resultMapselect idgetTeacher resultTypecom.qcby.entity.TeacherSELECT * FROM teacher WHERE id #{t_id};
/select三、一对多 关系映射
1. 直接查询
实体类
public class Teacher {private Integer id;private String Tname;private ListStudent students; // 一个老师有多个学生
}查询语句
select idgetTeacher resultMapTeacherStudentSELECT teacher.id, teacher.Tname, student.SnameFROM teacherLEFT JOIN student ON student.t_id teacher.id;
/selectresultMap idTeacherStudent typecom.qcby.entity.Teachercollection propertystudents ofTypecom.qcby.entity.Studentresult propertySname columnSname//collection
/resultMap2. 分步查询
select idgetTeacher resultMapTeacherStudent2SELECT * FROM teacher;
/selectresultMap idTeacherStudent2 typecom.qcby.entity.Teachercollection propertystudents columnid ofTypecom.qcby.entity.Student selectgetStudentByTeacherId /
/resultMapselect idgetStudentByTeacherId resultTypecom.qcby.entity.StudentSELECT * FROM student WHERE t_id #{t_id};
/select四、MyBatis 延迟加载懒加载
1. 配置全局懒加载
settingssetting namelazyLoadingEnabled valuetrue/setting nameaggressiveLazyLoading valuefalse/
/settings2. 配置分步查询的懒加载
association propertyteacher columnt_id javaTypecom.qcby.entity.Teacherselectcom.qcby.dao.TeacherDao.getTeacher fetchTypelazy/3. 测试代码
Test
public void getStudent() {ListStudent studentList mapper.getStudent();for (Student student : studentList) {System.out.println(student.getSex());}
}Test
public void getStudentWithTeacher() {ListStudent studentList mapper.getStudent();for (Student student : studentList) {System.out.println(student.getTeacher().getTname());}
}4. 强制立即加载eager
association propertyteacher columnt_id javaTypecom.qcby.entity.Teacherselectcom.qcby.dao.TeacherDao.getTeacher fetchTypeeager/五、总结
一对一 多对一 可以使用 连表查询 或 分步查询懒加载。一对多 关系可以使用 结果嵌套 或 查询嵌套。懒加载 需要在 MyBatis 配置文件 和 映射 XML 里配置。某些查询可以强制使用立即加载eager避免不必要的多次查询。