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 小时前
【C++】现代C++的新特性constexpr,及其在C++14、C++17、C++20中的进化
linux·c++·人工智能·学习·机器学习·c++20·c++40周年
小苏兮4 小时前
【把Linux“聊”明白】编译器gcc/g++与调试器gdb/cgdb:从编译原理到高效调试
java·linux·运维·学习·1024程序员节
im_AMBER4 小时前
React 11 登录页项目框架搭建
前端·学习·react.js·前端框架
py有趣11 小时前
LeetCode算法学习之两数之和 II - 输入有序数组
学习·算法·leetcode
BreezeJuvenile12 小时前
外设模块学习(15)——MQ-2烟雾气体传感器(STM32)
stm32·单片机·学习·mq-2·烟雾气体传感器
XH1.14 小时前
学习RT-thread(RT-thread定时器)
stm32·单片机·学习
2301_7965125215 小时前
Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
java·学习·rust
故里213015 小时前
学习前端记录(二)21-40
学习
ThreeYear_s15 小时前
电力电子技术学习路径与FPGA/DSP技术结合方向(gemini生成)
学习·fpga开发
好奇龙猫16 小时前
【生活相关-日语-日本-入国&出国-海关&市役所(4)-办理手续】
学习·生活