MyBatis-Flex关联查询
MyBatis-Flex关联查询
在 MyBatis-Flex 中,我们内置了 3 种方案,帮助用户进行关联查询,比如 一对多
、一对一
、多对一
、多对多
等场景,他们分别是:
- 方案1:Relations 注解
- 方案2:Field Query
- 方案3:Join Query
其中理解一下使用注解形式关联查询
方案一:
在 MyBatis-Flex 中,提供了 4 个 Relations 注解,他们分别是:
- RelationOneToOne:用于一对一的场景
- RelationOneToMany:用于一对多的场景
- RelationManyToOne:用于多对一的场景
- RelationManyToMany:用于多对多的场景
一对一 @RelationOneToOne
1、什么是:RelationOneToOne
它是用来告诉 MyBatis-Flex:这两个对象之间是一对一的关系,查询账户的时候,顺便把对应的身份证也查出来。
你可以把「账户」和「身份证」看作现实生活中的「一个人」和「他的身份证」,一个人只能有一个身份证,这就是所谓的 一对一关系。代码如下所示:
Account.java :
public class Account implements Serializable {@Id(keyType = KeyType.Auto)private Long id;private String userName;@RelationOneToOne(selfField = "id", targetField = "accountId")private IDCard idCard;//getter setter
}
这个意思是:
- 我的
Account
(账户)类里面有一个idCard
(身份证)属性。 - 我要把
id
和IDCard
中的accountId
对上号,才能找到它的身份证。
你可以理解成「Account 的 id 是 1,就去 IDCard 表里找 accountId=1 的那张身份证。」
IDCard.java :
@Table(value = "tb_idcard")
public class IDCard implements Serializable {private Long accountId;private String cardNo;private String content;//getter setter
}
这个方法跟普通的 selectAll()
不一样,它会自动把关联的 IDCard
一起查出来。
如果你写的是:
accountMapper.selectAll(); // 这个不会查身份证,idCard 是 null
那就查不到身份证信息。
2、 查询的 SQL 是啥样的?
它其实会执行两条 SQL:
-- 查账户
SELECT id, user_name FROM tb_account;-- 再查身份证
SELECT account_id, card_no, content FROM tb_idcard WHERE account_id IN (1,2,3,4,5);
也就是说,它帮你查了两次,然后把数据合并起来了。对应的结果如下:
[Account{id=1, userName='孙悟空', idCard=IDCard{accountId=1, cardNo='0001', content='内容1'}},Account{id=2, userName='猪八戒', idCard=IDCard{accountId=2, cardNo='0002', content='内容2'}},...
]
补充说明
情况 1:IDCard
是 VO 或 DTO
如果你这个 IDCard
不是数据库实体(也就是没有 @Table
注解),比如只是个数据传输对象,那你得手动告诉它「去哪个表查」。
@RelationOneToOne(targetField = "accountId", targetTable = "tb_idcard")
总结一句话:
用
@RelationOneToOne
可以让你在查主表的时候,自动把关联的子表(比如身份证)一块查出来,少写 SQL,多做事
一对多关系@RelationOneToMany
假设你有一个账户(Account),这个账户买了很多本书(Book)。一个账户对应很多本书,这就是典型的一对多关系。代码如下:
public class Account {private Long id;private String userName;@RelationOneToMany(selfField = "id", targetField = "accountId")private List<Book> books; // 这个账户拥有的书籍列表
}
selfField = "id"
:账户自己的 idtargetField = "accountId"
:书籍表中表示“属于哪个账户”的字段
就是:我账户的 id = 1,就去 Book 表里查 accountId = 1 的所有书,执行的 SQL:
SELECT id, user_name FROM tb_account;SELECT id, account_id, title FROM tb_book WHERE account_id IN (1, 2, 3, 4, 5);
它会自动查出每个账户的所有书,帮你组装好 List<Book>
。每个账户对象里,books
属性都是一个 List。查询结果如下:
Account{id=1, userName="孙悟空", books=[Book{id=1, accountId=1, title="西游记"},Book{id=2, accountId=1, title="大圣归来"}
]}
进阶用法:
Map 映射想把书存在 Map
里咋办?
复制编辑
@RelationOneToMany(selfField = "id", targetField = "accountId", mapKeyField = "id")
private Map<Long, Book> books;
- 意思是:把每本书的
id
当作 Map 的 key,Book 当作 value 存起来
{1L -> Book{id=1, accountId=1, title="西游记"},2L -> Book{id=2, accountId=1, title="大圣归来"}
}
是不是很方便用 key 快速访问某本书?
selfValueSplitBy 分割查询
场景举例:
病人表 Patient
里有个字段 diseaseIds
是个字符串:
比如 "1,2,3"
表示这个人有 1、2、3 号疾病。
我们希望在查出病人的时候,自动把这些疾病的名字查出来,甚至生成 List<String>
或 Map<String, Disease>
。
@RelationOneToMany(selfField = "diseaseIds", // 是个字符串,像 "1,2,3"selfValueSplitBy = ",", // 用逗号分割targetTable = "tb_disease", // 从 tb_disease 表中查targetField = "diseaseId", // 对应疾病表的主键valueField = "name" // 我只要疾病名就行
)
private List<String> diseaseNameList;
还可以这样:
@RelationOneToMany(selfField = "diseaseIds",selfValueSplitBy = ",",targetField = "diseaseId",mapKeyField = "diseaseId"
)
private Map<String, Disease> diseaseMap;
执行的 SQL
-- 查病人
SELECT patient_id, name, disease_ids, tag_ids FROM tb_patient;-- 再查疾病信息
SELECT disease_id, name FROM tb_disease WHERE disease_id IN ('1','2','3');
查询结果
{"patientId": 4,"name": "赵六","diseaseIds": "1,2,3","diseaseNameList": ["心脑血管疾病","消化系统疾病","神经系统疾病"],"diseaseMap": {"1": {"diseaseId": "1", "name": "心脑血管疾病"},"2": {"diseaseId": "2", "name": "消化系统疾病"},"3": {"diseaseId": "3", "name": "神经系统疾病"}}
}
是不是很神奇?你只存了个 "1,2,3"
的字符串,它就帮你拆开、查表、拼好返回。总结一句话:
@RelationOneToMany
:一对多,查主表时自动加载子表列表(List/Map 都行);mapKeyField
:可以让子表结果以 Map 的形式返回;selfValueSplitBy
:把主表字段按逗号、斜杠等切割成多个值,查子表用;valueField
:只要子表中的某个字段,直接返回成 List,比如 List。
多对一 @RelationManyToOne
场景举例
- 一个账户(Account)可以拥有很多本书(Book)——这是“一对多”;
- 从书籍(Book)的角度来看,每本书只属于一个账户——这就是“多对一”。
所以现在我们站在 Book(多) 的角度,去查它所属的 Account(一),就是“多对一”。
账户类(Account)——还是很简单的主表:
public class Account implements Serializable {@Id(keyType = KeyType.Auto)private Long id;private String userName;// getter / setter
}
书籍类(Book)——配置多对一关系:
@Table(value = "tb_book")
public class Book implements Serializable {@Id(keyType = KeyType.Auto)private Long id;private Long accountId; // 外键,关联账户private String title;@RelationManyToOne(selfField = "accountId", targetField = "id")private Account account; // 多对一:一本书关联一个账户// getter / setter
}
注解说明
selfField = "accountId"
:表示书籍里这个字段是“关联账户的 ID”;targetField = "id"
:表示账户类的主键;- 因为账户类的主键是
id
,所以可以简写为:
@RelationManyToOne(selfField = "accountId")
查询方式
List<Book> books = bookMapper.selectAllWithRelations();
注意: selectAllWithRelations()
必须使用这个方法,MyBatis-Flex 才会自动加载关联关系。
SQL 实际执行
-- 查书本
SELECT id, account_id, title FROM tb_book;-- 查账户
SELECT id, user_name FROM tb_account WHERE id IN (1, 2, 3);
系统会自动分析你有哪些 accountId
,一次性查出相关账户信息,组装进去。
查询结果展示
Book{id=1, title="Java 编程", accountId=1, account={id=1, userName="孙悟空"
}}Book{id=2, title="Spring Boot", accountId=2, account={id=2, userName="猪八戒"
}}
你只写了一个 accountId
,系统就帮你查到了完整的 Account
对象。
总结一句话:
@RelationManyToOne
是从“子表”反向查“主表”的配置方式,常见于像“书籍 -> 账户”,“订单 -> 用户”,“评论 -> 帖子”这样的场景。
多对多 @RelationManyToMany
场景举例
我们来看一个经典的业务场景:
一个账户(Account)可以拥有多个角色(Role),比如“管理员”、“用户”、“VIP”;
一个角色(Role)也可以被多个账户拥有,比如“管理员”可能对应了孙悟空、猪八戒两个账户。
这个就是一个标准的 多对多关系。
多对多实现过程?
多对多在数据库中,不能直接一张表对另一张表,所以需要用一张 中间表 来“桥接”两边的关系。
中间表叫做:tb_role_mapping
,结构如下:
CREATE TABLE tb_role_mapping (account_id INTEGER,role_id INTEGER
);
作用:
记录“哪个账户”关联了“哪个角色”。
比如:
account_id | role_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
这表示:
- 账户1有角色1和2
- 账户2有角色1
实体类写法
Account.java
public class Account implements Serializable {@Id(keyType = KeyType.Auto)private Long id;private String userName;@RelationManyToMany(joinTable = "tb_role_mapping", // 中间表joinSelfColumn = "account_id", // 中间表中对 account 的字段joinTargetColumn = "role_id" // 中间表中对 role 的字段)private List<Role> roles; // 多个角色// getter / setter
}
Role.java
@Table(value = "tb_role")
public class Role implements Serializable {private Long id;private String name;// getter / setter
}
注解说明
属性 | 说明 |
---|---|
joinTable | 中间表的名字(桥梁) |
joinSelfColumn | 中间表里对应当前类(Account)的字段 |
joinTargetColumn | 中间表里对应目标类(Role)的字段 |
selfField 和 targetField | 当前类 和 目标类 的主键字段名,如果默认是 id ,可以省略 |
所以只写:
@RelationManyToMany(joinTable = "tb_role_mapping",joinSelfColumn = "account_id",joinTargetColumn = "role_id"
)
就够了,MyBatis-Flex 会自动去找 id
字段。
查询示例
List<Account> accounts = accountMapper.selectAllWithRelations();
执行的 SQL 类似于:
-- 查账户
SELECT id, user_name FROM tb_account;-- 查中间表
SELECT account_id, role_id FROM tb_role_mapping WHERE account_id IN (1, 2, 3);-- 查角色表
SELECT id, name FROM tb_role WHERE id IN (1, 2, 3);
查询结果
[Account{id=1,userName='孙悟空',roles=[Role{id=1, name='管理员'},Role{id=2, name='VIP'}]},Account{id=2,userName='猪八戒',roles=[Role{id=1, name='管理员'}]}
]
MyBatis-Flex 会自动:
- 查出账户;
- 用中间表找到账户对应的角色ID;
- 再查出对应的角色列表,自动装配进来。
总结一句话:
@RelationManyToMany
就是用来处理“多对多”的关系,通过一个中间表桥接两个实体,MyBatis-Flex 自动帮你搞定 SQL 和关系映射。
相关文章:
MyBatis-Flex关联查询
MyBatis-Flex关联查询 在 MyBatis-Flex 中,我们内置了 3 种方案,帮助用户进行关联查询,比如 一对多、一对一、多对一、多对多等场景,他们分别是: 方案1:Relations 注解方案2:Field Query方案3…...
Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词
文章目录 前言一、核心特性对比二、典型场景推荐1. 选择盘古分词的场景2. 选择结巴分词的场景 三、关键指标实测对比1. 分词质量测试(F1值)2. 性能测试(单线程) 四、如何选择?决策树五、进阶优化建议1. 盘古分词优化方…...
YOLOv11实战电力设备缺陷检测
本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化,该数据集包含丰富的电力设备缺…...
LINUX 5 vim cat zip unzip
dd u撤销 ctrlr取消撤销 q!刚才的操作不做保存 刚才是编辑模式 现在是可视化模式 多行注释...
Redis的常见命令
Redis的常见命令 官方命令文档:https://redis.io/docs/latest/commands/ 文章目录 Redis的常见命令Redis数据结构介绍Redis通用命令1.String类型2.Hash类型3.List类型List类型的常见命令:利用List结构实现:栈、队列、阻塞队列: 4.…...
LeetCode第131题_分割回文串
LeetCode 第131题:分割回文串 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 难度 中等 题目链接 点击在LeetCode中查看题目 示…...
网络钓鱼攻击的威胁和执法部门的作用(第一部分)
在当今的数字世界中,网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段,用于欺骗人们提供敏感信息,例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...
用Scala玩转Flink:从零构建实时处理系统
大家好!欢迎来到 Flink 的奇妙世界!如果你正对实时数据处理充满好奇,或者已经厌倦了传统批处理的漫长等待,那么你找对地方了。本系列文章将带你使用优雅的 Scala 语言,一步步掌握强大的流处理引擎——Apache Flink。 今…...
【LeetCode】算法详解#3 ---最大子数组和
1.题目介绍 给定一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 1 < nums.length < 105-104 < nums[i] < 104 2.解决思路 要求出…...
基于Python的心衰疾病数据可视化分析系统
【Python】基于Python的心衰疾病数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python开发,重点针对5000条心衰疾病患者的数据进行可视化分析&#…...
oracle批量删除分区
为了清理数据,往往需要删除一些分区 简单查看当前分区 附件 --创建测试表 -- drop table test_part purge;CREATE TABLE test_part (sales_id NUMBER,sale_date DATE,amount NUMBER ) PARTITION BY RANGE (sale_date) INTERVAL (INTERVAL 1 MONTH) -- 每个月创建…...
Android Compose入门和基本使用
文章目录 一、Jetpack Compose 介绍Jetpack Compose是什么Composable 函数命令式和声明式UI组合和继承 二、状态管理什么是状态Stateremember状态提升 三、自定义布局Layout ModifierLayout Composable固有特性测量使用内置组件固有特性测量自定义固有特性测量 四、项目中使用J…...
xLua的Lua调用C#的2,3,4
使用Lua在Unity中创建游戏对象,组件: 相关代码如下: Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...
使用 Python 连接 PostgreSQL 数据库,从 `mimic - III` 数据库中筛选数据并导出特定的数据图表
要使用 Python 连接 PostgreSQL 数据库,从 mimic - III 数据库中筛选数据并导出特定的数据图表,你可以按照以下步骤操作: 安装所需的库:psycopg2 用于连接 PostgreSQL 数据库,pandas 用于数据处理,matplot…...
算法刷题记录——LeetCode篇(2.6) [第151~160题](持续更新)
更新时间:2025-04-06 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 152. 乘积最大子数组 给你一个…...
Dijkstra求最短路径问题(优先队列优化模板java)
首先 1. 主类定义与全局变量 public class Main {static int N 100010; // 最大节点数static int INF Integer.MAX_VALUE; // 无穷大static ArrayList<Pair>[] G new ArrayList[N]; // 邻接表存储图static int[] dis new int[N]; // 存储每个节点的最短…...
【软件测试】性能测试 —— 基础概念篇
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容主要介绍性能测试相关知识,首先我们需要了解性能测试是什么,本期内容主要介绍性能测试…...
Jmeter脚本使用要点记录
一,使用Bean shell获取请求响应的数据 byte[] result prev.getResponseData(); String str new String(result); System.out.println(str);其中,prev是jmeter的内置变量,直接使用即可。 二,不同的流程中传参数 vars.put(&quo…...
HTML5
HTML5是对HTML标准的第5次修订 HTML是超文本标记语言的简称,是为【网页创建和其它可在网页浏览器中所看到信息】而设计的一种标记性语言。 H5优点:跨平台使用将互联网语义化,更好地被人类与机器所理解降低了对浏览器的依赖,更好地…...
算法—博弈问题
1.博弈问题 1.前提:每一步都是最优解的情况下,先手的那个人已经确定了胜负 用dp数组记录每一步操作后的结果,如果下一步会出现必输结果,那么说明执行这步操作的人必胜,因为必输结果的下一步操作后都是必胜的结果,所以在…...
vector模拟实现(2)
1.构造函数 2.拷贝构造 我们利用push_back和reserve来实现拷贝构造。 3.迭代器的实现 由于底层是一段连续的空间,所以我们选择用指针来实现迭代器。 4.swap 这里的swap函数是有两种方法,一种是开辟一段新的空间,然后memcpy来把原来的数据拷…...
【嵌入式系统设计师】知识点:第3章 嵌入式硬件设计
提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...
输入框输入数字且保持精度
在项目中如果涉及到金额等需要数字输入且保持精度的情况下,由于输入框是可以随意输入文本的,所以一般情况下可能需要监听输入框的change事件,然后通过正则表达式去替换掉不匹配的文本部分。 由于每次文本改变都会被监听,包括替换…...
Vue3中的Inject用法全解析
大家好呀~今天给大家带来一个超级实用的Vue3技巧:如何使用inject进行组件间的通信!如果你对组件间的数据传递、事件触发感兴趣,那一定不要错过这篇文章哦!话不多说,直接开整~ 🌟 什么…...
FPGA同步复位、异步复位、异步复位同步释放仿真
FPGA同步复位、异步复位、异步复位同步释放仿真 xilinx VIVADO仿真 行为仿真 综合后功能仿真,综合后时序仿真 实现后功能仿真,实现后时序仿真 目录 前言 一、同步复位 二、异步复位 三、异步复位同步释放 总结 前言 本文将详细介绍FPGA同步复位、异…...
深度解析需求分析:理论、流程与实践
深度解析需求分析:理论、流程与实践 一、需求分析的目标(一)准确捕捉用户诉求(二)为开发提供清晰指引 二、需求分析流程(一)需求获取(二)需求整理(三…...
QT学习笔记4--事件
1. 鼠标事件 1.1 鼠标按下 QObject中的mousePressEvent()方法 在子类中重写该方法,就可以处理鼠标按下 void myLabel::mousePressEvent(QMouseEvent *ev) {if (ev->button() Qt::LeftButton) {QString str QString("mouse press x %1, y %2").…...
AnimateCC基础教学:json数据结构的测试
一.核心代码: const user1String {"name": "张三", "age": 30, "gender": "男"}; const user1Obj JSON.parse(user1String); console.log("测试1:", user1Obj.name, user1Obj.age, user1Obj.gender);/*const u…...
针对Qwen-Agent框架的源码阅读与解析:FnCallAgent与ReActChat篇
在《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析:Agent基类篇》中,我们已经了解了Agent基类的大体实现。这里我们就再详细学习一下FnCallAgent类和ReActChat的实现思路,从而对Agent的两条主流技术路径有更深刻的了解。同时&am…...
在docker中安装RocketMQ
第一步你需要有镜像包,这个2023年的时候docker就不能用pull拉取镜像了,需要你自己找 第二步我用的是FinalShell,用别的可视化界面也用, 在你自己平时放镜像包的地方创建一个叫rocketmq的文件夹,放入镜像包后,创建一个…...
Spring Boot + Kafka 消息队列从零到落地
背景 依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.1</version> </dependency> 发送消息 //示例: private final KafkaTemplate<St…...
《打破语言壁垒:bilingual_book_maker 让外文阅读更轻松》
在寻找心仪的外文电子书时,常常会因语言障碍而感到困扰。虽然可以将文本逐段复制到在线翻译工具中,但这一过程不仅繁琐,还会打断阅读的连贯性,让人难以沉浸其中。为了克服这一难题,我一直在寻找一种既能保留原文&#…...
JCR一区文章,壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码
本文提出了一种新颖的基于群体智能的元启发式优化算法——壮丽细尾鹩优化算法(SFOA),SFOA从精湛的神仙莺的生活习性中汲取灵感。融合了精湛的神仙莺群体中幼鸟的发育、繁殖后鸟类喂养幼鸟的行为以及它们躲避捕食者的策略。通过模拟幼鸟生长、繁殖和摄食阶…...
Kafka 如何实现 Exactly Once
Kafka 中实现 Exactly Once Semantics(EOS,精确一次语义),是为了确保: 每条消息被处理一次且仅一次,既不会丢失,也不会重复消费。 这是一种在分布式消息系统中非常难实现的语义。Kafka 从 0.11 …...
在K8S中,内置的污点主要有哪些?
在Kubernetes (K8S)中,内置的污点(Taints)主要用于自动化的节点亲和性和反亲和性管理。当集群中的节点出现某种问题或满足特定条件时,kubelet会自动给这些节点添加内置污点。以下是一些常见的内置污点: node.kubernete…...
AI大模型:(二)2.1 从零训练自己的大模型概述
目录 1. 分词器训练 1.1 分词器概述 1.2 训练简述 2.预训练 2.1 预训练概述 2.2 预训练过程简介 3.微调训练 3.1 微调训练概述 3.2 微调过程简介 4.人类对齐 4.1 人类对齐概述 4.2 人类对齐训练过程简介 近年来,大语言模型(LLM)如GPT-4、Claude、LLaMA等…...
电动垂直起降飞行器(eVTOL)
电动垂直起降飞行器(eVTOL)的详细介绍,涵盖定义、技术路径、应用场景、市场前景及政策支持等核心内容: 一、定义与核心特性 eVTOL(Electric Vertical Take-off and Landing)即电动垂直起降飞行器…...
LM Studio本地部署大模型
现在的AI可谓是火的一塌糊涂, 看到使用LM Studio部署本地模型非常的方便, 于是我也想在自己的本地试试 LM Studio 简介 LM Studio 是一款专为本地运行大型语言模型(LLMs)设计的桌面应用程序,支持 Windows 和 macOS 系统。它允许用户在个人电…...
PyTorch 深度学习 || 6. Transformer | Ch6.1 Transformer 框架
1. Transformer 框架...
SLAM文献之-SLAMesh: Real-time LiDAR Simultaneous Localization and Meshing
SLAMesh 是一种基于 LiDAR 的实时同步定位与建图(SLAM)算法,其核心创新点在于将定位与稠密三维网格重建相结合,通过动态构建和优化多边形网格(Mesh)来实现高精度定位与环境建模。以下是其算法原理的详细解析…...
[Python] 位置相关的贪心算法-刷题+思路讲解版
位置贪心-题目目录 例题1 - 香蕉商人编程实现输入描述输出描述思路AC代码 例题2 - 分糖果编程实现输入描述输入样例输出样例思路AC代码 例题4 - 分糖果II编程实现输入描述输出描述输入样例思路AC代码 例题3 - 分糖果III编程实现输入描述输出描述输入样例输出样例思路AC代码 例题…...
练习题:125
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 导入 random 模块: 指定范围: 生成随机整数: 输出结果: 运行思路 结束语 Python题目 题目 生成一个指定范围内的随机整数。 …...
实战设计模式之迭代器模式
概述 与上一篇介绍的解释器模式一样,迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。简而言之,迭代器模式允许我们遍历集合数据结构中的元素,而不必了解这些集…...
Spring-AOP详解(AOP概念,原理,动态代理,静态代理)
目录 什么是AOP:Spring AOP核心概念需要先引入AOP依赖:1.切点(Pointcut):2.连接点:3.通知(Advice):4.切面: 通知类型:Around:环绕通知,此注解标注的通知方法在目标方法前,…...
【dify应用】将新榜排行数据免费保存到飞书表格
新榜中导出数据是收费的,如何免费导出呢 接口分析 切换分类排行,数据是在这个接口中请求的 参数: {"rankType":1,"rankDate":"2025-04-05","type":["财富"],"size":25,"…...
【Linux】线程池详解及基本实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(一)
1. 背景 arXiv简介(参考DeepSeek大模型生成内容): arXiv(发音同“archive”,/ˈɑːrkaɪv/)是一个开放的学术预印本平台,主要用于研究人员分享和获取尚未正式发表或已完成投稿的学术论文。创…...
Leetcode 3508. Implement Router
Leetcode 3508. Implement Router 1. 解题思路2. 代码实现 题目链接:3508. Implement Router 1. 解题思路 这一题就是按照题意写作一下对应的函数即可。 我们需要注意的是,这里,定义的类当中需要包含以下一些内容: 一个所有i…...
Nmap全脚本使用指南!NSE脚本全详细教程!Kali Linux教程!(六)
脚本类别 discovery(发现) sip-methods 已演示过。这里不再演示。 436. smb-enum-domains 尝试枚举系统上的域及其策略。这通常需要凭据,但 Windows 2000 除外。除了实际域之外,通常还会显示“内置”域。Windows 在域列表中返…...
了解适配器模式
目录 适配器模式定义 适配器模式角色 适配器模式的实现 适配器的应用场景 适配器模式定义 适配器模式,也叫包装模式。将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。 简单来说就是目标类不能直接…...