MyBatis的⾼级映射及延迟加载

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.mzph.cn/news/701499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络系列---计算图基本原理

文章目录 计算图符号微分符号微分的步骤示例符号微分在计算图中的使用总结 数值微分前向差分法中心差分法数值微分的使用注意事项总结 自动微分1. 基本原理2. 主要类型3. 计算图4. 应用5. 工具和库6. 优点和缺点 计算图1. **计算图的建立**2. **前向传播**3. **反向传播**4. **…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Inpaint)

上篇文章介绍了语义分割Tile/Blur&#xff0c;这篇文章介绍下Inpaint&#xff08;重绘&#xff09; Inpaint类似于图生图的局部重绘&#xff0c;但是Inpain效果要更好一点&#xff0c;和原图融合会更加融洽&#xff0c;下面是案例&#xff0c;可以看下效果&#xff08;左侧原图…

7、Linux软件包管理、软件安装

三、软件包管理 1.文件上传与下载 用来做文件上传与下载的 先下载 lrzsz 工具 yum install lrzszrz 从windows 上传文件到 linux rz 会弹出一个选择框sz 从linux 上下载软件到 windows sz 文件名应用场景 修改上传配置文件上传 jar 包 2.RMP 包管理(了解一下就行) 2.1概述…

小红书商业体系,一文通

2024-02-23-小红书商业体系 大家好&#xff0c;我是周萝卜 今天分享一篇玩赚新媒的精华帖《小红书商业知识体系》 之所以分享这一篇&#xff0c;主要还是小红书的的确确是当下最值得深耕的赛道之一&#xff0c;而且这篇文章写的太好了&#xff0c;全程干货&#xff0c;毫无水…

旋转齿轮加载

效果演示 实现了一个旋转齿轮的动画效果。具体来说&#xff0c;页面背景为深灰色&#xff0c;中间有一个齿轮装置&#xff0c;包括四个齿轮。每个齿轮都有内部的齿轮条&#xff0c;整体呈现出旋转的效果。其中&#xff0c;齿轮2是顺时针旋转的&#xff0c;齿轮1、3、4是逆时针旋…

文件上传失败原因汇总(个人情况总结)

1.后端配置application里有服务限制大小 # Spring spring:servlet:multipart:max-file-size: 500MBmax-request-size: 500MB 2.如果你用了dubbo&#xff0c;要调整生产者和消费者超时时间以及payload大小&#xff0c;最好是dubbo自增策略&#xff0c;防止用了dubbo的服务端口冲…

纳斯达克大屏-投放需要知道的几个条件-大舍传媒

引言 随着移动互联网的快速发展&#xff0c;数字广告媒体广告越来越受到企业的关注。纳斯达克大屏作为全球最大的数字媒体广告投放平台之一&#xff0c;拥有广泛的受众和优质的媒体资源&#xff0c;吸引了众多企业的眼球。要想在纳斯达克大屏上投放广告&#xff0c;企业需要了…

【Oracle】玩转Oracle数据库(五):PL/SQL编程

前言 嗨&#xff0c;各位数据库达人&#xff01;准备好迎接数据库编程的新挑战了吗&#xff1f;今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程&#xff01;&#x1f52e;&#x1f4bb; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;五&#xff09;&#xff1…

SAM轻量化的终点竟然是RepViT + SAM

本文首发&#xff1a;AIWalker&#xff0c;欢迎关注~~ 殊途同归&#xff01;SAM轻量化的终点竟然是RepViT SAM&#xff0c;移动端速度可达38.7fps。 对于 2023 年的计算机视觉领域来说&#xff0c;「分割一切」&#xff08;Segment Anything Model&#xff09;是备受关注的一项…

LeetCode 2476.二叉搜索树最近节点查询:中序遍历 + 二分查找

【LetMeFly】2476.二叉搜索树最近节点查询&#xff1a;中序遍历 二分查找 力扣题目链接&#xff1a;https://leetcode.cn/problems/closest-nodes-queries-in-a-binary-search-tree/ 给你一个 二叉搜索树 的根节点 root &#xff0c;和一个由正整数组成、长度为 n 的数组 qu…

工具分享:linux命令在线查询工具:让你的系统操作更加便捷

linux命令在线查询工具&#xff1a;让你的系统操作更加便捷 在Linux系统中&#xff0c;命令行是一种非常高效的操作方式&#xff0c;但对于一些不熟悉命令的用户来说&#xff0c;可能会感到有些困惑。不过&#xff0c;现在有了一个非常实用的工具——linux命令在线查询工具&…

计算机体系架构初步入门

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 1 计算机五大…

onlyoffice api开发

编写代码 按照https://api.onlyoffice.com/editors/basic编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scal…

vue+node.js美食分享推荐管理系统 io551

&#xff0c;本系统采用了 MySQL数据库的架构&#xff0c;在开始这项工作前&#xff0c;首先要设计好要用到的数据库表。该系统的使用者有二类&#xff1a;管理员和用户&#xff0c;主要功能包括个人信息修改&#xff0c;用户、美食类型、美食信息、订单信息、美食分享、课程大…

C#之WPF学习之路(5)

目录 内容控件&#xff08;2&#xff09; TextBlock文字块 TextBox文本框 TextBoxBase基类 TextBox控件 RichTextBox富文本框 ToolTip控件&#xff08;提示工具&#xff09; Popup弹出窗口 Image图像控件 属性成员 事件成员 内容控件&#xff08;2&#xff09; Tex…

基于ILI9341的TFT-LCD屏幕显示要点总结

目录 LCD常用引脚及其功能 LCD驱动流程 RGB565 关键指令 GRAM自增方向 设置开始坐标和结束坐标 写GRAM指令 读GRAM指令 本文主要参考视频如下&#xff1a; 第37讲 LCD-TFTLCD原理与配置介绍-M4_哔哩哔哩_bilibili 说明&#xff1a; 目前&#xff0c;市面上常见的TFT-LC…

程序员可以做什么副业呢?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

Django模型基础(ORM、字段类型、字段参数、增删改查和分页)

模型基础&#xff1a; 字段类型&#xff1a; django根据属性的类型确定以下信息 当前选择的数据库⽀持字段的类型渲染管理表单时使⽤的默认html控件在管理站点最低限度的验证django会为表增加⾃动增⻓的主键列&#xff0c;每个模型只能有⼀个主键列&#xff0c;如果使⽤选项…

【Java程序设计】【C00316】基于Springboot的中小型制造企业质量管理系统(有论文)

基于Springboot的中小型制造企业质量管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的中小型制造企业质量管理设计与实现&#xff0c;本系统有管理员以及工作人员二种角色权限 管理员&#xff1a;首页、个…

如何安装自定义模块?

自定义模块的安装方式如下&#xff1a; 进行了这些操作之后&#xff0c;你就会发现&#xff0c;自己写的代码块&#xff0c;成了可以调用的模块了。