【Mybatis】Mybatis处理一对多、多对多关系映射-四

news2024/12/26 11:00:37

唠嗑部分

上篇文章我们说了Mybatis中ORM映射的几种方式,相关文章:
【Mybatis】简单入门及工具类封装-一
【Mybatis】如何实现ORM映射-二
【Mybatis】Mybatis的动态SQL、缓存机制-三

这篇文章我们来说说Mybatis如何处理一对一、一对多、多对多的关系映射

首先创建环境,表结构

create database `mybatis-wx-demo` character set 'utf8mb4';
use `mybatis-wx-demo`;
create table user
(
    id int primary key auto_increment comment '主键id',
    user_name varchar(255) comment '用户名',
    age int comment '年龄',
    create_time datetime comment '创建时间'
) comment '用户表';

insert into user values (1, '全栈小白', 23, CURRENT_TIMESTAMP()),
                        (2, '南宫飞雪', 25, CURRENT_TIMESTAMP()),
                        (3, '盒马鲜生', 30, CURRENT_TIMESTAMP());

create table user_account(
    acc_id int primary key auto_increment comment '账户id',
    acc_balance int default 0 comment '账户余额',
    user_id int comment '用户id'
) comment '用户账户表';
insert into user_account values (1, 100, 1);

create table role(
     role_id int primary key auto_increment comment '角色id',
     role_name varchar(50) comment '角色名'
) comment '角色表';

insert into role values (1, '超级管理员'), (2, '管理员'), (3, '用户');

create table user_role(
     id int primary key auto_increment comment '主键id',
     u_id int not null comment '用户id',
     r_id int not null comment '角色id'
) comment '用户角色关联表';

insert into user_role values (1, 1, 1), (2, 1, 2);

create table user_photo(
    id int primary key auto_increment comment '主键',
    user_id int not null comment '用户id',
    url varchar(255) not null comment '用户照片'
) comment '用户照片表';
insert into user_photo values (1, 1, 'https://img2.baidu.com/it/u=3202947311,1179654885&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500'),
                              (2, 1, 'https://lmg.jj20.com/up/allimg/1114/040221103339/210402103339-8-1200.jpg');

说说表结构,user与user_account是一对一的关系,用户只能有一个账户,

user与user_photo是一对多的关系,用户可以有多个生活照片

user与role是多对多的关系,用户可以有多个角色

言归正传

实体类关系就不演示了,着重说数据封装

需求一:查询用户id为1的用户信息及用户账户信息(一对一)

1、创建UserAccountInfoBO业务封装对象

/**
 * @Project: mybatis-wx-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/3/10 11:01
 * @Description:
 **/
@Data
public class UserAccountInfoBO {

    private User userInfo;
    private UserAccount userAccountInfo;
}

2、编写接口

/**
 * @Project: mybatis-wx-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/2/28 10:41
 * @Description:
 **/
public interface UserMapper {
    UserAccountInfoBO selectUserAndAccountByUserId(@Param("id") Integer id);
}

3、编写xml配置文件

使用association标签处理复杂的javaBean

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace = 所需实现的接口全限定名-->
<mapper namespace="com.cxs.mapper.UserMapper">
    <resultMap id="selectUserAndAccountByUserIdMap" type="com.cxs.bo.UserAccountInfoBO">
        <association property="userInfo" javaType="com.cxs.model.User">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
            <result property="age" column="age" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        </association>
        <association property="userAccountInfo" javaType="com.cxs.model.UserAccount">
            <id property="accId" column="acc_id" jdbcType="INTEGER"/>
            <result property="accBalance" column="acc_balance" jdbcType="INTEGER"/>
            <result property="userId" column="user_id" jdbcType="INTEGER"/>
        </association>
    </resultMap>
    <select id="selectUserAndAccountByUserId" resultMap="selectUserAndAccountByUserIdMap" parameterType="java.lang.Integer">
        select *
           from user u
           inner join user_account ua
           on u.id = ua.user_id
        where u.id = #{id}
    </select>
</mapper>

4、测试

image-20230310113412445

需求二:查询用户id为1的用户信息及用户的照片信息(一对多)

1、创建UserPhotoInfoBO业务封装对象

/**
 * @Project: mybatis-wx-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/3/10 11:40
 * @Description:
 **/
@Data
public class UserPhotoInfoBO {
    private Integer id;
    private String userName;
    private Integer age;
    private LocalDateTime createTime;
    private List<UserPhoto> userPhotoList;
}

2、编写接口

public interface UserMapper {
    UserAccountInfoBO selectUserAndAccountByUserId(@Param("id") Integer id);
    UserPhotoInfoBO selectUserAndPhotoByUserId(@Param("id") Integer id);
}

3、编写xml配置文件

使用collection标签封装Bean集合,照片是多个

<resultMap id="selectUserAndPhotoByUserIdMap" type="com.cxs.bo.UserPhotoInfoBO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <collection property="userPhotoList" javaType="java.util.List" ofType="com.cxs.model.UserPhoto">
            <id property="id" column="photo_id" jdbcType="INTEGER"/>
            <result property="url" column="url" jdbcType="VARCHAR"/>
            <result property="userId" column="user_id" jdbcType="INTEGER"/>
        </collection>
    </resultMap>

    <select id="selectUserAndPhotoByUserId" resultMap="selectUserAndPhotoByUserIdMap" parameterType="java.lang.Integer">
        select u.*,
               up.id as photo_id,
               up.user_id,
               up.url
        from user u
        inner join user_photo up
        on u.id = up.user_id
        where u.id = #{id}
    </select>

4、测试

image-20230310131812457

需求三:查询用户id为1的用户信息及用户的角色信息(多对多)

1、创建UserRoleInfoBO业务封装对象

/**
 * @Project: mybatis-wx-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/3/10 13:19
 * @Description:
 **/
@Data
public class UserRoleInfoBO {
    private Integer id;
    private String userName;
    private Integer age;
    private LocalDateTime createTime;
    private List<Role> roleList;
}

2、编写接口

/**
 * @Project: mybatis-wx-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/2/28 10:41
 * @Description:
 **/
public interface UserMapper {

    UserAccountInfoBO selectUserAndAccountByUserId(@Param("id") Integer id);

    UserPhotoInfoBO selectUserAndPhotoByUserId(@Param("id") Integer id);

    UserRoleInfoBO selectUserAndRoleListByUserId(@Param("id") Integer id);
}

3、编写xml配置文件

<resultMap id="selectUserAndRoleListByUserIdMap" type="com.cxs.bo.UserRoleInfoBO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <collection property="roleList" javaType="java.util.List" ofType="com.cxs.model.Role">
            <id property="roleId" column="role_id" jdbcType="INTEGER"/>
            <result property="roleName" column="role_name" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>

    <select id="selectUserAndRoleListByUserId" resultMap="selectUserAndRoleListByUserIdMap" parameterType="java.lang.Integer">
        select u.*, r.*
        from user u
        left join user_role ur on u.id = ur.u_id
        inner join role r on ur.r_id = r.role_id
        where u.id = #{id}
    </select>

4、测试

image-20230310132450172

结语

1、三种不同的关系映射就说到这,不知大家有没有发现,一对多、多对多很类似,只是sql语句上的不同

2、Mybatis相关内容,后续还会安排动态SQL、缓存及SpringBoot整合Mybatis

3、制作不易、一键三连再走吧,您的支持是我最大的动力!

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

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

相关文章

Linux下网络编程(2)——socket的函数们

accept()函数 服务器调用 listen()函数之后&#xff0c;就会进入到监听状态&#xff0c;等待客户端的连接请求&#xff0c;使用 accept()函数获取客户端的连接请求并建立连接。函数原型如下所示&#xff1a; int accept(int sockfd, struct sockaddr *addr, socklen_t *addrle…

RK3588光电载荷处理板研制进展

本来就是一个很小众的市场&#xff0c;但是偶尔也会有同行询问&#xff0c;这儿就简单汇报一下后期的进展 板子已经开发完成&#xff0c;并有幸得到了两个订单&#xff0c;虽然量不是很大&#xff0c;但是也很开心由于一段时间的努力和付出&#xff0c;将该设备应用在了国防事业…

【Linux】Linux文件目录结构

Linux文件目录结构 在 Linux 中&#xff0c;其文件目录结构是一颗类似于多叉树的结构&#xff0c;所有目录都在 / &#xff08;根目录&#xff09;下面&#xff0c;每个非叶节点代表一个目录&#xff0c;叶节点代表文件。 一般结构如下所示&#xff1a; usr :“Unix Software …

LitCTF 2023 - crypto复现

文章目录 Hex&#xff1f;Hex&#xff01;梦想是红色的原来你也玩原神factordbP_Leake的学问Euler* Where is P?The same common divisormd5babyLCG* easy_math* Virginia* Is this only base?你是我的关键词(Keyworld)隐晦的聊天记录* baby_xor收获与体会 Hex&#xff1f;He…

RabbitMQ入门 安装 SpringAMQP简单队列、工作队列、发布订阅(扇出模式,广播模式)、Direct模式(Roting模式)、Topic模式

一、RabbitMQ介绍 1. MQ介绍 1. 为什么要有MQ 同步调用与异步调用 程序里所有的通信&#xff0c;有两种形式&#xff1a; 同步通信&#xff1a;通信时必须得到结果才会执行下一步 异步通信&#xff1a;通信时不必等待结果&#xff0c;可以直接处理下一步 同步调用 解析&…

IPWorks EDI 2022 .NET Edition 22.0.8 Crack

IPWorks EDI基于用于安全 EDI 通信&#xff08;AS2、SFTP、OFTP、RosettaNet、MLLP 等&#xff09;的领先 EDI-INT 协议&#xff0c;IPWorks EDI 库包含促进安全 EDI 消息传递以及 EDI 映射、翻译和验证&#xff08;X12、 EDIFACT、HL7、TRADACOMS、VDA、XML 和 JSON&#xff0…

Mybatis基础操作

文章目录 一. Mybatis单表操作删除操作查询操作#{} 与 ${}的区别更新操作新增操作 二. Mybatis多表操作 一. Mybatis单表操作 删除操作 我们接着使用昨天的表和程序&#xff0c;我们来实现通过id删除数据&#xff1a; 我们这样就可以实现将id 1的数据进行删除了&#xff0c;…

FE_JS对象的理解

对象是JS中的引用数据类型&#xff0c;对象是一种复合数据类型&#xff0c;在对象中可以保存多个不同数据类型的属性。使用typeof检查一个对象时&#xff0c;会返回object。 1 对象创建模式 - Object构造函数模式 套路: 先创建空Object对象, 再动态添加属性/方法 适用场景: 起…

【LeetCode: 1335. 工作计划的最低难度 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

又一个开源便斩获 7k star 的新模型「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 Star 并不能代表什么&#xff0c;但是绝对能表示一个项目的受欢迎程度。就像刚开源一周就有 7k star 的新模型&#xff0c;输入文本 / 图像就能获得 3D 对象。除了这个新模型&#xff0c;本周还有一款新的 Web 3D 渲染引擎 Orillusion&…

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…

阿里P8强烈推荐的可伸缩服务架构:框架与中间件笔记

随着企业业务量的增加&#xff0c;流量洪峰在不断挑战着业务系统的承载能力&#xff0c;设计高并发、可伸缩的系统已成为软件架构师的紧迫任务&#xff0c;而分布式、可伸缩的架构模式已成为抵御洪峰的有效方案之一。本书汇集了作者在多年核心系统开发中的架构及实践经验&#…

【算法】--- 几分钟带你走进排序算法大门(上)

文章目录 前言&#x1f31f;一、常见的排序算法&#xff1a;&#x1f31f;二、直接插入排序排序&#xff1a;&#x1f4d2;2.1 基本思想&#xff1a;&#x1f4d2;2.2 代码&#xff1a;&#x1f4d2;2.3 时间复杂度&#xff1a;O(N^2)&#x1f4d2;2.4 流程图详解&#xff1a; …

聚观早报 | Midjourney官方在QQ开启内测;富士康印度新工厂动工

今日要闻&#xff1a;Midjourney官方在QQ开启内测&#xff1b;富士康印度新工厂动工&#xff1b;闲鱼将开收软件服务费&#xff1b;专家建议五年内禁售燃油车&#xff1b;笑果文化已被立案调查 Midjourney官方在QQ开启内测 5 月 15 日&#xff0c;据 Midjourney AI 微信公众号…

Unity之OpenXR+XR Interaction Toolkit实现 手枪模型的拆卸和组装

前言 之前我们曾实现过PC端的模型的拆卸和组装&#xff0c;如果使用VR模式来实现物体的拆卸呢&#xff1f;如何使用双手手柄来控制物体&#xff0c;拆卸物体呢&#xff1f;今天我们就来实现一个VR小Demo&#xff0c;基于OpenXR &#xff0c;XR Interaction Toolkit插件来实现。…

程序员面试宝典

前言 编者: 大淘宝技术开发工程师 / 刘苏宏(淘苏) 淘苏(花名)目前是大淘宝技术的一名开发工程师。从国企 跳槽来到互联网&#xff0c;【职业规划】是他被问得最多&#xff0c;也思考得 最多的问题。 扫一扫&#xff0c;关注公众号【大淘宝技术】 了解更多大淘宝技术干货沉淀 …

技术架构演进之路-Docker【一】

技术架构演进之路 了解每种技术架构以及如何演进的&#xff0c;熟悉Docker在架构中的核心作用 八大架构演进 单机架构 当前服务由应用服务和数据库服务两个服务组成&#xff0c;应用服务由 用户模块、商品模块、交易模块三个模块组成&#xff0c;我们可以理解它为 淘宝。用户模…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

通配符SSL证书是什么?

通配符SSL证书可以对申请的域名保护以外&#xff0c;还可以对下一级子域名无限使用&#xff0c;适合存在很多二级域名项目的网站&#xff0c;这样不需要额外对子域名申请SSL证书&#xff0c;还可以进行同意管理及部署SSL证书避免跨站窜站的问题。 申请通配符SSL证书 一、申请通…

SSH远程终端神器,你在用哪一款

唠嗑部分 在我们日常开发中啊&#xff0c;不可避免的要与Linux打交道&#xff0c;虽然我们作为开发&#xff0c;不要求我们对Linux有多么的专业&#xff0c;但是基本的操作还是要会的&#xff0c;举几个常用的例子&#xff1a; 1、查看nginx配置&#xff0c;配置转发 2、清理…