一、多表结构
学生表、班级表、课程表、班级课程表
二、一对一
一个学生只属于一个班级。
查询: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;
}

MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:
- 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);}
}
Student [id=1, name=张三, age=21, gender=男, banji=Banji [id=1, name=java1807]]
Student [id=2, name=zhangsan, age=12, gender=男, banji=Banji [id=1, name=java1807]]
Student [id=4, name=王五2, age=12, gender=男, banji=Banji [id=2, name=java1812]]
二、一对多


三、多对多
多对多其实就是分解为两个一对多。

四、懒加载(延迟加载)
1.什么是懒加载
顾名思义,懒加载就是懒得加载,只有使用的时候才进行加载。其实,懒加载也加延迟加载,主要以应用与Mybatis的关联查询,按照设置的延迟规则,推迟对延迟对关联对象的select查询,例如,我们在用Mybatis进行一对多的时候,先查询出一方,当程序需要多方数据时,mybatis会再次发出sql语句进行查询, 减轻了对我们数据库的压力。Mybatis的延迟加载,只对关联对象有延迟设置。
MyBatis关联查询加载时机
- 直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
- 侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询
- 深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句
延迟加载需要把mybatis版本号改为:3.5.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();}
}