java学习总结(四)MyBatis多表

一、多表结构

学生表、班级表、课程表、班级课程表

二、一对一

一个学生只属于一个班级。

查询:id name age gender banjiName

sql 复制代码
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;
sql 复制代码
public class Student{
    private Integer id;
    private String name;
    private Integer age;
    private Banji banji;
}


MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:

  1. property:对象属性的名称
  2. javaType:对象以昂属性的类型
  3. column:数据库中字段的名称(也可能是起的别名)
sql 复制代码
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关联查询加载时机

  1. 直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
  2. 侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询
  3. 深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句
    延迟加载需要把mybatis版本号改为:3.5.1

2.全局延迟配置

在MyBatis核心配置类中添加标签

sql 复制代码
<settings>
    <!-- 延迟加载总开关 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 侵入式延迟加载开关 -->
    <setting name="aggressiveLazyLoading" value="true"/>
</settings>

(aggressiveLazyLoading)侵入式延迟加载为true, 在3.4.1之后的版本(aggressiveLazyLoading)侵入式延迟加载默认值为false

StudentMapper.xml

sql 复制代码
<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_id
    FROM student
</select>

BanjiMapper.xml

sql 复制代码
<select id="selectById" resultType="Banji">
    SELECT * FROM banji WHERE id=#{id}
</select>
1.直接加载

直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句

默认情况的延迟加载

sql 复制代码
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>

延迟加载的默认设置是直接加载

延迟加载默认情况下是关闭状态(false),延迟加载相当于总闸,总闸是关闭的那么侵入式延迟加载即使是true也不会起作用。

2.侵入式延迟加载

侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情时,就会执行关联对象的查询

sql 复制代码
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
sql 复制代码
@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();
    }
}
sql 复制代码
@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();
    }
}
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习