当前位置: 首页 > news >正文

实验四:MyBatis 的关联映射

目录:

一 、实验目的:

熟练掌握实体之间的各种映射关系。

二 、预习要求:

预习数据库原理中所讲过的一对一、一对多和多对多关系

三、实验内容:

1. 查询所有订单信息,关联查询下单用户信息(注意:因为一个订单信息只会是一个人 下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。

如果从用户信息 出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。)

2. 查询所有用户信息及用户关联的订单信息(用户信息和订单信息为一对多关系)。

四、实验方法和步骤:

实验前准备:

创建数据库,user表,order表

CREATE DATABASE experience03;
USE experience03;DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`birthday` date NULL DEFAULT NULL,`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`address` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ;INSERT INTO `user` VALUES (1, '关羽', '2024-09-29', '男', '蜀国');
INSERT INTO `user` VALUES (2, '梁王孙', '2024-09-11', '男', '北京市');
INSERT INTO `user` VALUES (3, '陈长生', '2024-05-14', '女', '京都西庙');
INSERT INTO `user` VALUES (4, '王婆', '2024-09-05', '女', '快远');
INSERT INTO `user` VALUES (5, '黄忠', '2016-07-24', '1', '三国');
INSERT INTO `user` VALUES (6, '张飞', '2024-10-16', '女', '三国');
INSERT INTO `user` VALUES (7, 'lucky', '2021-10-08', '男', '三国');
INSERT INTO `user` VALUES (14, '关羽', '2024-12-02', '男', '蜀国');

创建User:

package com.hasut.pojo;import java.util.Date;public class User {private int id;private String username;private Date birthday;private String sex;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}
}

创建Order:

package com.hasut.pojo;import java.util.Date;public class Order {private int id;private String number;private Date createtime;private String note;private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", number='" + number + '\'' +", createtime=" + createtime +", note='" + note + '\'' +", user=" + user +'}';}
}

1. 查询所有订单信息(从订单出发一对一

关联查询下单用户信息(注意:因为一个订单信息只会是一个人 下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。

如果从用户信息 出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。)

sql 语句:

SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id

或者:

SELECT o.id, o.number,o.createtime,o.note,o.userId,u.username,u.birthday,u.sex,u.address
FROM `user` u, `order` o
WHERE u.id = o.userId

使用 resultMap,使用 resultMap,定义专门的 resultMap 用于映射一对一查询结 果。

①改造 pojo 类 在 Order 类中加入 User 属性,user 属性中用于存储关联查询的用户信息,因为订单关 联查询用户是一对一关系,所以这里使用单个 User 对象存储关联查询的用户信息。改造

Order 如下图:

package com.hasut.pojo;import java.util.Date;public class Order {private int id;private String number;private Date createtime;private String note;private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Order{" +"id=" + id +", number='" + number + '\'' +", createtime=" + createtime +", note='" + note + '\'' +", user=" + user +'}';}
}

②Mapper.xml 这里 resultMap 指定 orderUserResultMap,如下:

<resultMap id="findOrderWithUserResultMap" type="com.haust.pojo.Orders"><id property="id" column="id"/><result property="number" column="number"/><result property="createtime" column="createtime"/><result property="note" column="note"/><association property="user" javaType="User"><id property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="sex" column="sex"/><result property="address" column="address"/></association></resultMap><select id="findOrderAndUserById" parameterType="int" resultMap="findOrderWithUserResultMap">SELECT o.id, o.number,o.createtime,o.note,o.userId,u.username,u.birthday,u.sex,u.addressFROM `user` u, `order` oWHERE u.id = o.userId</select>

③Mapper 接口

编写 UserMapper 如下图:

List<Orders> findOrderAndUserById(int id);

④测试方法

@Testpublic void test09() throws IOException {String resources = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resources);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);List<Orders> list = ordersMapper.findOrderAndUserById(1);for (Orders o : list){System.out.println(list);}sqlSession.commit();sqlSession.close();}

⑤实验效果

测试效果如下图:

2. 查询所有用户信息及用户关联的订单信息(从用户出发,为一对多关系)。

用户信息和订单信息为一对多关系

sql 语句:

SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id

SELECT u.id,u.username,u.birthday,u.sex,u.address,o.id oid,o.number,o.createtime,o.note
FROM `user` u, `order` o
WHERE u.id = o.userId

①修改 pojo 类

在 User 类中加入 List orders 属性,如下图:

package com.haust.pojo;import java.util.Date;
import java.util.List;public class User {private int id;private String username;private Date birthday;private String sex;private String address;private List<Orders> ordersList;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public List<Orders> getOrdersList() {return ordersList;}public void setOrdersList(List<Orders> ordersList) {this.ordersList = ordersList;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", ordersList=" + ordersList +'}';}
}

②UserMapper.xml

在 UserMapper.xml 添加 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.haust.mapper.UserMapper"><resultMap id="findOrderWithUserResultMap2" type="com.haust.pojo.User"><id property="id" column="id"/><result property="username" column="username"/><result property="birthday" column="birthday"/><result property="sex" column="sex"/><result property="address" column="address"/><collection property="ordersList" ofType="com.haust.pojo.Orders"><id property="id" column="id"/><result property="number" column="number"/><result property="createtime" column="createtime"/><result property="note" column="note"/></collection></resultMap><select id="findOrderAndUserById2" parameterType="int" resultMap="findOrderWithUserResultMap2">SELECT u.id,u.username,u.birthday,u.sex,u.address,o.id oid,o.number,o.createtime,o.noteFROM `user` u, `order` oWHERE u.id = o.userIdand u.id = #{id}</select>
</mapper>

③Mapper 接口

编写 UserMapper 接口,如下图:

public interface UserMapper {List<User> findOrderAndUserById2(int id);
}

④测试方法

在 UserMapperTest 增加测试方法,如下

@Testpublic void test10() throws IOException {String resources = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resources);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> list = userMapper.findOrderAndUserById2(2);for (User o : list){System.out.println(o);}sqlSession.commit();sqlSession.close();}

⑤效果

测试效果如下图:

相关文章:

实验四:MyBatis 的关联映射

目录&#xff1a; 一 、实验目的&#xff1a; 熟练掌握实体之间的各种映射关系。 二 、预习要求&#xff1a; 预习数据库原理中所讲过的一对一、一对多和多对多关系 三、实验内容&#xff1a; 1. 查询所有订单信息&#xff0c;关联查询下单用户信息(注意&#xff1a;因为一…...

【Leetcode】189.轮转数组

题目链接&#xff1a; 189.轮转数组 题目描述&#xff1a; 解题思路&#xff1a; 要想实现数组元素向右轮转k个位置&#xff0c;可是将数组三次反转来实现 以 nums [1,2,3,4,5,6,7], k 3 为例&#xff0c;最终要得到[5,6,7,1,2,3,4]: 第一次反转&#xff1a;将整个数组反转…...

【JavaSE】常见面试问题

1. 什么是 Java 中的多态&#xff1f; 多态是 Java 中面向对象的核心特性之一&#xff0c;指的是同一操作作用于不同类型的对象时表现出不同的行为。通过方法重载和方法重写实现。方法重载是同一方法名&#xff0c;根据参数不同做不同处理&#xff0c;属于编译时多态&#xff…...

【超详图文】多少样本量用 t分布 OR 正态分布

文章目录 相关教程相关文献预备知识Lindeberg-Lvy中心极限定理 t分布的来历实验不同分布不同抽样次数的总体分布不同自由度相同参数的t分布&正态分布 作者&#xff1a;小猪快跑 基础数学&计算数学&#xff0c;从事优化领域7年&#xff0c;主要研究方向&#xff1a;MIP求…...

leetcode hot100【Leetcode 416.分割等和子集】java实现

Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums &#xff0c;你需要将该数组分割成两个子集&#xff0c;使得两个子集的元素和相等。如果可以分割&#xff0c;返回 true &#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,…...

《算法导论》英文版前言To the teacher第4段研习录:有答案不让用

【英文版】 Departing from our practice in previous editions of this book, we have made publicly available solutions to some, but by no means all, of the problems and exercises. Our Web site, http://mitpress.mit.edu/algorithms/, links to these solutions. Y…...

Laravel关联模型查询

一&#xff0c;多表关联 文章表articles 和user_id,category_id关联 //with()方法是渴求式加载&#xff0c;缓解了1N的查询问题&#xff0c;仅需11次查询就能解决问题&#xff0c;可以提升查询速度。with部分没有就以null输出&#xff0c;所以可以理解为 多表 left join 查…...

Clickhouse 数据类型

文章目录 字符串类型数值类型日期时间类型枚举类型数组类型元组类型映射类型其它类型 字符串类型 数据类型描述备注String可变长度字符串无长度限制&#xff0c;适用于存储任意字符FixedString固定长度字符串定长字符串&#xff0c;长度在创建时指定&#xff0c;如 FixedStrin…...

物联网智能项目如何实现设备高效互联与数据处理?

一、硬件&#xff08;Hardware&#xff09; 设备互联的基础&#xff0c;涵盖传感器、执行器、网关和边缘计算设备。 传感器与执行器 功能&#xff1a; 采集环境数据&#xff08;如温度、湿度、运动等&#xff09;并执行控制命令。优化方向&#xff1a; 低功耗、高精度传感器以…...

【云服务器】搭建博客服务

未完待续 一、云服务器二、1panel安装及其容器三、Halo博客 一、云服务器 选择了狗云服务器&#xff1a;狗云-高性价比的服务器 安装系统&#xff1a;Ubuntu22.04 前期配置&#xff1a; 修改ssh端口&#xff1a; 二、1panel安装及其容器 三、Halo博客 主题&#xff1a;butt…...

如何抽象策略模式

策略模式是什么 策略设计模式&#xff08;Strategy Pattern&#xff09;是一种面向对象设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…...

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…...

node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie&#xff0c;token&#xff0c;session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤&#xff0c;⽐如⼏万条数据&#xff0c;放在⼀个⻚⾯显⽰的话显然不友好&#xff0c;这时候就需要采⽤分⻚…...

34 基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…...

【Linux】用户操作命令

声明&#xff1a;以下内容均学习自《Linux就该这么学》一书 1、管理员root Linux系统的管理员之所以是root&#xff0c;并不是因为它的名字叫root&#xff0c;而是因为该用户的身份号码UID&#xff08;User IDentification&#xff09;的数值是0。UID相当于身份证号码&#x…...

Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档

家政服务系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着人们生活水平的提高&#xff0c;老龄化、少子化等多重因素影响&#xff0c;我国对家政服务人群的需求与日俱增。家政服务行业对我国的就业和社会效益贡献也与日俱增&#…...

windows部署PaddleSpeech详细教程

windows安装paddlespeech步骤&#xff1a; 1. 安装vs c编译环境 对于 Windows 系统&#xff0c;需要安装 Visual Studio 来完成 C 编译环境的安装。 Microsoft C Build Tools - Visual Studio 2. 安装conda conda create -y -p paddlespeech python3.8 conda activate pad…...

线程条件变量 生产者消费者模型 Linux环境 C语言实现

只能用来解决同步问题&#xff0c;且不能独立使用&#xff0c;必须配合互斥锁一起用 头文件&#xff1a;#include <pthread.h> 类型&#xff1a;pthread_cond_t PTHREAD_COND_INITIALIZER 初始化 初始化&#xff1a;int pthread_cond_init(pthread_cond_t * cond, NULL);…...

C++ packaged_task

packaged_task 是 C11 标准库中引入的一个模板类&#xff0c;它用于将可调用对象&#xff08;如函数、lambda 表达式、函数对象或绑定表达式&#xff09;包装起来&#xff0c;并允许异步地获取其结果packaged_task 类提供了一种方便的方式来创建任务&#xff0c;这些任务可以被…...

【联表查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...