一、多表结构
学生表、班级表、课程表、班级课程表
二、一对一
一个学生只属于一个班级。
查询:id name age gender banjiName
SELECT s.id,s.`name`,s.age,s.gender,b.id AS banjiId,b.name AS banjiName
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id;
public class Student{private Integer id;private String name;private Integer age;private Banji banji;
}

- property:对象属性的名称
- javaType:对象以昂属性的类型
- column:数据库中字段的名称(也可能是起的别名)
public void testOne2One() {SqlSession sqlSession = MyBatisUtil.getSqlSession();// 最终返回的是一个学生的集合,但是Student里面是有一个banji对象,里面保存了这个学生对应的班级信息List<Student> list = sqlSession.selectList("student.selectStudentBanjiInfo");for (Student student : list) {System.out.println(student);}
}
二、一对多


三、多对多

四、懒加载(延迟加载)
1.什么是懒加载
- 直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
- 侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询
- 深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句
2.全局延迟配置
在MyBatis核心配置类中添加标签
<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延迟加载开关 --><setting name="aggressiveLazyLoading" value="true"/>
</settings>
(aggressiveLazyLoading)侵入式延迟加载为true, 在3.4.1之后的版本(aggressiveLazyLoading)侵入式延迟加载默认值为false
StudentMapper.xml
<resultMap id="studentMap" type="Student"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><result column="gender" property="gender"/><result column="banji_id" property="banjiId"/><!--<association property="banji" javaType="Banji"><id column="banjiId" property="id"/><result column="banjiName" property="name"/></association>--><association property="banji" column="banji_id" select="banji.selectById" javaType="Banji"/>
</resultMap><select id="selectAll" resultMap="studentMap">SELECT id, name, age, gender, banji_idFROM student
</select>
BanjiMapper.xml
<select id="selectById" resultType="Banji">SELECT * FROM banji WHERE id=#{id}
</select>
1.直接加载
直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
默认情况的延迟加载
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
延迟加载的默认设置是直接加载
延迟加载默认情况下是关闭状态(false),延迟加载相当于总闸,总闸是关闭的那么侵入式延迟加载即使是true也不会起作用。
2.侵入式延迟加载
侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情时,就会执行关联对象的查询
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
@Test
public void testSelectAll() throws IOException {SqlSession sqlSession = MyBatisUtils.getSqlSession();List<Student> list = sqlSession.selectList("student.selectAll");for (Student student : list) {//System.out.println(student);//student.getName();}
}
@Test
public void testSelectAll() throws IOException {SqlSession sqlSession = MyBatisUtils.getSqlSession();List<Student> list = sqlSession.selectList("student.selectAll");for (Student student : list) {//System.out.println(student);student.getName();}
}