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();
    }
}
相关推荐
悠哉悠哉愿意27 分钟前
【数学建模学习笔记】机器学习分类:KNN分类
学习·机器学习·数学建模
四谎真好看33 分钟前
Java 学习笔记(进阶篇2)
java·笔记·学习
程序猿炎义43 分钟前
【NVIDIA AIQ】自定义函数实践
人工智能·python·学习
小陈phd1 小时前
高级RAG策略学习(四)——上下文窗口增强检索RAG
人工智能·学习·langchain
Jayyih2 小时前
嵌入式系统学习DAY28(网络编程)
网络·学习·tcp/ip
dbdr09013 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
大白的编程日记.3 小时前
【Linux学习笔记】信号的深入理解之软件条件产生信号
linux·笔记·学习
buyutang_3 小时前
C/C++ Linux系统编程:线程控制详解,从线程创建到线程终止
linux·c语言·c++·学习
yzx9910133 小时前
图像去雾:从暗通道先验到可学习融合——一份可跑的 PyTorch 教程
人工智能·pytorch·学习
练习时长两年半的Java练习生(升级中)4 小时前
从0开始学习Java+AI知识点总结-30.前端web开发(JS+Vue+Ajax)
前端·javascript·vue.js·学习·web