自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 收藏
  • 关注

原创 java每日精进 02.10【震惊!数据库树形结构设计5大黑科技:从菜鸟到大神,一文让你性能飙升100倍!】

今天,我们来聊聊一个让无数开发者头疼的话题——树形结构设计!想象一下,你的数据库里有成千上万的分类、部门或风险类型数据,它们层层嵌套,像一棵参天大树。如果你还在用最原始的邻接表方案,查询子树时递归到吐血?插入节点时性能瓶颈卡住整个系统?别慌!这篇文章将揭秘5大树形结构设计黑科技,每种都配齐表设计、SQL示例、优缺点、数据举例、核心操作SQL及时间复杂度分析,还附上真实场景适用指南。读完这篇万字长文,你的数据库将从“龟速”变“光速”,性能起飞100倍!(别走开,文末有超级详细总结,帮你一键选型!)

2026-02-11 18:00:00 993

原创 java每日精进 01.09【结构型设计模式终极指南:让代码结构更优雅的7种武器】

本文将详细介绍7种经典的结构型设计模式,每种模式都会通过:🌿 大白话解释 - 用生活中的例子理解📌 核心定义 - 官方定义精要💡 详细示例 - 完整代码演示🤔 深度思考 - 关键问题探讨🆚 模式对比 - 避免混淆✨ 优缺点分析 - 适用场景让你彻底掌握这些模式,在项目中灵活运用。

2026-01-15 18:00:00 998

原创 java每日精进 01.08【吃透 5 大创建型设计模式!从业务场景到代码落地,新手也能秒懂】

🔥 写代码还在无脑 new 对象?学会这 5 种创建型模式,让你的代码优雅 10 倍,扩展性拉满!

2026-01-08 18:00:00 1268

原创 2025-12-24 >--@--<「Java进阶之」>--@--<拒绝手动敲命令!手把手教你编写生产级 Windows 自动化启动脚本 (MySQL+Nacos+Redis+Java全栈实战)

你是否厌倦了每次部署都要手动修改配置文件?你是否因为输错了一个数据库密码导致服务启动失败?本文将带你深入 Windows Batch 脚本编程,实现 MySQL、Redis、Nacos 及 Spring Boot 应用的“一键式”环境配置与启动。我们将解决最棘手的“环境变量动态注入”与“外挂配置读取”难题,打造真正的生产级交付脚本。

2025-12-25 18:00:00 1173

原创 2025-12-27 >--@--<「Java进阶之」>--@--<[告别“屎山“代码!资深架构师都在用的6大Java设计心法(附代码重构]

告别"屎山"代码!资深架构师都在用的6大Java设计心法(附代码重构)你是否经历过这样的绝望:改一个简单的功能,却引发了全系统的崩溃?看同事的代码像在解密天书?或者,随着业务迭代,你的类变得越来越巨大,直到没人敢碰它?这通常不是因为技术不行,而是设计原则没守住。今天,我们不谈枯燥的理论定义,用最接地气的“人话”和实战代码,带你彻底搞懂Java六大设计原则(SOLID + 迪米特法则)。掌握这些,你的代码也能写得像诗一样优雅。

2025-12-18 17:45:00 780

原创 java每日精进 12.17【[特殊字符] 告别 MySQL 5.7!万字长文带你彻底玩转 MySQL 8.0 的“船新版本”】

看完了这么多,你应该已经明白为什么我说 5.7 是“旧时代”了吧?维度MySQL 5.7MySQL 8.0评价安装需配置字符集避免乱码开箱即用 (utf8mb4)8.0 真香SQL 能力弱 (无窗口函数/CTE)超强(支持复杂分析)8.0 完胜数据严谨性忽略 CHECK 约束强制 CHECK 约束8.0 更安全DDL 安全非原子 (易坏表)原子性(不怕断电)8.0 更稳JSON基础支持强大且高效8.0 胜兼容性极好需注意连接驱动5.7 胜在老旧。

2025-12-17 17:45:00 786

原创 java每日精进 12.10【[特殊字符] MySQL vs 达梦:国产化迁移的那些“坑”与“神操作”(附全套对比代码)】

在信创国产化的浪潮下,从 MySQL 迁移到达梦(Dameng DB)已成为许多开发者的必修课。很多人以为只是换个 JDBC 驱动,结果上线就报错?本文为你深度盘点 MySQL 与达梦的底层差异、语法区别及建表实战,拒绝踩坑,一篇搞定!

2025-12-11 18:00:00 592

原创 java每日精进 12.09【500万行Excel数据导入:我是如何用“先体检,后手术”模式拯救服务器的?】

你是否经历过上传一个几百兆的 Excel 文件,进度条卡在 99% 不动,最后给你报一个“网络超时”的绝望?或者导入到一半报错,留下一堆脏数据让你手动清理的抓狂? 本文将带你深入企业级大数据导入的无人区,复盘我如何设计一套支持 500万行数据、11种业务类型、实时进度反馈、错误精准定位 的异步导入系统。我们将使用 Spring Boot + EasyExcel,结合 两阶段提交、监听器模式 和 原子计数器,手把手教你写出教科书级的代码。

2025-12-09 19:33:18 668

原创 java每日精进 11.07【[特殊字符] 被低估的 IDEA 神级插件:Diagrams 帮你自动画 UML 图,代码关系一目了然】

嘿,各位搬砖人👷‍♀️👷‍♂️!是不是总遇到这种情况:接手别人的项目,对着一堆类和接口晕头转向,想画个 UML 图理清关系,结果手动画了俩小时还错漏百出?今天必须给你们安利一个 IDEA 自带的「隐藏福利」——!别看它是内置插件,功能却强到离谱,简直是梳理代码关系的「神器」✨。

2025-11-20 18:00:00 2065

原创 java每日精进 11.07【数据量过大时的思考】

产品与零件:通过关联,形成 “产品由零件组成” 的 BOM 结构。企业与供货商:通过关联,管理合作关系。供货商与零件:通过关联,管理零件的供应渠道和交易条件。整体链路:企业 → 合作供货商 → 供货商提供的零件 → 零件组成产品,覆盖了从采购到生产的核心业务流程。

2025-11-10 17:45:00 1516

原创 java每日精进 11.06【线程本地存储与异步上下文传递详解】

摘要:ThreadLocal是Java中实现线程隔离数据的重要工具,但存在异步场景下无法传递上下文的问题。文章剖析了ThreadLocal和InheritableThreadLocal的局限性,重点介绍了Alibaba的TransmittableThreadLocal(TTL)解决方案,它通过Runnable/Callable包装实现上下文传递,支持线程池环境。文章包含电商订单处理等实战案例,演示了TTL如何防止线程池污染,并提供了Spring AOP集成方案。最后强调了线程本地变量的清理重要性,避免内存泄

2025-11-07 18:00:00 615

原创 java每日精进 11.04【关于线程的思考】

本文深入解析了Java线程池的工作原理以及多线程编程的常见应用场景。线程池被形象地比喻为工厂,其中线程是工人,Thread、Runnable和Callable则是不同类型的任务单。Runnable适合不需要返回结果的任务,Callable用于需要返回结果的任务,而Thread虽然能定义任务但不推荐直接提交给线程池。文章详细介绍了线程池如何高效处理这些任务单。 在应用场景方面,涵盖了异步处理、定时任务、生产者-消费者模式、并行处理、工作窃取、资源管理和并发控制等七个关键领域。每种场景都配有详细的代码示例和原理

2025-11-04 17:59:21 860

原创 java每日精进 11.03【基于Spring AOP和事件驱动的资源操作消息处理流程(类似于若依框架的@Log注解)】

本文介绍了一个基于Spring AOP和RabbitMQ的资源操作监控系统。系统通过@ResourceOperation注解标记需要监控的方法,利用AOP切面拦截方法执行,在方法成功后收集资源操作记录并异步发布事件,最终通过RabbitMQ进行消息投递。主要组件包括:1)ResourceOperation注解作为流程入口;2)ResourceOperationContext实现线程安全的操作记录存储;3)ResourceOperationAspect完成核心拦截处理;4)事件监听器实现异步消息发送。

2025-11-03 18:04:34 1039

原创 java每日精进 8.04【文件管理细致分析】

FileServiceImpl 方法作用getFilePage:分页查询文件元信息。createFile(String, String, byte[]):上传文件到数据库,保存元信息,返回逻辑 URL。createFile(FileCreateReqVO):记录前端直传文件的元信息(不适用于数据库存储)。deleteFile:删除文件内容和元信息。getFileContent:获取文件内容,支持访问。getFilePresignedUrl:获取预签名 URL(数据库存储无效)。

2025-08-05 18:30:00 712

原创 java每日精进 7.31【WebSocket全流程】

握手时认证(

2025-08-01 18:00:23 1129

原创 java每日精进 7.30【用户体系详解】

前端发起登出请求:调用/logout接口,通过 Header 或参数传递当前登录的 Token。后端提取 Token方法从请求中解析出有效 Token。令牌失效处理删除存储的 Token,确保其无法再使用。记录登出日志生成日志,记录登出详情。返回成功响应:告知前端登出完成。

2025-07-30 18:45:00 1138

原创 java每日精进 7.29【框架数据权限详解】

数据权限控制执行步骤流程,以system模块的配置为例。

2025-07-29 18:45:00 1394

原创 java每日精进 7.28【流程设计6.0(泳池和泳道)】

在 BPMN(业务流程建模与标记法)中,泳池(Pool)和泳道(Lane)是用于组织和展示流程中不同参与者或角色的图形化工具。它们的主要作用是清晰地划分职责和功能,帮助理解复杂流程中每个步骤的负责人。泳池(Pool):代表流程中的一个主要参与者或实体,例如一个部门、组织或角色。泳池通常作为一个图形容器,将不同参与者之间的活动分开。通常一个流程图中可以有一个或多个泳池。如果流程涉及多个独立实体(如公司内部和外部的交互),会使用多个泳池;如果只涉及单一组织内部的流程,通常只有一个泳池。泳道(Lane)

2025-07-28 18:30:00 1478

原创 java每日精进 7.26【流程设计5.0(中间事件+结束事件)】

消息捕获事件与抛出事件通过messageRef关联,必须引用同一个消息 ID流程会在消息捕获事件处暂停,直到收到对应的消息才继续消息是点对点的,通常用于两个特定流程之间的通信适用于需要异步等待外部系统响应的场景(如支付、审批等)空结束事件:最简单的结束事件,用于流程或分支的正常结束,无需抛出结果。错误结束事件:用于子流程抛出错误,触发父流程的错误边界事件,适合异常处理。取消结束事件:专用于事务子流程,触发取消边界事件和补偿机制,适合事务回滚。终止结束事件。

2025-07-26 18:30:00 1016

原创 java每日精进 7.25【流程设计3.0(网关+边界事件)】

排他网关(也叫XOR网关)是最常用的网关,作用是做选择题:从多条路中只能选一条走。它需要搭配条件来判断走哪条路,条件写在流出顺序流(sequenceFlow)上。工作原理流程到达排他网关时,会按顺序检查每条流出顺序流的条件。找到第一个条件为true的顺序流,就走这条路,其他路被忽略。如果所有条件都为false,但定义了默认顺序流,就走默认路。如果没有默认路且所有条件都为false,流程会抛出异常(流程中断)。建议每条顺序流都设置条件,没条件的顺序流默认算true。排他网关不负责合并。

2025-07-25 18:30:00 1003

原创 java每日精进 7.23【流程设计2.0(顺序流)】

顺序流是 BPMN2 规范中的流程定义元素,是连接两个流程节点的连线。顺序流可以在编排流 程时控制流程的执行顺序,流程执行完一个节点后,会沿着节点的所有外出顺序流继续执行。顺序 流在 BPMN 2.0 中默认的行为是并发的:多个外出顺序流会创造多个单独的,并发流程分支。顾名思义,条件顺序流需要满足一定的条件才能被执行。从网关(Gateway)、活动(Activity)、 事件(Event)的离开的顺序流,允许为它设定规则条件,引擎在执行网关、活动的后继拆分路线 时,将通过评估条件的连线作为选择路径。

2025-07-23 18:30:00 877

原创 java每日精进 7.22【流程设计4.0(子流程和多实例)】

内嵌子流程又叫嵌入式子流程,它是一个可以包含其它活动、分支、事件,等的活动。我们通 常意义上说的子流程通常就是指的内嵌子流程,它表现为将一个流程(子流程)定义在另一个流程 (父流程)的内部,子流程作为父流程的一部分。子流程是主流程中的一部分流程片段,并非独立 的流程定义,一般作为局部通用逻辑处理,或者因为特定业务需要,使比较复杂的单个主流程设计 清晰直观。事件子流程是 BPMN 2.0 中加入的新元素,它是指通过事件触发的子流程,可以存在于在流程 级别,或者任何子流程级别。

2025-07-22 18:30:00 1127

原创 java每日精进 7.21【流程设计1.0(Uel表达式和流程设计)】

空开始事件意味着没有指定启动流程实例的触发条件。它是最常见的一种开始事件,一般需要人工启动,或通过API触发formKey: 引用表单定义,用户需要在启动新流程实例时填写该表单。定时器启动事件(timer start event)用于在指定的时间启动一个流程,或者在一定周期内循环启动多次流程,如在2023年8月1日10时整发起年度目标审核流程, 或每月1日0时开始启动财务结算处理流程。当满足设定的时间条件时,定时器开始事件被触发,从而启动流程。

2025-07-21 11:00:59 1148

原创 java每日精进 7.10【Flowable】

创建流程定义查询。返回示例: 挂起流程定义,阻止新实例启动。示例: 激活挂起的流程定义。示例: 获取流程定义。返回示例基础知识:掌握 Java、Spring Boot、BPMN 2.0(包括其核心元素、XML 结构和执行语义)以及 Flowable 核心服务是使用 Flowable 的前提。核心服务。

2025-07-10 17:54:37 954

原创 java每日精进 6.18【工作流】

本文详细介绍了使用Flowable工作流引擎实现请假审批流程的全过程

2025-06-18 18:30:00 645

原创 java每日精进 6.11【消息队列】

本文探讨了基于Spring Event和Redis两种消息队列的实现方案。在Spring Event方案中,通过StringTextController接收请求,StringTextProducer发布事件,StringTextConsumer异步处理,分析了事件匹配机制及多种消费者选择方案(条件注解、自定义路由等)。Redis方案则实现了两种消息模型:RedisStream用于可靠消息队列,RedisPub/Sub用于广播消息。

2025-06-11 21:00:00 725

原创 java每日精进 6.10【定时任务】

职责:RESTful API 控制器,接收客户端 HTTP 请求(如创建、更新、查询任务),调用 JobService 处理业务逻辑,返回 CommonResult。依赖@Resource private JobService jobService:注入服务层,调用其方法实现任务管理。调用关系被客户端通过 HTTP 请求调用(如 POST /infra/job/create)。调用 JobService 的对应方法(如 createJob、getJob)。

2025-06-10 09:14:49 1030

原创 java每日精进 5.30【HTTP接口签名防篡改】

防止篡改:确保请求参数、头和体在传输过程中未被修改。验证调用方身份:通过共享密钥确认请求来自合法调用方。防止重放攻击:确保请求不会被恶意重复使用。这种机制在微信支付、支付宝等 API 中广泛应用,适用于涉及敏感数据交换的场景。

2025-05-30 18:30:00 560

原创 java每日精进 5.29【请求限流】

Class<?解释属性time 和 timeUnit:限流时间窗口,默认 1 秒。count:时间窗口内的最大请求次数,默认 100。message:超限时的错误提示,默认为 TOO_MANY_REQUESTS 消息。keyResolver:键解析器,支持 DefaultRateLimiterKeyResolver(全局)、UserRateLimiterKeyResolver(用户)、ClientIpRateLimiterKeyResolver(IP)等。

2025-05-29 17:30:00 658

原创 java每日精进 5.28【幂等性】

String message() default "重复请求,请稍后重试";Class<?解释属性timeout 和 timeUnit:键的过期时间,默认 1 秒。message:重复请求的错误提示。keyResolver:键解析器,支持 DefaultIdempotentKeyResolver(全局)、UserIdempotentKeyResolver(用户级别)、ExpressionIdempotentKeyResolver(自定义 SpEL)。

2025-05-28 18:00:00 751

原创 java每日精进 5.27【异步实现】

在 ApiAccessLogApi 接口中,定义异步方法 createApiAccessLogAsync,并添加 @Async 注解。/*** 创建 API 访问日志* @param createDTO 创建信息*//*** 【异步】创建 API 访问日志* @param createDTO 访问日志 DTO*/@Async解释:同步方法,执行日志插入逻辑。:异步方法,通过 @Async 标记,调用同步方法。default 关键字允许在接口中提供默认实现。@Async。

2025-05-27 19:30:00 985

原创 java每日精进 5.27【分布式锁】

*** System Redis Key 枚举类*//*** 指定部门的所有子部门编号数组的缓存* <p>* KEY 格式:dept_children_ids:{id}* VALUE 数据类型:String 子部门编号集合*//*** 角色的缓存* <p>* KEY 格式:role:{id}* VALUE 数据类型:String 角色信息*//*** 用户拥有的角色编号的缓存* <p>* KEY 格式:user_role_ids:{userId}

2025-05-27 18:45:00 804

原创 java每日精进 5.26【本地缓存】

在 RoleService 接口中定义 initLocalCache 方法,用于初始化本地缓存。/*** 初始化角色的本地缓存*/解释目的:定义接口方法,方便后续在服务层实现缓存初始化逻辑,并允许其他组件(如消费者)调用。原因:通过接口定义,保持代码的模块化和可扩展性,尤其是在分布式环境中需要刷新缓存时,可以直接调用此方法。为实现分布式环境下的缓存同步,定义 RoleRefreshMessage 类,作为 Redis Pub/Sub 的消息载体。@Data解释继承。

2025-05-26 18:30:00 1722

原创 java每日精进 5.25【Redis缓存】

项目定义了一个数据对象 OAuth2AccessTokenDO,用于表示存储在 Redis 中的访问令牌结构。@Data@TableId// 主键// 访问令牌// 刷新令牌// 用户编号// 用户类型// 用户信息// 客户端编号// 授权范围// 过期时间解释作用:OAuth2AccessTokenDO 是一个数据对象(DO),用于映射数据库表 system_oauth2_access_token 和 Redis 中的缓存数据。注解。

2025-05-25 20:48:22 914

原创 java每日精进 5.22【多数据源(读写分离)、事务】

以下是一个简单的 Seata 分布式事务示例,模拟两个服务(UserService 和 StudentService)分别操作 buysys 和 mysql_test。以下是一个示例,展示 UserService 调用 StudentService 和自身方法,分别操作 buysys 和 mysql_test 数据库。以下是一个在 UserService 中使用 @Transactional 注解的示例,操作 buysys 数据库的 user 表。

2025-05-22 17:30:00 1606

原创 java每日精进 5.20【MyBatis 联表&分页查询】

MyBatis XML 是一种传统的 MyBatis 使用方式,通过在 XML 文件中编写 SQL 语句,并结合 Mapper 接口和 Service 层实现分页查询。分页需要手动编写两条 SQL 语句:一条查询分页数据列表,另一条查询总记录数。分页参数(如页码和每页大小)通过 LIMIT 语句手动实现。`order` o ON u.id = o.user_id -- 注意这里应该是 user_id 而不是 o.id。

2025-05-20 21:30:00 815

原创 java每日精进 5.19【Excel 导入导出】

导出流程前端触发:用户在 post/index.vue 点击“导出”按钮,调用 handleExport,发送 GET /admin-api/system/post/export 请求。后端查询:PostController 查询岗位数据(PostDO),转换为 PostRespVO。后端生成 Excel:ExcelUtils.write 使用 EasyExcel 将 PostRespVO 列表写入 Excel,设置响应头。前端下载。

2025-05-19 18:00:00 1640

原创 java每日精进 5.18【文件存储】

前端代码作用前端基于 Vue3 和 Element Plus,使用 ElUpload 组件实现文件上传,核心代码在 useUpload 方法中。支持两种模式:前端直传(client)和后端上传(server)。配置文件设置 VITE_UPLOAD_TYPE=client,启用前端直传。配置后端 API 地址(VITE_BASE_URL 和 VITE_API_URL)。生成文件名使用 SHA256 算法基于文件内容生成唯一文件名,防止冲突。作用:确保文件名全局唯一,避免覆盖。

2025-05-18 22:20:15 1289

原创 java每日精进 5.15【分页实现】

对象转换是指将一种类型的对象(如数据库实体 UserDO)转换为另一种类型的对象(如前端响应对象 UserVO 或服务层 DTO)。例如,一个 UserDO 包含用户 ID、姓名和部门 ID,我们需要将其转换为 UserVO,包含 ID、姓名和部门名称。这种转换在分层架构(如 Controller、Service、DAO)中非常常见。对象转换MapStruct:高性能,适合复杂映射,需配置 @Mapping。BeanUtils:简单易用,适合字段名一致的场景,支持 Consumer 扩展。数据翻译。

2025-05-17 17:30:00 849

原创 java每日精进 5.15【分页实现】

前端使用实现分页,结合搜索功能,展示租户列表。代码位于 tenant/index.vue,以下是核心部分的分析和注释。JavaScript 逻辑。

2025-05-15 18:30:00 1071

Java学习Day51:紫云山金丹培育基地(移动端开发之多表联查,发送短信验证码)

Java学习Day51:紫云山金丹培育基地(移动端开发之多表联查,发送短信验证码)

2024-10-23

Java学习Day50:唤醒八戒(Excel相关)

Java学习Day50:唤醒八戒(Excel相关)

2024-10-22

Java学习Day45:兰喜村(Redis)

jedisUtils.java

2024-10-14

Java学习Day45:兰喜村(Redis)

jedis.properties

2024-10-14

项目里程碑1,学生实习管理系统1.0

学生实习管理系统1.0

2024-10-11

SSM框架保存,包含两个ssm框架的项目基础

SSM框架保存,包含两个ssm框架的项目基础

2024-10-01

梅瑟莫帮我学Java之学生考试系统(中残缺版)

梅瑟莫帮我学Java之学生考试系统(中残缺版)

2024-07-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除