深入解析MyBatis-Plus中的lambdaUpdate与lambdaQuery
一、引言
在现代Java持久层开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多便捷的功能,其中lambdaUpdate
和lambdaQuery
是基于Lambda表达式的两种强大操作方式。它们不仅提高了代码的可读性,还减少了SQL编写错误,是MyBatis-Plus的核心特性之一。
二、lambdaQuery详解
2.1 基本概念
lambdaQuery
是MyBatis-Plus提供的基于Lambda表达式的查询构造器,它允许开发者以类型安全的方式构建查询条件。
2.2 基本使用
// 查询name为"张三"的用户列表
List<User> users = userService.lambdaQuery().eq(User::getName, "张三").list();// 查询age大于18且name包含"张"的用户
List<User> userList = userService.lambdaQuery().gt(User::getAge, 18).like(User::getName, "张").list();
2.3 链式操作
lambdaQuery
支持丰富的链式操作方法:
方法名 | 说明 | 示例 |
---|---|---|
eq | 等于 (=) | .eq(User::getName, “张三”) |
ne | 不等于 (<>) | .ne(User::getAge, 18) |
gt | 大于 (>) | .gt(User::getAge, 18) |
ge | 大于等于 (>=) | .ge(User::getScore, 60) |
lt | 小于 (<) | .lt(User::getAge, 30) |
le | 小于等于 (<=) | .le(User::getScore, 100) |
between | BETWEEN 值1 AND 值2 | .between(User::getAge, 18, 30) |
notBetween | NOT BETWEEN 值1 AND 值2 | .notBetween(User::getAge, 18, 30) |
like | LIKE ‘%值%’ | .like(User::getName, “张”) |
notLike | NOT LIKE ‘%值%’ | .notLike(User::getName, “张”) |
likeLeft | LIKE ‘%值’ | .likeLeft(User::getName, “三”) |
likeRight | LIKE ‘值%’ | .likeRight(User::getName, “张”) |
2.4 复杂查询示例
// 多条件组合查询
List<User> complexQuery = userService.lambdaQuery().eq(User::getStatus, 1).and(q -> q.gt(User::getAge, 18).or().lt(User::getScore, 60)).orderByDesc(User::getCreateTime).last("LIMIT 10").list();
三、lambdaUpdate详解
3.1 基本概念
lambdaUpdate
是MyBatis-Plus提供的基于Lambda表达式的更新构造器,它允许开发者以类型安全的方式构建更新操作。
3.2 基本使用
// 将name为"张三"的用户的age更新为25
boolean update = userService.lambdaUpdate().eq(User::getName, "张三").set(User::getAge, 25).update();// 将status为0且age大于30的用户status更新为1
boolean batchUpdate = userService.lambdaUpdate().eq(User::getStatus, 0).gt(User::getAge, 30).set(User::getStatus, 1).update();
3.3 链式操作
lambdaUpdate
除了支持lambdaQuery
的条件方法外,还支持以下更新特定方法:
方法名 | 说明 | 示例 |
---|---|---|
set | 设置更新字段 | .set(User::getAge, 25) |
setSql | 设置更新SQL片段 | .setSql(“age = age + 1”) |
remove | 删除记录(需谨慎使用) | .eq(User::getId, 1).remove() |
3.4 复杂更新示例
// 条件更新多个字段
boolean complexUpdate = userService.lambdaUpdate().eq(User::getDepartment, "技术部").set(User::getLevel, "高级").set(User::getSalary, salaryService.calculateNewSalary()).update();// 使用setSql进行复杂更新
boolean sqlUpdate = userService.lambdaUpdate().eq(User::getStatus, 0).setSql("balance = balance + bonus").update();
四、lambdaQuery与lambdaUpdate的高级特性
4.1 实体条件与Lambda条件的混合使用
User queryEntity = new User();
queryEntity.setStatus(1);List<User> users = userService.lambdaQuery().eq(User::getAge, 25).and(q -> q.applyEntity(queryEntity)) // 混合实体条件.list();
4.2 嵌套条件查询
// 复杂嵌套条件
List<User> nestedQuery = userService.lambdaQuery().eq(User::getType, 1).and(q -> q.gt(User::getAge, 18).or().lt(User::getScore, 60)).or(q -> q.eq(User::getStatus, 2).and(q2 -> q2.like(User::getName, "admin"))).list();
4.3 联表查询模拟
虽然MyBatis-Plus本身不直接支持联表查询,但可以通过以下方式模拟:
// 先查询主表ID,再查询关联表
List<Long> userIds = userService.lambdaQuery().eq(User::getDepartment, "销售部").select(User::getId).list().stream().map(User::getId).collect(Collectors.toList());List<Order> orders = orderService.lambdaQuery().in(Order::getUserId, userIds).list();
五、性能优化与最佳实践
5.1 索引友好性
确保Lambda表达式中的字段对应数据库索引:
// 好的实践 - 使用索引字段
userService.lambdaQuery().eq(User::getId, 123) // 通常id是主键索引.eq(User::getEmail, "test@example.com") // 通常email有唯一索引.list();// 不好的实践 - 使用非索引字段作为主要条件
userService.lambdaQuery().like(User::getDescription, "重要客户") // 全文搜索字段.list();
5.2 批量操作优化
// 批量更新优化
boolean batchUpdate = userService.lambdaUpdate().in(User::getId, idList) // 使用IN而不是多次单条更新.set(User::getStatus, 1).update();// 分批次处理大数据量
List<Long> allIds = getAllUserIds();
int batchSize = 1000;
for (int i = 0; i < allIds.size(); i += batchSize) {List<Long> batchIds = allIds.subList(i, Math.min(i + batchSize, allIds.size()));userService.lambdaUpdate().in(User::getId, batchIds).set(User::getFlag, true).update();
}
5.3 避免N+1查询问题
// 不好的实践 - N+1查询
List<User> users = userService.list();
users.forEach(user -> {List<Order> orders = orderService.lambdaQuery().eq(Order::getUserId, user.getId()).list();// 处理订单
});// 好的实践 - 批量查询
List<User> users = userService.list();
List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
Map<Long, List<Order>> ordersMap = orderService.lambdaQuery().in(Order::getUserId, userIds).list().stream().collect(Collectors.groupingBy(Order::getUserId));
六、常见问题与解决方案
6.1 动态条件构建
public List<User> searchUsers(String name, Integer minAge, Integer maxAge, Integer status) {return userService.lambdaQuery().eq(StringUtils.isNotBlank(name), User::getName, name).gt(minAge != null, User::getAge, minAge).lt(maxAge != null, User::getAge, maxAge).eq(status != null, User::getStatus, status).list();
}
6.2 字段类型不匹配问题
// 枚举类型处理
userService.lambdaQuery().eq(User::getUserType, UserType.ADMIN.getCode()) // 明确使用code值.list();// 日期类型处理
LocalDate today = LocalDate.now();
userService.lambdaQuery().ge(User::getCreateTime, today.atStartOfDay()) // 转换为正确的日期时间类型.list();
6.3 与MyBatis XML映射的协作
// 在Service中
public List<User> complexQueryWithXml(String name, Integer status) {return userService.lambdaQuery().eq(StringUtils.isNotBlank(name), User::getName, name).eq(status != null, User::getStatus, status).apply("id IN (SELECT user_id FROM user_relation WHERE relation_type = {0})", 1).list();
}// 在XML中可以有更复杂的SQL
<select id="selectWithComplexJoin" resultType="com.example.User">SELECT u.* FROM user uJOIN department d ON u.dept_id = d.idWHERE d.name = #{deptName}<if test="status != null">AND u.status = #{status}</if>
</select>
七、总结
lambdaQuery
和lambdaUpdate
是MyBatis-Plus提供的强大工具,它们通过Lambda表达式实现了类型安全的SQL构建,具有以下优势:
- 类型安全:编译时检查字段名,避免拼写错误
- 代码可读性:链式调用使代码更加清晰
- 维护方便:实体类字段变更时,相关查询会立即在编译时报错
- 灵活的条件组合:支持复杂的条件组合和嵌套
在实际开发中,应根据具体场景选择合适的查询方式:
- 简单查询:使用
lambdaQuery
/lambdaUpdate
- 复杂查询:结合XML映射文件
- 动态SQL:使用
apply
方法或XML动态标签 - 批量操作:注意优化批量处理的性能
通过合理使用这些特性,可以显著提高开发效率和代码质量,同时保持数据库操作的高性能。
相关文章:
深入解析MyBatis-Plus中的lambdaUpdate与lambdaQuery
一、引言 在现代Java持久层开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多便捷的功能,其中lambdaUpdate和lambdaQuery是基于Lambda表达式的两种强大操作方式。它们不仅提高了代码的可读性,还减少了SQL编写错误,…...
OneNet云平台
一、基础信息 设备名称:test1 设备密钥:N1drd3BZc0h0WDNWaXRtdjlFbjUxTHFhTGtWcW1VWjQ 产品ID:EcO4iSzv5b url: 端口号:1883 password:version2018-10-31&resproducts%2FEcO4iSzv5b%2Fdevices%2Fte…...
使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程
使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程 在现代 Node.js 应用开发中,构建和打包流程的效率对项目的迭代速度和部署效果有着重要影响。本文将介绍如何结合 Nestjs ,Bun 和 NCC 工具,构建出高效且优化的 Node.js 应用。 一、项目构建的…...
迷你世界UGC3.0脚本Wiki组件事件管理
迷你世界UGC3.0脚本Wiki Menu On this page Sidebar Navigation 快速入门 首页 组件介绍 MOD、组件介绍 什么是Lua编程 开发者常见问题 组件介绍 组件函数 组件属性 全局函数 对象介绍 触发器脚本交互 脚本方法 二维表介绍 组件说明 事件 触发器事件管理 组件事件管理 函数库 服…...
多层pcb批量工厂哪家好?
在电子产业高速发展的当下,多层PCB作为硬件设备的核心载体,其品质与交付效率直接影响终端产品的市场竞争力。面对从消费电子到航空航天等领域的多元化需求,选择一家技术过硬、服务灵活且具备规模化生产能力的工厂至关重要。经过对当前行业动态…...
【MQ篇】RabbitMQ之死信交换机!
目录 引言:消息不死,只是变成死信?初识死信交换机:死信从哪来?DLX 干啥的?什么是死信?什么是死信交换机 (DLX)?死信的旅程:如何从队列到达 DLX 并被路由?&…...
CI/CD解决方案TeamCity在游戏开发中的应用价值与优势分析
TeamCity是用于游戏开发的最流行的CI/CD工具之一。从独立开发者到3A工作室和游戏发行商,各种规模的公司都在使用。无论您在制作流程中使用何种工具,TeamCity都支持您为任何的工作流程设置全面的构建-测试-发布管道。 TeamCity如何增强您的游戏开发工作流…...
泰迪杯实战案例超深度解析:运输车辆安全驾驶行为分析与安全评价系统设计
(第七届泰迪杯数据挖掘挑战赛C题特等奖案例解析) 一、案例背景与目标 1.1 应用场景与痛点 在道路运输行业,不良驾驶行为(如急加速、急减速、疲劳驾驶)是引发交通事故的主要诱因,占事故总量的70%以上。某运输企业通过车联网系统采集了450辆运输车辆的高频数据(每秒1条)…...
C++初阶-模板初阶
目录 1.泛型编程 2.函数模板 2.1函数模板概念 2.2实现函数模板 2.3模板的原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式初始化 2.5模板参数的匹配原则 3.类模板 3.1类模板定义格式 3.2类模板的实例化 4.总结 1.泛型编程 对广泛的类型法写代码,我…...
计算机网络自顶向下思维导图
主要就是记录下自己做的1-6章的思维导图,内容包含了每章每节内的重点内容 可能又错别字以及错误,欢迎指出 需要注意使用的是第七版的书 第一章 第二章 第二章二 第三章 第四章 第五章 第六章...
机器学习-入门-线性模型(1)
机器学习-入门-线性模型(1) 文章目录 机器学习-入门-线性模型(1)3.1 线性回归3.2 最小二乘解3.3 多元线性回归 3.1 线性回归 f ( x i ) w x i b 使得 f ( x i ) ≃ y i f(x_i) wx_i b \quad \text{使得} \quad f(x_i) \simeq y_i f(xi)wxib使得f(xi)≃yi 离散属性…...
Spark-Streaming3
无状态转换操作与有状态转换操作 无状态转换操作: 无状态转换操作仅处理当前时间跨度内的数据。例如,设置的采集时间为三秒,则只处理这三秒内的数据。 有状态转换操作(UpdateStateByKey): 有状态转换操作可以跨批次处理数据。涉及…...
【Pandas】pandas DataFrame rfloordiv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
【Spark入门】Spark简介:分布式计算框架的演进与定位
目录 1 大数据计算框架的演进历程 1.1 Hadoop MapReduce:第一代分布式计算框架 1.2 Spark的诞生与革新 2 Spark的核心架构与优势 2.1 Spark架构概览 2.2 Spark的核心优势解析 3 Spark的适用场景与定位 3.1 典型应用场景 3.2 技术定位分析 4 Spark与Hadoop…...
基于ArcGIS的洪水淹没分析技术-洪水灾害普查、风险评估及淹没制图中的实践技术
洪水灾害是全球面临的主要自然灾害之一,对人类社会和自然环境造成巨大影响。准确的洪水淹没分析对于灾害预防、风险评估及应急响应至关重要。ArcGIS作为一款强大的地理信息系统软件,在洪水淹没分析领域具有显著优势。ArcGIS的洪水淹没分析主要依赖于其强…...
【数据可视化-38】基于Plotly得泰坦尼克号数据集的多维度可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
数据库MySQL学习——day6(多表查询(JOIN)基础)
文章目录 1、关系型数据库中的表关系2、连接(JOIN)的基本概念3、INNER JOIN(内连接)3.1. 概念3.2. 语法结构 4、LEFT JOIN(左连接)4.1. 概念4.2. 语法结构 5、RIGHT JOIN(右连接)&am…...
Mysql如何高效的查询数据是否存在
文章目录 1. 三种方法2. 查询语句执行流程3. 三种方式对比 1. 三种方法 在业务中,我们有时候需要查询某个数据在数据表中是否存在,常见的方式有三种 SELECT COUNT(*) FORM tb_name WHERE conditionSELECT 1 FROM tb_name WHERE conditionSELECT EXISTS (SELECT 1 FROM tb_nam…...
MySQL快速入门篇---增删改查(下)
目录 一、修改(Update) 1.语法 2.示例 二、删除(Delete) 1.语法 2.示例 三、聚合函数 1.示例 1.1、COUNT 1.2、SUM 1.3、AVG 1.4、MAX 1.5、MIN 四、分组查询(GROUP BY) 1.语法 2.示例 …...
Mysql中隐式内连接和显式内连接的区别
1. 内连接(INNER JOIN) 内连接是数据库中一种常见的连接方式,用于从两个或多个表中返回满足连接条件的记录,即只返回两张表中匹配的行。 示例场景:有学生表(包含学生 ID 和姓名)和成绩表&…...
检测软件系统如何确保稳定运行并剖析本次检测报告?
检测软件系统,能及时找出问题,确保软件稳定运行,保障用户使用体验。下面会具体剖析本次检测报告。 检测概述 本次检测覆盖了系统性能、功能完整性等关键方面。它对软件整体状况做了严格评估。检测时对系统代码展开深度审查。还借助专业工具…...
【Office-Excel】单元格输入数据后自动填充单位
1.自定义设置单元格格式 例如我想输入数字10,回车确认后自动显示10kg。 右击单元格或者快捷键(Ctrl1),选择设置单元格格式,自定义格式输入: 0"kg"格式仍是数字,但是显示是10kg&…...
GAMES202-高质量实时渲染(Real-Time Shadows)
目录 Shadow MappingshadowMapping的问题shadow mapping背后的数学PCF(Percentage Closer Filtering)PCSS(Percentage closer soft shadows)VSSM(Variance Soft Shadow Mapping)优化步骤3优化步骤1SAT&…...
vue+neo4j+flask 音乐知识图谱推荐系统
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F027 架构: vueflaskneo4jmysql 亮点:协同过滤推荐算法知识图谱可视化 支持爬取音乐数据,数据超过3万条&…...
JavaScript 中 undefined 和 not defined 的区别
在 JavaScript 的调试过程中,你是否经常看到 undefined 却不知其来源?是否曾被 ReferenceError: xxx is not defined 的错误提示困扰?这两个看似相似的概念,实际上是 JavaScript 类型系统中最重要的分水岭。本文将带你拨开迷雾&am…...
设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
今天,设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。以下为经过工业验证的技术方案: 一、系统架构设计 采用AUTOSAR Adaptive平台构建分布式系统,核心模块包括: 车辆控制单元(VC…...
基于STM32、HAL库的HX710A模数转换器ADC驱动程序设计
一、简介: HX710A是一款高精度24位模数转换器(ADC)芯片,专为电子秤和其他高精度测量应用设计。它通常与称重传感器(如应变片)配合使用,具有以下特点: 24位无失码精度 可编程增益:128或64 内置低噪声可编程放大器 片上稳压器,可直接为传感器供电 简单的数字接口(时钟+数据…...
python合并一个word段落中的run
在python-docx中,一个段落可以包含多个Run对象,每个Run对象可以具有不同的样式。如果你希望将一个段落中的所有Run对象合并为一个Run对象,同时保留所有文本内容,可以通过以下步骤实现: 合并Run对象的方法 遍历段落的…...
pytorch搭建并训练神经网络
#从小白开始学习人工智能# #学习笔记# 工具:pytorch 一、基础概念 1.神经网络是什么? 神经网络是人类受到生物神经细胞结构启发而研究出的算法体系。又称为人工神经网络(Artificial neural network) 最简版神经网络结构图&a…...
GCC 内建函数汇编展开详解
1. 引言 GNU 编译器集合(GCC)是广泛使用的开源编译器套件,支持多种编程语言,其中 C 语言编译器是其核心组件之一。在 C 语言编译过程中,GCC 不仅处理用户编写的标准 C 代码,还提供了一类特殊的函数——内建…...
iOS自定义电池电量显示控件 BatteryView 实现
iOS自定义电池视图:BatteryView 传送门:Android自定义电池电量显示控件 BatteryView 实现 在iOS开发中,自定义视图是提升用户体验的重要手段之一。本文将介绍如何通过Swift语言实现一个自定义的电池视图(BatteryView),并展示其功能和使用方法。 1. 功能概述 BatteryVi…...
LeetCode -- Flora -- edit 2025-04-27
1.接雨水 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,…...
00-算法打卡-目录
1 数组 01-算法打卡-数组-二分查找-leetcode(704)-第一天-CSDN博客 02-算法打卡-数组-二分查找-leetcode(35)-第二天-CSDN博客 03-算法打卡-数组-二分查找-leetcode(34)-第三天_leetcode 34-CSDN博客 04-算法打卡-数组-二分查找-leetcode(69)-第四天-CSDN博客 05-算法打卡-数组…...
Vue2 与 Vue3 深度对比与技术解析
引言 Vue.js 是由尤雨溪创立的渐进式(progressive)JavaScript框架,自 2014 年发布以来,以其简单易用和灵活扩展性得到广泛应用。在 Vue2 的时代,它已经成为构建单页应用(SPA)和组件化开发的主流…...
Linux-UDP套接字编程
一.认识IP地址 IP 协议有两个版本, IPv4 和 IPv6. 我们之后凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4。 IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;我们通常也使用 "点分十进制" 的字符串表…...
tsconfig.json和tsconfig.node.json和tsconfig.app.json有什么区别
通过pnpm i vite 生成vue3项目时,会生成三个ts配置文件,分别是什么作用呢? 在Vue 3项目中,tsconfig.json、tsconfig.node.json和tsconfig.app.json是三个不同的TypeScript配置文件,它们分别用于不同的场景和目的。其中tsconfig.n…...
机器学习——Seaborn练习题
1、使用tips数据集,创建一个展示不同时间段(午餐/晚餐)账单总额分布的箱线图 import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pdplt.rcParams["font.sans-serif"] ["SimHei"] plt.rcParams[&qu…...
Spring XML 外部实体(XXE)指南:示例和预防
什么是XXE? XML 文档遵循特定的标准。该标准强调了 XML 文档的构造方式,概述了有效 XML 文档与无效 XML 文档的区别等等。 该标准还指定了一个称为“实体”的术语。实体是某些内容的占位符。 实体可以是内部的,也可以是外部的(就像我们的情况一样)。 实体通过系统标识…...
C语言(3)—分支和循环
文章目录 一、程序的基本结构二、分支结构1. if语句2. if-else语句 三、关系与逻辑运算符1. 关系运算符2. 逻辑运算符 四、条件运算符(三目运算符)五、switch语句六、循环结构1. while循环2. for循环 七、循环控制语句1. break2. continue 八、循环嵌套九…...
【MCP】从一个天气查询服务带你了解MCP
1. 前言 这篇文章将通过一个集成高德天气查询的 MCP Server 用例,带你上手开发自己的 MCP Server ,文章将通过以下三种方式(自己编写 Client 端代码,使用 mcp-cli 自带页面,集成到 Claude 桌面版等)带你测试自己的 MC…...
【Leetcode 每日一题】3392. 统计符合条件长度为 3 的子数组数目
问题背景 给你一个整数数组 n u m s nums nums,请你返回长度为 3 3 3 的 子数组,满足第一个数和第三个数的和恰好为第二个数的一半。 子数组 指的是一个数组中连续 非空 的元素序列。 数据约束 3 ≤ n u m s . l e n g t h ≤ 100 3 \le nums.length…...
SALOME源码分析:Geomtry模块
本文分析SALOME Geometry模块。 一、核心组件 1.1 GeometryGUI 二、关键流程 三、插件 3.1 插件接口 GEOMPluginGUI定义了Geometry可以加载的插件接口。 3.2 插件列表 插件命令描述 BasicGUI BlocksGUI BooleanGUI BuildGUI DisplayGUI EntityGUI GenerationGUI GEOM…...
力扣HOT100之链表:23. 合并 K 个升序链表
这道题我是用最淳朴最简单的思路去做的,用一个while循环持续地将当前遍历到的最小值加入到合并链表中,while循环中使用一个for循环遍历整个指针数组,将其中的最小值和对应下标记录下来,并将其值加入到合并链表中,同时对…...
ArkTS 组件 通用事件 通用属性 速查表
ArkTS 组件 组件 通用事件 速查表 通用事件事件名称简要说明点击事件onClick(event: Callback<ClickEvent>, distanceThreshold: number): T相较于原有 onClick 接口,新增 distanceThreshold 参数作为点击事件移动阈值,当手指的移动距离超出所设…...
SOAP API 和 REST API
SOAP API 和 REST API 是两种主流的 Web 服务通信架构,它们在设计理念、数据格式、协议支持和应用场景上有显著差异。以下是两者的核心对比及典型应用场景: 1. 核心概念与设计哲学 特性SOAP APIREST API本质协议(基于 XML 的标准化协议&…...
简单了解Java的I/O流机制与文件读写操作
一、理解Java的I/O流机制 字节流 Java中的字节流主要由 InputStream 和 OutputStream 这两个抽象类及其子类构成。字节流以字节(byte)为基本处理单元,适用于处理所有类型的数据,包括文本、图片、音频、视频等。 1. InputStream…...
PCIe 转 U.2 接双硬盘指南 - 超微(Supermicro)主板
前言 公司服务器空间不够想扩容,尝试折腾了下超微(Supermicro)服务器的 PCIe 转 U.2,踩了一点小坑,特地写下来给大家参考一下。 现在市面上 U.2 接口的企业级固态硬盘相对其他类型接口的固态硬盘 便宜很多 ÿ…...
【上位机——MFC】文档
相关类 CDocument提供了一个用于管理数据的类,封装了关于数据的管理(数据提取、数据转换、数据存储等),并和视图类进行数据交互。 文档类使用 定义一个自己的文档类,派生自CDocument 程序的创建过程 1.利用框架类对象地址pFrame调用Load…...
JavaEE-多线程实战02
接上 多线程编程实战01 第三个多线程程序 package thread.test;//定义了一个叫MyThread3的类,实现了Runable接口,所以它必须重写run()方法 class MyThread3 implements Runnable {Overridepublic void run() {//线程执行的具体内容//进入一个无限循环,…...
计算机网络 | 应用层(6) -- 套接字编程
💓个人主页:mooridy 💓专栏地址:《计算机网络:自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第七节知识梳理 关注我…...