当前位置: 首页 > article >正文

java学习总结(四)MyBatis多表

一、多表结构

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

二、一对一

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

查询: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标签可以使用的属性如下:
  1. property:对象属性的名称
  2. javaType:对象以昂属性的类型
  3. 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关联查询加载时机
  1. 直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句
  2. 侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询
  3. 深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句
延迟加载需要把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_id
    FROM 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();
    }
}


http://www.kler.cn/a/588087.html

相关文章:

  • linux命令-wget与curl命令详解
  • 【Agent】OpenManus-Agent-BaseAgent详细分析
  • 85.HarmonyOS NEXT 网络请求与数据处理:构建可靠的数据层
  • 剖析sentinel的限流和熔断
  • “driver-class-name: com.mysql.cj.jdbc.Driver“报错问题的解决
  • Gitee重新远程连接仓库(Linux)
  • 【Redis】缓存穿透、缓存击穿、缓存雪崩
  • Leetcode2272:最大波动的子字符串
  • 文档搜索引擎
  • Gluten 项目贡献指南
  • 行为模式---模版模式
  • S32K144入门笔记(十):TRGMUX的初始化
  • 区块链知识点2
  • 3.水中看月
  • IP 地址
  • 一级运动员最小几岁·棒球1号位
  • 使用OpenResty(基于Nginx和Lua)优化Web服务性能
  • k8s系统学习路径
  • C语言之 条件编译和预处理指令
  • ospf单区域