Mybatis 一对一、一对多、多对多

news2025/1/16 17:03:43

今天我们来复习一下 Mybatis 框架吧

总所周知,Mybatis 是一款优秀的 基于ORM 半自动 轻量化 的 持久层框架

ORM:对象关系映射,简单的说就是表结构对应实体类

半自动:可灵活配置SQL,优化代码性能

轻量化:简单好用

持久层框架:把数据存储在磁盘上

我知道你都懂,我只是自己复述一下

一对一关系

现有订单表和用户表,要求在查询订单的同时查询该订单所属用户

查询SQL

  select * from orders o,user u where o.uid = u.id

实体类

public class Order {
    private Integer id;
    private String orderTime;
    private Double total;
   private User user;
}

public class User{
    private Integer id;
    private String username;
   // 省略
}

Mapper 关键字:association

<resultMap id="orderMap" type="com.liuyuncen.Order">
  <result property="id" column="id"></result>
  <result property="orderTime" column="orderTime"></result>
  <result property="total" column="total"></result>
  <association property="user" javaType="com.liuyuncen.User">
    <result property="id" column="uid"></result>
    <result property="username" column="username"></result>
  </association>
</resultMap>


<select id="findOrderAndUser" resultMap="orderMap">
  select * from orders o,user u where o.uid = u.id
</select>

mapper 的加载方式有4种

如果是采用 包内映射接口注册,需要保证 xml 文件和 java 文件在同名包下。

一对多关系

还是刚刚的表模型,刚实验的一对一关系中,一个订单只能对应一个用户

现在要求查询一个订单并包括其下的所有订单

大多数情况下,一个用户肯定存在多个订单的情况,这就是一对多关系

但也有可能有些用户一个订单都没有,这样我们就不能使用内连接的方式,应该采用左外连接或右外连接

查询SQL是

select * from user u left join orders o on u.id = o.uid

修改实体类

public class Order {
    private Integer id;
    private String orderTime;
    private Double total;
}

public class User {
    private Integer id;
    private String username;
  // 多个订单
  private List<Order> orderList;
}

Mapper 关键字collection

<resultMap id="userMap" type="com.liuyuncen.User">
    <result property="id" column="uid"></result>
    <result property="username" column="username"></result>
    <collection property="orderList" ofType="com.liuyuncen.Order">
        <result property="id" column="id"></result>
        <result property="orderTime" column="orderTime"></result>
        <result property="total" column="total"></result>
    </collection>
</resultMap>

<select id="findAll" resultMap="userMap">
    select * from user u left join orders o on u.id = o.uid
</select>

多对多关系

用户表和角色的关系为,一个用户有多个角色,一个角色被多个用户使用

sys_user_role 的两个字段既作为联合主键也作为外键,这就是 多对多关系体现

多对多查询需求:查询所有用户同时查询出该用户的所有角色

查询SQL

# 查询所有用户同时查询出该用户的所有角色
select * from user u left join sys_user_role sur on u.id = sur.userid inner join sys_role sr on sur.roleid = sr.id

修改实体类

public class User {
    private Integer id;
    private String username;
    private List<Role> roleList;
}

Mapper

<resultMap id="userRoleMap" type="com.liuyuncen.User">
    <result property="id" column="userid"></result>
    <result property="username" column="username"></result>
    <collection property="roleList" ofType="com.liuyuncen.Role">
        <result property="id" column="roleid"></result>
        <result property="roleName" column="roleName"></result>
        <result property="roleDesc" column="roleDesc"></result>
    </collection>
</resultMap>


<select id="findAllUserAndRole" resultMap="userRoleMap">
    select * from user u left join sys_user_role ur on u.id = ur.userid
                   left join sys_role r on r.id = ur.roleid
</select>

控制台打印信息

ok 今天的分享就到这里了,既然都看到这里了,不妨透露个小秘密,明天分享基于注解的关系查询!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158905.html

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

相关文章

php源代码保护——PHP加密方案分析解密还原

前言 php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 . 在php源代码的保护在原理可以分为3大类. 源代码混淆(编码)OPCODE混淆(编码)修改解释引擎(虚拟机) 在部署上可…

Vue学习笔记 ④

文章目录template 选项Vue 生命周期生命周期图示生命周期钩子beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed组件基础组件是什么&#xff1f;组件注册全局组件局部组件组件名组件复用自闭合组件组件的 data 选项单个根元素组件\_Prop注册自定…

怎么排除无效问卷?

目录 1、答题限制 1&#xff09;设置问卷验证码/密码 2&#xff09;设置填写唯一链接 2、题目设置 1&#xff09;设置陷阱题目 2&#xff09;打乱题目顺序 3&#xff09;设置跳转逻辑 4&#xff09;题目数量限制 3、问卷筛选 问卷调查是一种能够在进行社会调研时帮助我…

SAP ABAP发送HTML格式的邮件

输入参数&#xff1a; I_SUBJECT&#xff1a;内容的简短描述 IT_MESSAGE_BODY&#xff1a;邮件主体部分&#xff08;convert string to table&#xff09; IT_ATTACHMENTS&#xff1a;附件内容 I_SENDER_MAIL&#xff1a;发送者的电子邮件地址 I_ATTMSG_CHECK&#xff1a;…

浙大MBA/MPA/MEM复试中的五大认知误区

在每年的研究生复试过程中都不乏大意失荆州者&#xff0c;经过联考初试的洗礼走到复试环节&#xff0c;却因为录取排名的变化而止步于录取大门口。在这些案例中&#xff0c;不少考生其实是针对复试这个环节有诸多认知误区&#xff0c;本期杭州达立易考结合MBA/MEM/MPA在职类硕士…

CentOS配置静态IP

CentOS配置静态IP1.获取VMnet8虚拟网卡的网段2.编辑虚拟机虚拟网络3.虚拟机中网络配置4.验证配置1.获取VMnet8虚拟网卡的网段 通过ipconfig -all查询VMnet8网卡的网段&#xff0c;这个等会需要使用 这里是&#xff1a;192.168.177 这里注意&#xff0c;还需要记录一下宿主机&…

rust字符串

字符串类型 诸位在入门rust的时候&#xff0c;要认真&#xff0c;因为字符串类型在rust中有好几种&#xff0c;一不小心就搞混了类型&#xff0c;导致代码编译报错。好在有强大的rust-analyzer和vscode帮助我们。我们直接通过一段代码来开始认识rust的字符串类型。 fn main()…

nginx学习笔记5(小d课堂)

全局异常兜底数据返回 我们如果访问的路径不存在&#xff0c;会给我们返回一个404.那么我们就可以通过nginx配置去返回兜底数据&#xff1a; 修改完配置&#xff0c;重启nginx。 这样我们就返回我们的兜底数据了。 nginx封禁恶意ip 我们现在随便选择一个ip进行封禁测试。 我们现…

.Net Core 6.0 WebApi配置跨域

ASP.Net Core 6.0 WebApi配置跨域 Program.cs文件代码如下&#xff1a; //配置跨域 builder.Services.AddCors(cor > {var cors configuration.GetSection("CorsUrls").GetChildren().Select(p > p.Value);cor.AddPolicy("Cors", policy >{poli…

92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)

题目描述 原题链接&#xff1a;111. 二叉树的最小深度 解题思路 1、迭代法&#xff1a;层序遍历BFS 最小深度的特点是第一次遍历到结点的左右指针为NULL&#xff0c;此时该路径为最短路径。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

探索SpringMVC-组件之HandlerExceptionResolver

前言 在介绍完Handler、HandlerAdapter、HandlerMapping之后&#xff0c;剩下的比较关键的组件就是HandlerExceptionResolver、ViewResolver。其他的像国际化、主题、文件上传、重定向&#xff0c;这些锦上添花的组件都是一个框架需要关心的。但不是我们平常使用的核心功能&am…

蓝桥杯省赛习题练习(三)

题目来源&#xff1a;2022年第十三届省赛(B组)真题 目录1.九进制转十进制运行结果2. 顺子日期运行结果3. 刷题统计运行结果4. 积木画1.九进制转十进制 问题描述&#xff1a;九进制正整数 (2022)9 转换成十进制等于多少&#xff1f; #include<stdio.h> #include<math.h…

一文带你深入了解线程池

目录一. 什么是线程池二. 为什么要使用线程池三. 线程池的参数四. 线程池的工作流程五. 使用Executors 创建常见的功能线程池一. 什么是线程池 简单来说&#xff0c;线程池就是提前创建好一批线程&#xff0c;当有任务的时候&#xff0c;从池子中取出一个线程去执行该任务&…

再说多线程(二)——细说Monitor类

在上一节我们已经讨论了使用Lock来保证并发程序的一致性&#xff0c;Lock锁是借助了Monitor类的功能。本节将详细的介绍Monitor类&#xff0c;以及如何通过Monitor类的成员函数实现并行程序的一致性。1.Monitor类介绍根据微软的说法&#xff0c;C#中的监视器类提供了一种同步对…

Microsoft Visual SourceSafe的使用

1、介绍 Microsoft Visual SourceSafe&#xff0c;简称vss。是一款早期微软推出的版本管理工具。跟据官方的定义&#xff0c;vss有两种控制模式&#xff1a;独占&#xff08;Lock-Modify-Unlock Model&#xff09;和并行&#xff08;Copy-Modify-Merge Model&#xff09;。独占…

程序的安装——软件安装包的制作、软件源的使用

读书笔记 —— 《嵌入式C语言自我修养》 软件安装 linux 安装包的制作 编译 软件安装包路径 使用dpkg命令来制作安装包 及 安装包的卸载 软件仓库 更新源 查看具体需要更新的软件包 更新软件包 软件安装 软件安装的过程其实就是将一个可执行文件安装到ROM的过…

安全狗云原生安全从1.X到2.X的演变之路(1)

随着云计算技术的蓬勃发展&#xff0c;传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展&#xff0c;成为赋能业务创新的重要推动力&#xff0c;并已经应用到企业核心业务。然而&#xff0c;云原生技…

大型数据中心分层分布式谐波治理方案设计与效果分析

摘要&#xff1a;数据中心行业在国民经济中起到了不可替代的作用,但其繁多的非线性电力负载,如通讯系统、大型计算机、网络控制设备、变频空调、各种数码办公设备、灯光调控系统、UPS、监控系统等给其供电系统带来了严重的谐波干扰,对大型数据中心的运行安全造成了较大的威胁,为…

200:vue+openlayers 添加删除多边形,modify feature,双向互动颜色显示

第200个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中添加删除多边形,每绘制一个,左侧列表出一个信息。 hover左侧文字,右边地图上红色显示图形,点击选中右侧地图上某feature,变成蓝色高亮,同时左侧也会蓝色显示,做到双向互动。 高亮显示某feature,…

如何删除图片数据中的重复数据

我们在工作中经常这种情况&#xff0c;leader给你一堆数据&#xff0c;让你用这些没有清洗过的数据完成项目。痛苦的是&#xff0c;这批数据居然存在很多重复的样本。那如何删除这些冗余数据呢&#xff1f;imagehash库非常好用。 github地址&#xff1a;https://github.com/ch…