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();
    }
}
相关推荐
知远同学11 分钟前
docker学习笔记6-安装wordpress
笔记·学习
喜欢吃燃面1 小时前
数据结构之二叉树(4)
c语言·数据结构·c++·学习
朝九晚五ฺ2 小时前
【算法学习】递归、搜索与回溯算法(一)
数据结构·学习·算法·深度优先
今天也是元气满满的一天呢2 小时前
java学习之数据结构:四、树(代码补充)
java·数据结构·学习
LVerrrr5 小时前
Missashe考研日记-day30
学习·考研
羑悻的小杀马特5 小时前
【Linux篇章】Linux 进程信号1:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲信号产生和保存)
linux·运维·服务器·学习·操作系统·进程信号
蓝莓味柯基10 小时前
Python 学习路线与笔记跳转(持续更新笔记链接)
笔记·python·学习
Rytter11 小时前
Android逆向学习(八)Xposed快速上手(上)
android·学习
Kx…………11 小时前
Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
前端·学习·uni-app·实战·项目
等什么君!11 小时前
学习spring boot-拦截器Interceptor,过滤器Filter
java·spring boot·学习