文章目录

  • 数据库设计
  • MyBatis 配置
  • MyBatis 映射文件
    • Mapper 接口
  • 总结

数据库设计

建表 SQL

CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);CREATE TABLE `order` (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(50) NOT NULL,FOREIGN KEY (user_id) REFERENCES user(id)
);CREATE TABLE role (id INT PRIMARY KEY AUTO_INCREMENT,role_name VARCHAR(50) NOT NULL
);CREATE TABLE user_role (user_id INT NOT NULL,role_id INT NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (role_id) REFERENCES role(id)
);

插入以下数据:

INSERT INTO user (name) VALUES ('Alice'), ('Bob');
INSERT INTO `order` (user_id, order_no) VALUES (1, 'ORD001'), (1, 'ORD002'), (2, 'ORD003');
INSERT INTO role (role_name) VALUES ('Admin'), ('User');
INSERT INTO user_role (user_id, role_id) VALUES (1, 1), (1, 2), (2, 2);

MyBatis 配置

我们使用 MySQL 数据库,MyBatis 的核心配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test_db?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

定义 Java 实体类,映射数据库表:

@Data
public class User {private Integer id;private String name;private Order order; // 一对一:用户关联一个订单private List<Order> orders; // 一对多:用户关联多个订单private List<Role> roles; // 多对多:用户关联多个角色
}@Data
public class Order {private Integer id;private Integer userId;private String orderNo;
}@Data
public class Role {private Integer id;private String roleName;
}

MyBatis 映射文件

在 UserMapper.xml 中定义关联查询,展示一对一、一对多和多对多的实现。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 一对一 --><resultMap id="UserWithOrderMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><association property="order" javaType="com.example.entity.Order"><id property="id" column="order_id"/><result property="userId" column="user_id"/><result property="orderNo" column="order_no"/></association></resultMap><select id="selectUserWithOrder" resultMap="UserWithOrderMap">SELECT *FROM user uLEFT JOIN `order` o ON u.id = o.user_idWHERE u.id = #{id}LIMIT 1</select><!-- 一对多 --><resultMap id="UserWithOrdersMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><collection property="orders" ofType="com.example.entity.Order"><id property="id" column="order_id"/><result property="userId" column="user_id"/><result property="orderNo" column="order_no"/></collection></resultMap><select id="selectUserWithOrders" resultMap="UserWithOrdersMap">SELECT *FROM user uLEFT JOIN `order` o ON u.id = o.user_idWHERE u.id = #{id}</select><!-- 多对多 --><resultMap id="UserWithRolesMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><collection property="roles" ofType="com.example.entity.Role"><id property="id" column="role_id"/><result property="roleName" column="role_name"/></collection></resultMap><select id="selectUserWithRoles" resultMap="UserWithRolesMap">SELECT *FROM user uLEFT JOIN user_role ur ON u.id = ur.user_idLEFT JOIN role r ON ur.role_id = r.idWHERE u.id = #{id}</select>
</mapper>

Mapper 接口

定义对应的 Mapper 接口:

public interface UserMapper {User selectUserWithOrder(Integer id); // 一对一User selectUserWithOrders(Integer id); // 一对多User selectUserWithRoles(Integer id); // 多对多
}

以下是测试代码,验证查询结果:

public class MyBatisTest {public static void main(String[] args) throws Exception {SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));try (SqlSession session = factory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);// 测试一对一User userWithOrder = mapper.selectUserWithOrder(1);System.out.println(userWithOrder.getName());// 测试一对多User userWithOrders = mapper.selectUserWithOrders(1);System.out.println(userWithOrders.getName());userWithOrders.getOrders().forEach(order -> System.out.println("  - " + order.getOrderNo()));// 测试多对多User userWithRoles = mapper.selectUserWithRoles(1);System.out.println(userWithRoles.getName());userWithRoles.getRoles().forEach(role -> System.out.println("  - " + role.getRoleName()));}}
}

总结

一对一:通过 association 标签,查询用户及其关联的一个订单。
一对多:通过 collection 标签,查询用户及其所有订单,MyBatis 自动将多行订单数据映射到 List。
多对多:通过 collection 标签,查询用户及其所有角色,借助中间表 user_role 实现关联。

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

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

相关文章

项目中使用的设计模式

项目中使用的设计模式请列举几个项目中常用的设计模式什么是设计模式&#xff0c;在项目中使用了那些设计模式动态代理模式JDK动态代理CGLIB动态代理单例模式懒汉式&#xff08;非线程安全&#xff09;饿汉式懒汉式&#xff08;线程安全&#xff09;工厂模式观察者模式装饰器模…

实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录

文章目录实战教程&#xff1a;从"对象文件为空"到仓库重生——修复 Git 仓库损坏全记录案发现场&#xff1a;一个严重损坏的仓库修复之旅&#xff1a;四步让仓库重获新生准备工作&#xff1a;创建安全备份第 1 步&#xff1a;清理战场——删除所有空对象第 2 步&…

ansible 操作家族(ansible_os_family)信息

1. 操作系统系列 &#xff08;ansible_os_family&#xff09;ansible web -m setup -a filteransible_os_family2. 操作系统家族为 RedHat 时执行任务--- - hosts: websrvsremote_user: roottasks:- name: Install package on RedHat systemsyum:name: httpdstate: presentwhen…

一文学会c++继承 组合

文章目录继承简介定义访问限定符和继承方式⭐基类派生类赋值转换继承的作用域派生类的默认成员函数继承与友元继承与静态成员⭐复杂的菱形继承虚拟继承组合继承简介 继承是面向对象程序设计代码复用的重要手段&#xff0c;使得程序员可以在保持原类的基础上扩展&#xff0c;新…

.Net下载共享文件夹中的文件

由于IIS站点权限等问题&#xff0c;总是没找到处理办法&#xff0c;所以改用外挂的winform的方式来下载共享文件&#xff08;也可以改为使用windows服务的方式&#xff09;。 前提需要先在资源管理器中登录到共享文件夹&#xff0c;确保系统能访问。 服务端代码 (.NET后端) usi…

目标检测数据集 - 眼睛瞳孔检测数据集下载「包含COCO、YOLO两种格式」

数据集介绍&#xff1a;眼睛瞳孔检测数据集&#xff0c;真实采集高质量人脸眼部图片数据&#xff0c;适用于人脸定位、人脸疾病如白内障等疾病的视觉检测。数据标注标签包括 eyepupil 瞳孔一 个缺陷类别&#xff1b;适用实际项目应用&#xff1a;眼睛瞳孔检测项目&#xff0c;以…

Keil MDK-ARM V5.42a 完整安装教程

文章目录一、安装前期准备二、Keil MDK-ARM 主程序安装三、器件支持包&#xff08;Pack&#xff09;安装四、许可证激活五、安装验证Keil MDK&#xff08;Microcontroller Development Kit&#xff09;是针对 Arm Cortex-M 系列微控制器的专业开发环境&#xff0c;集成了 μVis…

WPF中引用其他元素各种方法

在WPF中&#xff0c;引用其他元素的方式有多种&#xff0c;每种方式适用于不同场景&#xff0c;各有优缺点。除了x:Reference&#xff0c;常用的还有以下几种&#xff1a; 一、ElementName 绑定&#xff08;最常用的XAML绑定方式&#xff09; 通过元素的x:Name属性引用同一作用…

Python生成统计学公式

一元线性回归模型 2.1回归分析概述/25 一、回归分析基本概念/25 二、总体回归函数/27 三、随机误差项/29 四、样本回归函数/30 2.2 一元线性回归模型的参数估计/32 一、参数估计的普通最小二乘法/32 二、拟合优度/35 2.3基本假设与普通最小二乘估计量的统计性质/36 一、一元线性…

网络工程师--华为命令专题

一、交换机 交换机分类&#xff1a;1.根据交换方式划分&#xff1a;&#xff08;1&#xff09;存储转发式交换&#xff08;Store and Forward&#xff09;&#xff08;2&#xff09;直通式交换&#xff08;Cut-through&#xff09;&#xff08;3&#xff09;碎片过滤式交换&…

判断可编辑div的光标是否在最前面

要判断一个可编辑div(contenteditable)中的光标是否位于最前面&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity实战】使用Unity程序化生成3D随机地牢(附项目源码)

最终效果 文章目录最终效果前言1、理解程序生成的核心概念2、种子值的核心作用3、程序生成的实际应用4、主流程序生成技术概览5、选择合适的技术实战1、素材2、生成一面墙变换矩阵数据3、渲染墙壁4、加点随机不同的墙壁效果5、绘制四面墙壁4、在四个角落生成支柱5、生成地板6、…

多账号管理方案:解析一款免Root的App分身工具

之前有小伙伴问阿灿有没有可以软件分身的免费软件&#xff0c;后来阿灿找到了一款可以无限分身的app感觉很实用&#xff0c;只有10M大小 02软件介绍说白了它能给各种app和游戏做分身&#xff0c;包括V信、qQ、某音、某付宝这些&#xff0c;而且支持最新的安卓15系统。每个分身…

(附源码)基于PHP和Vue的网上购物平台

内容摘要 内容摘要: 随着互联网技术的迅猛发展&#xff0c;网上购物已成为人们日常生活的重要组成部分。本文围绕PHPVue技术栈构建的网上购物平台展开研究&#xff0c;深入探讨了该平台的架构设计与实现细节。平台前端采用Vue框架&#xff0c;利用其组件化开发和数据驱动的特性…

51单片机

中断系统1.什么是中断当CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处理完以后&#xff0c;再回到原来被中断的地方&#xff0c;继续原来的工作&#xff0c;这样的过程称为中断2.为什么要…

前端开发:HTML(5)—— 表单

下面我们来学习表单。 目录 什么是Web表单&#xff1f; 表单标签 1.form标签 2.输入框 文本框和密码框 单选框和复选框 1.单选框 2.复选框 3.按钮 &#xff08;1&#xff09;普通按钮 &#xff08;2&#xff09;提交按钮 &#xff08;3&#xff09;重置按钮 &#…

【YOLOv8改进 - C2f融合】C2f融合SFS-Conv(空间 - 频率选择卷积)提升特征多样性,同时减少参数和计算量

YOLOv8目标检测创新改进与实战案例专栏 专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOv8基础解析+创新改进+实战案例 文章目录 YOLOv8目标检测创新改进与实战案例专栏 介绍 摘要 文…

如何将照片从POCO手机传输到Mac电脑

将照片从POCO手机传输到Mac电脑可能会有些困难&#xff0c;因为与iPhone不同&#xff0c;POCO设备没有原生的macOS支持。这常常让用户寻找简单、有效的方法来移动图片&#xff0c;同时避免丢失质量&#xff0c;节省时间&#xff0c;并避免复杂的软件设置。如果你想知道如何将照…

最新教程 | CentOS 7 内网环境 Nginx + ECharts 页面离线部署手册(RPM 安装方式)

&#x1f4c1; 一、准备阶段&#xff08;在联网电脑上完成&#xff09; 1.1 下载 Nginx 官方 RPM 安装包 在联网电脑浏览器中访问 Nginx 官方稳定版本仓库&#xff1a; &#x1f517; 地址&#xff1a;http://nginx.org/packages/centos/7/x86_64/ ☁️云盘&#xff1a;htt…

Redis 常用数据类型 (下)

文章目录前言一 Hash 哈希1. Hash 相关命令hset 和 hgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyincrbyfloat2. Hash 命令小结3. Hash 内部编码Hash 在缓存中的应用场景介绍缓存方式对比二、List 列表1. LIST总体介绍2. List 普通命令lpushlpushxrpushrpushxlrange…