- 博客(75)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 用 JSON 列存储扩展字段后,如何优雅地支持高频查询?MySQL 虚拟列 + 联合索引实战指南
本文介绍了MySQL 5.7+中使用虚拟列(Generated Column)优化JSON字段查询性能的方案。针对ToB系统中常见的自定义字段扩展需求,通过创建虚拟列提取JSON中的特定属性并建立索引,解决了直接查询JSON字段导致全表扫描的性能问题。文章详细说明了虚拟列的创建方法、VIRTUAL与STORED的区别选择,以及如何建立联合索引进一步提升查询效率。同时提供了最佳实践建议和常见问题解答,帮助开发者在保持JSON灵活性的同时获得良好的查询性能。
2026-03-15 16:37:16
438
原创 SQL JOIN 核心指南:从连接类型到执行顺序,彻底搞懂多表查询
SQL JOIN核心指南:掌握多表查询的关键技术 摘要:本文系统讲解SQL JOIN操作的核心概念,涵盖5种连接类型(内连接、左右外连接、全外连接和交叉连接)及其应用场景。通过学生-选课案例对比不同连接的结果差异,特别指出MySQL模拟全外连接的方法。深入剖析多表JOIN的左结合性执行顺序,解释混合连接类型的推导逻辑。重点分析LEFT JOIN中ON与WHERE条件的本质区别,揭示不当过滤导致连接退化的原因。最后强调交叉连接的风险和优化原则,包括索引使用和小表驱动策略,为高效数据库查询提供实践指导。 关键词
2026-03-04 09:48:45
326
原创 OAuth 2.0 与 Spring Security 源码解析:从理论到实战
摘要 本文深入解析OAuth 2.0协议与Spring Security实现,聚焦微信登录等典型场景的授权码模式全流程(引导跳转→用户授权→获取授权码→换取令牌→访问资源)。通过剖析OAuth2RestTemplate源码,详解其五大核心组件(resource、accessTokenProvider等)如何协同完成令牌获取、携带与刷新。特别探讨了LEFT JOIN中WHERE条件导致左连接退化的原理,以及OAuth2RestTemplate的自动重试机制(retryBadAccessTokens)处理令牌失
2026-03-04 09:48:00
373
原创 Maven 核心指令与 JAR 包运行机制完全指南:从原理到故障排查
Maven 构建避坑指南:从命令辨析到 JDK 兼容性突围还在混淆 package、install 与 deploy?遇到 Lombok 编译报错束手无策?本文一文打通 Maven 核心任督二脉!⚡️ 命令全景解析:用“工厂流水线”比喻,30 秒厘清三大指令的产出去向与适用场景,拒绝盲目执行。📦 JAR 包内幕揭秘:深入 MANIFEST.MF 清单文件,一眼看穿“可执行 JAR”与“普通库 JAR”的本质差异,掌握 java -jar 与 -cp 的正确打开方式。🔥 硬核故障排查:直击 JDK
2026-03-04 09:46:36
383
原创 实习踩坑记:当异常处理邂逅工厂模式,代码优雅度瞬间提升
摘要: 本文分享了实习中通过静态工厂模式优化异常处理的实际案例。针对直接new异常对象导致的代码冗余、错误码丢失、国际化异常中断业务等问题,作者设计了ofKey静态工厂方法,封装异常创建过程,保留错误码和参数,实现降级容错。重构后代码体现了开闭原则(国际化工具可替换)、容错设计(异常工厂永不失败)、日志完整性(保留原始上下文)等优势。文章最后提供了面试话术,强调设计模式的价值在于解决实际问题而非概念套用。该案例展示了工厂模式如何提升代码优雅度和系统健壮性。
2026-03-04 09:44:04
393
原创 从实习生视角看 Java 探针:SkyWalking 和 Arthas 背后的魔法
摘要: Java探针技术(Java Agent)通过premain和agentmain两种方式,在JVM层面对字节码进行无侵入式修改,支撑了SkyWalking(全链路监控)和Arthas(运行时诊断)等工具的核心功能。SkyWalking通过拦截JDBC类并插入埋点实现SQL抓取,Arthas则利用运行时类重定义动态修改方法逻辑。其底层依赖InstrumentationAPI和ClassFileTransformer接口实现字节码增强,开发者可通过手写迷你探针(如方法耗时统计)深入理解技术原理。这种技术无
2026-03-03 10:10:52
460
原创 从 JDK 到 SDK:Java 实习生眼中的“工具包”与“交付物”
本文从Java实习生的视角探讨了JDK、JRE、SDK和JAR包的核心概念及其工程意义。JDK包含完整的开发工具,而JRE仅保留运行环境,线上使用JRE可缩小体积并提升安全性。JAR包作为Java交付物,普通JAR用于依赖,可执行JAR(如Spring Boot的Fat Jar)通过指定Main-Class实现独立运行。第三方SDK(如阿里云OSS)通过封装复杂逻辑(如签名、HTTP请求)显著提升开发效率。文章揭示了这些工具包的本质价值:让开发者专注于业务逻辑而非底层实现,体现了工程化思维的重要性。
2026-03-03 10:10:45
465
原创 第三方接口OpenAPI 鉴权逻辑实现
本文介绍了OpenAPI鉴权逻辑的实现方案,重点关注API安全防护。通过Redis SETNX实现防重放攻击,采用数字签名和时间戳校验防止数据篡改和过期请求。关键优化包括:Redis Key添加accessKeyId前缀实现租户隔离、时间戳校验前置减少资源浪费、调整TTL为5分钟、建议增加限流逻辑防范暴力破解。方案采用accessKeyId和clientKey机制,要求参数名和顺序严格一致确保签名验证安全。文章还分析了原代码存在的问题,并提供了针对性的改进建议,为构建安全的第三方接口鉴权系统提供了实用参考。
2026-03-03 10:10:32
766
原创 基于 Spring Security 的认证授权架构详解:从 ThreadLocal 到设计模式
本文详细解析了Spring Security的认证授权架构,从ThreadLocal原理到实际应用的设计模式。主要内容包括: 核心机制:Spring Security利用ThreadLocal实现线程隔离的安全上下文存储,通过SecurityContextHolder在各层传递用户认证信息,无需显式参数传递。 关键组件: Authentication接口封装用户凭证和权限 过滤器链完成认证信息的初始化和注入 自定义UserDetails实现业务用户模型 典型流程:以JWT认证为例,展示从请求拦截、Token
2026-03-03 10:10:08
579
原创 MyBatis-Plus 查询双雄:Service 链式调用 vs Mapper 传统写法,你真的懂吗?
摘要 MyBatis-Plus提供了两种查询方式:Mapper传统写法和Service链式调用。Mapper方式通过LambdaQueryWrapper手动构建查询条件,步骤明确但代码较冗长;Service方式通过lambdaQuery()链式调用,代码简洁高效。两者底层均调用Mapper的selectList方法,性能无差异。泛型限定确保了类型安全,多表查询可通过注入多个Mapper或自定义XML实现。Service层封装了Mapper功能,提供更友好的API,而Mapper则更灵活适合复杂查询。根据场景
2026-03-03 10:08:56
538
原创 MyBatis 分步查询与数据组装:从租户首页接口看 VO 的完整赋值之道
文章摘要 本文通过租户首页课程列表接口案例,深入剖析MyBatis分步查询与数据组装的实现原理。核心要点包括: 分步查询模式:先通过主查询获取基础字段(如课程ID、名称),再通过附加查询补充详细信息(如封面、讲师列表等),最后手动组装成完整VO对象。 技术实现:MyBatis自动映射主查询结果到VO部分字段,剩余字段通过遍历结果集执行额外查询并手动set赋值。 架构权衡:相比一次性JOIN查询,分步查询虽可能产生N+1问题,但能避免结果集膨胀、降低SQL复杂度,且更利于代码维护和扩展。 优化建议:批量查询替
2026-03-02 22:20:36
445
原创 Spring Boot 国际化缓存机制深度解析:性能优化的幕后英雄
缓存必要性:避免磁盘I/O和文件解析带来的性能灾难,内存访问比磁盘快10万倍。Spring缓存实现:基于的双层缓存,线程安全,支持文件修改时间检测。参数-1:永久缓存,生产环境标配。0:不缓存,仅用于开发调试。>0:定时过期,平衡灵活性与性能。最佳实践开发环境用0,生产环境用-1。环境隔离配置。监控命中率。按需提供手动刷新接口。
2026-03-02 22:20:18
419
原创 ConcurrentHashMap本地缓存 vs Redis分布式缓存:架构师视角的选型指南
文章摘要: 本文从架构师视角对比了本地缓存(ConcurrentHashMap)与分布式缓存(Redis)的核心差异。ConcurrentHashMap采用细粒度锁和无锁技术,读写性能达纳秒级,适用于单机高频访问场景(如配置缓存、计算结果复用);Redis作为分布式缓存,支持跨进程数据共享和丰富数据结构,但存在毫秒级网络延迟。关键选型因素包括:数据一致性需求、访问延迟要求、集群部署规模及运维成本。建议高频独享数据用本地缓存,跨节点共享数据用Redis,二者也可组合形成多级缓存体系。(149字)
2026-03-02 22:20:01
567
原创 Java 异常处理最佳实践:从混乱到优雅
Java 异常处理最佳实践 摘要 本文通过快递运输的比喻,系统讲解了 Java 异常处理的最佳实践。首先分析了常见错误示例,包括语法错误、异常信息不明确等问题。然后提出了自定义异常体系的设计方案,包括: 创建包含错误码、错误信息的基类异常 使用静态工厂方法和错误码枚举提高可维护性 保留异常链避免信息丢失 最后介绍了全局异常处理机制,通过统一响应体封装和@ControllerAdvice实现异常处理的标准化。这些实践能够使异常处理从混乱变得优雅,提高代码可读性和系统健壮性。 关键词:Java异常处理、自定义异
2026-03-02 22:19:42
559
原创 MySQL EXPLAIN 执行计划完全指南:从入门到优化
MySQL EXPLAIN执行计划优化指南 摘要 MySQL EXPLAIN命令是SQL性能调优的关键工具,它通过分析查询执行计划帮助开发者识别性能瓶颈。本文从基础概念入手,详细解析了EXPLAIN输出的各个字段: 核心概念:索引类型、全表扫描、优化器工作原理 关键字段解析: type字段显示访问类型(从最优NULL到最差ALL) possible_keys/key显示索引使用情况 rows表示预估扫描行数 Extra包含关键性能提示 优化建议: 避免出现type=ALL的全表扫描 警惕Extra中的&qu
2026-03-02 22:19:15
547
原创 别再 new 实体类了!MyBatis-Plus UpdateWrapper 更新方式的避坑指南与最佳实践
本文对比了MyBatis-Plus中两种更新数据库的方式:创建实体对象+UpdateWrapper(方式B)和仅使用LambdaUpdateWrapper(方式A)。通过分析发现,虽然两者生成的SQL相同,但方式A具有明显优势: 方式B受FieldStrategy.NOT_NULL策略限制,无法更新字段为null值 方式A通过.set()方法可自由控制任何字段更新,包括显式设为null 方式A代码更简洁,全链路类型安全,更新字段和条件一目了然 最佳实践建议: 优先使用LambdaUpdateWrapper+
2026-03-01 11:34:49
454
原创 数据库里到底有没有 Boolean 类型?实际开发该怎么存?
数据库布尔类型存储方案解析 本文深入探讨了数据库中对布尔类型的支持现状及实际应用方案。主要内容包括: 现状分析:主流数据库中,仅PostgreSQL和SQLite原生支持布尔类型,MySQL使用TINYINT(1)模拟,SQL Server采用BIT类型,Oracle则无原生支持。 实现方式: PostgreSQL:标准的BOOLEAN类型 MySQL:TINYINT(1)别名 SQL Server:BIT类型(0/1/NULL) Oracle:需使用CHAR(1)或NUMBER(1)模拟 选型建议: 优先
2026-03-01 11:31:48
510
原创 深入浅出主从表设计模式:从学生能力评价系统理解 Master-Detail
本文深入浅出地讲解了主从表设计模式,通过学生能力评价系统案例展示Master-Detail结构。主表存储学生总分(一对多中的"一"),从表记录各项能力指标得分("多")。采用逻辑外键关联,通过(user_id, teach_class_id)组合键建立关系。相比单表存储,这种设计避免了数据冗余、更新异常等问题,更符合关系型数据库范式。文中详细解析了表结构设计、字段定义及关联逻辑,并给出数据示例说明一对多关系的典型表现。
2026-03-01 11:28:47
570
原创 数据库表设计进阶:8种核心模式详解
本文详解了8种数据库表设计模式,分为三大类:结构优化类、关联逻辑类和历史追溯类。结构优化类包括扩展模式(垂直分表)和主从模式(类型继承表),解决宽表性能问题;关联逻辑类涵盖属性模式(EAV变种)和组合模式(多对多关联),处理复杂数据关系;历史追溯类包含日志模式、选项卡模式、风琴模式和拉链模式,用于数据版本管理与审计。每种模式均分析了适用场景、表结构设计及优缺点,为高并发、大数据量业务提供灵活高效的数据库解决方案。
2026-03-01 11:23:34
559
原创 高效求解子数组与树路径:前缀和与哈希表的深度优化
本文介绍了前缀和的概念及其在解决子数组和问题中的应用。前缀和是指序列中从起始位置到当前位置所有元素的和,可用于快速计算子数组和。重点解析了LeetCode 560题的解法,通过哈希表存储前缀和出现次数,将时间复杂度优化至O(n)。同时探讨了前缀和在二叉树路径和问题(LeetCode 437)中的扩展应用,比较了DFS和前缀和两种解法,前缀和解法将时间复杂度从O(n²)优化到O(n)。文章包含Java代码实现,并详细说明了关键变量的作用。
2026-03-01 11:19:43
663
原创 基本类型与包装类型相互转化,如int[]与Integer[]相互转化
摘要: 本文介绍了Java中基本类型数组与包装类型数组的相互转换方法。 int[]转Integer[]:使用Arrays.stream(arr1).boxed().toArray(Integer[]::new),通过流式操作将基本类型数组转为包装类型数组。 Integer[]转int[]:通过Arrays.stream(numss).mapToInt(Integer::intValue).toArray()实现拆箱转换。 类似方法适用于double[]与Double[]、long[]与Long[]的转换。核
2026-02-28 11:41:14
255
转载 代码随想录java代码实现
本文介绍了几个常见的数组算法问题及其Java实现方法。主要内容包括:1)二分查找算法,通过双指针不断缩小范围;2)移除元素问题,使用双指针处理边界条件;3)最小子数组长度问题,采用滑动窗口技术;4)螺旋矩阵生成,通过循环和偏移量控制填充顺序。每个算法都提供了详细的实现思路和代码示例,重点讲解了指针移动、边界条件处理等关键细节。这些算法展示了数组操作的基本技巧,如双指针、滑动窗口等,对解决类似问题具有参考价值。
2026-02-28 11:40:20
16
原创 动态规划-基础篇-01
本文介绍了动态规划的基本解题思路,通过五步法解决经典问题:斐波那契数、爬楼梯、最小花费爬楼梯和不同路径。重点分析了动态规划的状态转移方程构建、边界条件处理以及空间优化技巧。对于不同路径问题,还提供了组合数学解法作为参考。通过对比递归与迭代实现,指出递归方法可能存在的时间复杂度问题,建议优先采用迭代方式实现动态规划算法。
2026-02-28 11:38:44
518
原创 动态规划-基础篇-02
本文主要讲解了三个动态规划问题的解法: 不同路径II:在存在障碍物的网格中计算路径数,通过初始化边界条件和遇到障碍物时置0来处理特殊情况。 整数拆分:将整数拆分为至少两个正整数的和,求乘积最大值,通过比较拆分两个数和多个数的情况得出递推公式。 不同的二叉搜索树:计算n个节点能构成的二叉搜索树数量,利用左右子树节点数目的乘积关系推导出递推公式。 这三个问题都体现了动态规划的核心思想:分解子问题、存储中间结果、推导状态转移方程。其中后两个问题需要双重循环来计算每个状态,因为它们与多个前序状态相关。
2026-02-28 11:37:45
604
原创 升序与降序
本文介绍了Java中使用Lambda表达式实现数组和HashMap的升序与降序排序方法。主要内容包括:1)使用Arrays.sort()对数组进行升序/降序排列,通过Comparator接口或Collections.reverseOrder()实现;2)使用PriorityQueue对HashMap按键或值排序,通过compareTo()或数值比较实现;3)演示了多级排序的实现方式,即先按值排序再按键排序。文中提供了详细的代码示例,展示了Lambda表达式在排序中的灵活应用。
2026-02-28 11:36:26
47
原创 HashMap按key排序,按value排序,多级排序的一种方便记忆的统一方法
本文介绍了Java中HashMap的排序方法。对于key排序,可使用TreeMap,默认升序或通过Comparator.reverseOrder()实现降序。针对value排序,需将HashMap转换为包含键值对的类数组,再使用Arrays.sort()结合lambda表达式实现多种排序方式:1)按value升/降序;2)先按value后按key升序;3)先按key后按value升序。示例代码演示了如何创建MapEntry类并实现这些排序逻辑。
2025-10-10 22:04:27
204
原创 大家不要看了,这里啥也没有
AF2 utilized triangle attention in the pair to pair updates to implicitly bias pair features towardsresidue-pair distances respecting 3D locality, without needing to tightly tie predictions topredicted distance histogram (“distogram”) lossesvar code = “
2025-03-28 15:22:59
215
原创 论文精读-Semi-Supervised Classification with Graph Convolutional Networks
GCN是一种可扩展的方法,用于图结构数据的半监督学习,GCN在图上进行卷积操作。我们通过谱图卷积的局部一阶近似来激励卷积架构的选择。模型在图边的数量上线性扩展,并学习编码局部图结构和节点特征的隐藏层表示。在引文网络和知识图谱数据集上的大量实验中,我们证明了我们的方法在很大程度上优于相关方法。半监督学习:在图(如引文网络)中对节点(如文档)进行分类的问题,其中标签仅适用于一小部分节点。这个问题可以被框定为基于图的半监督学习。图拉普拉斯正则项图拉普拉斯正则项是在基于图的半监督学习中常用的一种正则化项。
2023-10-11 15:23:28
1642
1
原创 毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记
毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记
2023-07-10 23:05:45
20270
50
原创 “三、从零开始,上手操作.第六阶段 变身蓝牙遥控小车. 3). 在Keil中编写代码. 代码main.c中代码编写“处参考main.c文件代码
【代码】"三、从零开始,上手操作.第六阶段 变身蓝牙遥控小车. 3). 在Keil中编写代码. 代码main.c中代码编写"处参考main.c文件代码。
2023-06-16 00:48:47
739
转载 HAL_UART_Init、HAL_UART_Receive_IT、HAL_UART_IRQHandler说明
以下内容来自正点原子的“STM32F103 MINI开发指南V1.3.pdf”这个文件的”17.3.1 USART 的 HAL 库驱动“
2023-06-14 23:36:02
2860
原创 学习stm32f103c8t6,如何从正点原子官网下载资料及资料使用
用百度搜索“正点原子”点击进入后找我们需要的芯片型号的资料,选择stm32f103-mini开发板的资料进行下载,其他的像stm32f103的精英版,战舰开发板啥的,因为我们没买正点原子的开发板,我们只是参考他的资料,所以stm32f103-mini开发板的资料就够我们学习使用的:点进去里面全是资料链接,我们下载开发板资料A盘的资料:开发板资料A盘的资料十分丰富,需要什么用什么,如下图至此,正点原子的资料获取基本搞定。下面讲解如何使用。
2023-06-03 15:45:03
7724
原创 pwlink用作USB转TTL,进入HC-05的AT模式
查看资料后发现pwlink2可以输出两种电压,3.3v或5v,但两个VDD引脚输出的是相同的电压值,不能设置一个输出3.3v,一个输出5v,网上还有大佬对pwlink重新接线处理,使它可以一个3.3v一个5v,但我只需要使它输出5v即可,所以没有正常进去AT模式,说明PWLINK的输出引脚可能不是5v。PWLINK也是4根线与HC-05连接,只是与上图的区别在于PWLINK使用其一个VDD引脚与HC-05的VCC引脚连接,连接后,长按HC-05上的按钮,然后连接电脑,上电。(注:默认为从机模式,无需修改)
2023-04-25 22:26:25
2564
原创 计算机科学与技术(嵌入式)四年学习资料_文件目录树
说明:资料内容主要包括:计嵌专业2019级大学四年主要科目的各种电子资料,有电子实验报告、课程设计报告、课程设计项目、整理复习笔记、电子书、ppt、练习题、期末试卷、部分课程软件资源、科创项目,职业生涯规划书,大作业。a目录树按年级划分为大一、大二、大三、大四,各个年级目录下包含所学各种课程,课程目录下是课程相关的整理资料。a查找关心资料时建议按“ Ctrl+f ”,搜索关键词查看。【C语言、java、中级英语-庄鹏达、体育、大学物理实验、大学生职业发展与规划、电子电路、离散数学、高等数学】
2023-03-08 12:59:31
1775
2
原创 数据库第三讲-关系模型基本概念总结
图片来自于《哈工大 数据库系统 战德臣(课件)》,本文属于听课后做的整理,以供日后复习使用课件分享:链接:https://pan.baidu.com/s/1bdNeegnbOB5tQ8kS_-7COA?pwd=2023提取码:2023
2023-02-04 20:19:34
317
原创 视频剪辑输出后比原视频还大?可能是没设置好参数
一个常识就是视频的参数直接影响视频的大小,之所以会出现视频剪辑输出后比原视频还大(即使只是截取原视频的一小段),就是因为使用的视频剪辑软件里面有默认的视频参数设置,这个参数可能会比原视频高点,如果大家在编辑视频后想要导出的时候并没有修改这些参数,就会导致生成的视频就比较大了。视频编辑好之后呢,在导出页面一般会有导出参数的设置,如果没有可以百度一下在哪里设置导出视频的参数。根据原视频参数设置导出参数:(原视频大小是1.98MB,例子里的视频未作任何改动直接导出)————右键查看视频文件的属性就能知道。
2022-11-09 10:30:11
35842
原创 折半插入排序,加一个条件判断会得到优化吗?
上面代码中在查找第i个元素的插入位置之前并没有像直接插入排序那样先判断一下第i个元素是否需要移动,即使第i个元素比它前面所有元素都大(这样不需要移动),依然需要对前面的元素执行折半查找,这就是令人们困惑的地方,为什么不加上一句if判断语句,如果`arr[i] > arr[i - 1]` ,是不是就可以省略本次对它前面元素的折半查找呢?...
2022-07-18 22:59:50
372
《高等工程数学I复习笔记》
2023-12-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅