MyBatis的⾼级映射及延迟加载

news/2024/12/29 7:09:09/

MyBatis的⾼级映射及延迟加载

  • 一、多对一
    • 1.方式一:级联属性映射
    • 2.方式二:association
    • 3.方式三:分步查询
  • 二、一对多
    • 1.方式一:collection
    • 2.方式二:分步查询
  • 三、延迟加载(懒加载)
    • 1.分步查询的优点
    • 2.延迟加载(懒加载)


  • 开始写代码前先了解数据库表的结构。
    在这里插入图片描述

一、多对一

  • 以ArticleDetail表(主键)为多,Article表为一。

1.方式一:级联属性映射

  • 编写pojo实体类

    package com.gdb.mybatis.advancedMapping.pojo;public class ArticleDetail {private Integer id;private String content;private Article article; //多对一,多的为主表时,在主表中添加⼀个属性:Article article; //有参构造、无参构造、toString、set和get方法...
    }
    
  • 编写映射文件Article

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.gdb.mybatis.advancedMapping.mapper.ArticleDetailMapper"><resultMap id="ArticleDetailResultMap" type="ArticleDetail" ><id property="id" column="id"/><result property="content" column="content"/><result property="article.id" column="Aid"/><result property="article.userId" column="user_id"/><result property="article.title" column="title"/><result property="article.summary" column="summary"/><result property="article.readCount" column="read_count"/><result property="article.createTime" column="create_time"/><result property="article.updateTime" column="update_time"/></resultMap><select id="selectArticleDetailForId" resultMap="ArticleDetailResultMap">selectd.*, a.id Aid, a.user_id, a.summary, a.title, a.read_count, a.create_time, a.update_timefromarticle_detail d left join article a on d.article_id = a.idwhered.id = #{id}</select>
    </mapper>
    
  • 测试程序

    @org.junit.Test
    public void TestSelectArticleDetailForId(){SqlSession sqlSession = SqlSessionUtil.openSqlsession();ArticleDetailMapper mapper = sqlSession.getMapper(ArticleDetailMapper.class);ArticleDetail articleDetail = mapper.selectArticleDetailForId(1);System.out.println(articleDetail);System.out.println(articleDetail.getArticle());sqlSession.close();
    }
    
  • 结果展示
    在这里插入图片描述

2.方式二:association

  • 其他位置都不需要修改,只需要修改resultMap中的配置:association即可。
<resultMap id="ArticleDetailResultMap" type="ArticleDetail" ><id property="id" column="id"/><result property="content" column="content"/><association property="article" javaType="Article"><id property="id" column="id"/><result property="id" column="Aid"/><result property="userId" column="user_id"/><result property="title" column="title"/><result property="summary" column="summary"/><result property="readCount" column="read_count"/><result property="createTime" column="create_time"/><result property="updateTime" column="update_time"/></association>
</resultMap>

3.方式三:分步查询

  • 其他位置不需要修改,只需要修改以及添加以下三处:

    • 第一处:在ArticleMapper接⼝中添加⽅法。
    package com.gdb.mybatis.advancedMapping.mapper;import com.gdb.mybatis.advancedMapping.pojo.Article;public interface ArticleMapper {Article selectArticleForId(Integer id);
    }
    
    • 第二处:在ArticleMapper.xml⽂件中进⾏配置
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.gdb.mybatis.advancedMapping.mapper.ArticleMapper"><select id="selectArticleForId" resultType="Article">select * from article where id = #{id};</select>
    </mapper>
    
    • 第三处:在ArticleDetailMapper.xml文件中的association标签中select位置填写sqlId。sqlId=namespace+id。其中column属性作为这条⼦sql语句的条件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.gdb.mybatis.advancedMapping.mapper.ArticleDetailMapper"><resultMap id="ArticleDetailResultMap" type="ArticleDetail" ><id property="id" column="id"/><result property="content" column="content"/><association property="article" select="com.gdb.mybatis.advancedMapping.mapper.ArticleMapper.selectArticleForId" column="article_id"/></resultMap><select id="selectArticleDetailForId" resultMap="ArticleDetailResultMap">select * from article_detail where id = #{id};</select>
    </mapper>
    

二、一对多

  • ⼀对多的实现,通常是在⼀的⼀⽅中有List集合属性。

    package com.gdb.mybatis.advancedMapping.pojo;import java.util.Date;
    import java.util.List;public class Article {private Integer id;private Integer userId;private String title;private String summary;private Integer readCount;private Date createTime;private Date updateTime;private List<ArticleDetail> articleDetailList;//有参构造、无参构造、toString、set和get方法...
    }
    

1.方式一:collection

  • ArticleMapper中添加方法

    public interface ArticleMapper {Article selectArticleForId(Integer id);
    }
    
  • 编写ArticleMapper.xml映射文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.gdb.mybatis.advancedMapping.mapper.ArticleMapper"><resultMap id="ArticleResultMap" type="Article"><id property="id" column="id"/><result property="userId" column="user_id"/><result property="title" column="title"/><result property="summary" column="summary"/><result property="readCount" column="read_count"/><result property="createTime" column="create_time"/><result property="updateTime" column="update_time"/><collection property="articleDetailList" ofType="ArticleDetail"><id property="id" column="Did"/><result property="content" column="content"/></collection></resultMap><select id="selectArticleForId" resultMap="ArticleResultMap">selecta.*, d.id Did, d.contentfromarticle a left join article_detail d on a.id = d.article_idwhere a.id = #{id}</select>
    </mapper>
    
    • 注意是ofType,表示“集合中的类型”。
  • 编写测试程序

    @org.junit.Test
    public void TestSelectArticleForId(){SqlSession sqlSession = SqlSessionUtil.openSqlsession();ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);Article article = mapper.selectArticleForId(1);System.out.println(article);System.out.println(article.getArticleDetailList());sqlSession.close();
    }
    
  • 查询结果
    在这里插入图片描述

2.方式二:分步查询

  • 和多对一的分布查询方式一样,只需要修改三处的代码即可。

  • 第一处:修改映射文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.gdb.mybatis.advancedMapping.mapper.ArticleMapper"><resultMap id="ArticleResultMap" type="Article"><id property="id" column="id"/><result property="userId" column="user_id"/><result property="title" column="title"/><result property="summary" column="summary"/><result property="readCount" column="read_count"/><result property="createTime" column="create_time"/><result property="updateTime" column="update_time"/><collection property="articleDetailList" select="com.gdb.mybatis.advancedMapping.mapper.ArticleDetailMapper.selectArticleDetailByArticleId" column="id"/></resultMap><select id="selectArticleForId" resultMap="ArticleResultMap">select * from article where id = #{id};</select>
    </mapper>
    
  • 第二处:在ArticeDetailMapper中添加方法

    /*** 通过文章的编号 id,查询文章下所有的评论* @param ArticleId 文章id* @return 返回对应文章下的所有评论*/
    List<ArticleDetail> selectArticleDetailByArticleId(Integer ArticleId);
    
  • 第三处:编写ArticleDetailMapper.xml文件中的sql语句。

    <select id="selectArticleDetailByArticleId" resultType="ArticleDetail">select * from article_detail where article_id = #{articleId};
    </select>
    

三、延迟加载(懒加载)

1.分步查询的优点

  • 第一:复用性增强,可以重复利用。(大步拆成 N 个小碎步。每一步更加可以复用)。
  • 第二:采用这种分步查询,可以充分利用他们的延迟加载/懒加载机制。

2.延迟加载(懒加载)

  • 延迟加载的核心原理是:用的时候再执行查询语句。不用的时候不查询。
  • 作用:提高性能。尽可能的不查,或者说尽可能的少查。来提高效率。
  • 在mybatis当中怎么开启延迟加载:
    • association 标签中添加fetchType = “lazy”
    • 注意:默认情况下是没有开启延迟加载的。需要设置:fetchType = “lazy”
    • 这种在association标签中配置fetchType=“lazy”,是局部设置,只对当前的association关联的sql语句起作用。
  • 在实际的开发中,大部分都是需要使用延迟加载的,所以建议开启全部的延迟加载机制。
    • 在 mybatis 核心配置文件中添加全局配置:lazyLoadingEnabled=true
  • 实际开发中的模式:
    • 把全局的延迟加载开启。
    • 如果某一步不需要使用延迟加载,设置:fetchType=“eager”。
      在这里插入图片描述
      在这里插入图片描述


http://www.ppmy.cn/news/1361961.html

相关文章

基于MybatisPlus实现的代码生成插件

1. 前言 目前市面上基于Mybatis或MybatisPlus的代码生成器或插件有很多&#xff0c;本人前几年也开发了一款&#xff1a;基于SpringBoot微服务代码自动生成插件。之前的开发的这款插件底层使用的持久层框架是通用mapper&#xff0c;不是现在主流的MyBatisPlus&#xff0c;而且只…

LVS-NAT之VMNET环境搭建

目录 搭建拓扑图 搭建规划 VMNET0 搭建 VMNET2 搭建 LVS端增加网卡 搭建拓扑图: 搭建规划: CLIENT(servera): VMNET0 LVS(serverb): VMNET0 VMNET2 WEB1(serverd): VMNET2 WEB2(servere): VMNET2 VMNE…

排序算法1:冒泡排序、快速排序、插入排序

排序算法&#xff1a;交换类排序&#xff0c;插入类排序、选择类排序、归并类排序 交换类排序&#xff1a;冒泡排序、快速排序 一、冒泡排序 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ElemType; typedef struct{ElemType *e…

【0261】pg内核 raw parsetree 深入分析(一)

1. 前言 pg内核完成原始解析树(raw parsetree)相关功能入口是exec_simple_query()函数中的pg_analyze_and_rewrite(),该函数位于postgres.c(src/backend/cop )。该函数内部有几个非常重要的函数调用处理: (1)pg_parse_query() 对一个或多个查询(原始字符串,如:SELE…

H5元素形变

H5元素形变 一、缩放 语法&#xff1a; ​ transform:scale(缩放倍率) //整体缩放 ​ transform:scale(水平缩放倍率&#xff0c;垂直缩放倍率) //单独设置水平和垂直方向的缩放 ​ transform: scaleX(缩放倍率) //沿X轴缩放 ​ transform: scaleY(缩放倍率) //沿Y轴缩放…

一文彻底搞懂JUC结构

文章目录 1. JUC结构图2. tools&#xff08;工具类&#xff09;3. executor(执行者)4. atomic(原子性包)5. locks&#xff08;锁包&#xff09;6. collections(集合类) 1. JUC结构图 JUC 是 Java 并发工具包&#xff08;Java Util Concurrency&#xff09;&#xff0c;它是 Ja…

【Vue3】‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题 今天拿到别人项目的时候&#xff0c;我平时比较习惯用pnpm&#xff0c;我就使用pnpm i先下载依赖包&#xff0c;下载完成后&#xff0c;启动项目&#xff0c;就开始报以下错误&#xff01; 但是当我执行pnpm i的时候&#xff0c;vite不应该就已经被我下载下来了吗 研究了…

Java之线程同步、synchronized用法及原理

线程的同步 场景1&#xff1a;两个线程同时访问一个变量&#xff0c;一个线程自增&#xff0c;一个线程自减 public class thread11 {public static void main(String[] args) throws InterruptedException {Thread thread1 new AddThread();Thread thread2 new DecThread(…