<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mcband的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mcband</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mcband]]></copyright><item><title><![CDATA[MyBatis-Plus中实现自定义复杂排序逻辑]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/158811766</link><guid>https://blog.youkuaiyun.com/mcband/article/details/158811766</guid><author>mcband</author><pubDate>Sun, 08 Mar 2026 21:12:43 +0800</pubDate><description><![CDATA[首先，我们创建一个QueryWrapper实例。如果查询模型（model）为空，我们直接返回一个空的QueryWrapper实例。为了根据gateNo进行排序，我们使用last方法来添加自定义的SQL排序片段。这里使用CASE语句来处理特殊值“天”，并使用CAST函数和SUBSTRING_INDEX来分离和转换字符串为数值。String customOrderSql = "CASE WHEN gate_no LIKE '天-%' THEN 2 ELSE 1 END, " +]]></description><category></category></item><item><title><![CDATA[java计算当前日期后N个工作日的日期]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/157619103</link><guid>https://blog.youkuaiyun.com/mcband/article/details/157619103</guid><author>mcband</author><pubDate>Sun, 01 Feb 2026 21:13:04 +0800</pubDate><description><![CDATA[在工作中遇到涉及工作日相关的需求，下面是个工具类。]]></description><category></category></item><item><title><![CDATA[OpenFeign - 底层原理揭秘：动态代理 + HTTP 客户端如何工作]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/157364209</link><guid>https://blog.youkuaiyun.com/mcband/article/details/157364209</guid><author>mcband</author><pubDate>Sun, 25 Jan 2026 21:25:11 +0800</pubDate><description><![CDATA[我们可以通过 @FeignClient 注解的 configuration 属性或者全局配置来指定自定义的 Client 实现。]]></description><category></category></item><item><title><![CDATA[Spring Boot 整合 ShedLock 处理定时任务重复执行的问题]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/157104577</link><guid>https://blog.youkuaiyun.com/mcband/article/details/157104577</guid><author>mcband</author><pubDate>Sun, 18 Jan 2026 23:12:20 +0800</pubDate><description><![CDATA[在分布式系统中，定时任务的执行往往需要考虑到多个实例的并发执行问题。假设一个定时任务会在多个节点上并发执行，可能导致重复执行，甚至引发数据异常或系统不一致问题。为了解决这一问题，ShedLock 是一个简单而有效的解决方案，它可以确保在分布式环境中，只有一个节点在某一时刻执行指定的定时任务ShedLock 是一个轻量级的 Java 库，用于解决分布式系统中定时任务的重复执行问题。它的核心思想是在数据库中加锁，确保在分布式环境下，只有一个节点能够在指定时间执行某个任务。]]></description><category></category></item><item><title><![CDATA[手动提交事务（Propagation.REQUIRES_NEW）]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/156836242</link><guid>https://blog.youkuaiyun.com/mcband/article/details/156836242</guid><author>mcband</author><pubDate>Sun, 11 Jan 2026 22:26:40 +0800</pubDate><description><![CDATA[在工作中有这么一个需求，批量处理提交接口，对三条数据进行批量提交，前两条数据处理成功，因为第三条数据报错导致全部回滚。但是应该成功的成功，报错的数据回滚。通过查询资料，本身接口最外层有事务，所以只能对接口内部手动增加事务，但还不能依赖于外部事务。通过查询资料，使用Propagation.REQUIRES_NEW可以解决问题。]]></description><category></category></item><item><title><![CDATA[Java 三方 JSON 比对]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/156365538</link><guid>https://blog.youkuaiyun.com/mcband/article/details/156365538</guid><author>mcband</author><pubDate>Sun, 28 Dec 2025 20:08:55 +0800</pubDate><description><![CDATA[/ 比对两个JSON字符串，返回差异列表// 递归比对JsonNode节点// 节点类型不同DIFFS.add(path + "：类型不一致（预期：" + expected.getNodeType() + "，实际：" + actual.getNodeType() + "）");return;// 叶子节点（值节点）if (!]]></description><category></category></item><item><title><![CDATA[next-ai-draw-io：一个用AI绘制流程架构图的方案]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/156134225</link><guid>https://blog.youkuaiyun.com/mcband/article/details/156134225</guid><author>mcband</author><pubDate>Sun, 21 Dec 2025 20:49:03 +0800</pubDate><description><![CDATA[这两天看到 Github 的热门榜上有一个项目叫next-ai-draw-io[1]，该项目是让 AI 来绘制 draw.io格式的图片。draw.io[2]是一个开源的在线绘图网站，像一个在线版的visio，主要是用于绘制流程图或架构图。以前，AI也是能生成流程图的，一般是让AI去提供draw.io格式去下载。下载之后，从文件->设备导入文件，就可以加载。导入之后，就会显示绘制的内容：不过这样操作，主要有以下三个问题：每次交互额外的提示词(提供draw.io下载文件)，比较麻烦。]]></description><category></category></item><item><title><![CDATA[forEach跳出循环]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/155918209</link><guid>https://blog.youkuaiyun.com/mcband/article/details/155918209</guid><author>mcband</author><pubDate>Sun, 14 Dec 2025 21:33:32 +0800</pubDate><description><![CDATA[日常开发中,项目都升级到jdk8+后,项目中大量使用lamba表达式,经常使用forEach。]]></description><category></category></item><item><title><![CDATA[【Spring Boot】Interceptor的原理、配置、顺序控制及与Filter的关键区别]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/155678027</link><guid>https://blog.youkuaiyun.com/mcband/article/details/155678027</guid><author>mcband</author><pubDate>Sun, 07 Dec 2025 21:07:53 +0800</pubDate><description><![CDATA[Spring Boot 中，拦截器通常用于在请求处理前后执行一些逻辑，这点与Servlet容器提供的过滤器有点类似。平常我们开发Jave Web应用的时候，经常能碰到要对请求访问进行通用逻辑处理的场景，比方说记录访问日志、确认访问权限等。你是否曾经纠结于是选过滤器还是拦截器来实现逻辑代码的编写，本篇文章先重点介绍Spring中的interceptor拦截器， 然后就过滤器和拦截器这两个常见但易混淆的请求拦截工具，讨论两者相似且不同之处。]]></description><category></category></item><item><title><![CDATA[Java 获取日期前一年、月、日，指定日期的前几天，后几天]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/155427976</link><guid>https://blog.youkuaiyun.com/mcband/article/details/155427976</guid><author>mcband</author><pubDate>Sun, 30 Nov 2025 21:59:49 +0800</pubDate><description><![CDATA[【代码】Java 获取日期前一年、月、日，指定日期的前几天，后几天。]]></description><category></category></item><item><title><![CDATA[泛型中的T、E、K、V、?]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/155168331</link><guid>https://blog.youkuaiyun.com/mcband/article/details/155168331</guid><author>mcband</author><pubDate>Sun, 23 Nov 2025 21:22:42 +0800</pubDate><description><![CDATA[首先，我们要明确一个概念，T，E，K，V是类型参数（Type Parameter），而?- 类型不安全： 可以存入任何类型（String、Integer等），但取出时容易忘记转换或转换错误 - 繁琐的强制转换： 每次取出都要手动cast - 运行时错误： 如果类型转换错了，只能在运行时才发现（抛出ClassCastException）表示“某种类型是 T 或 T 的子类”，适合生产者/只读场景（PECS 原则中的 Producer）。读（生产者）用 extends，写（消费者）用 super。]]></description><category></category></item><item><title><![CDATA[Guava TreeRangeSet：区间运算的数学之美！]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/154313208</link><guid>https://blog.youkuaiyun.com/mcband/article/details/154313208</guid><author>mcband</author><pubDate>Sun, 02 Nov 2025 22:28:29 +0800</pubDate><description><![CDATA[TreeRangeSet是Guava中基于红黑树实现的区间集合。它专门用于处理区间的并集、交集、补集等数学运算，让复杂的区间逻辑变得简单直观。简单说，它就像是给区间运算装上了"数学大脑"！]]></description><category></category></item><item><title><![CDATA[IDEA Debug高阶技巧]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/153929452</link><guid>https://blog.youkuaiyun.com/mcband/article/details/153929452</guid><author>mcband</author><pubDate>Sun, 26 Oct 2025 19:21:35 +0800</pubDate><description><![CDATA[为了定位到具体哪一条数据出了问题，我们需要按F9或点击箭头处按钮直到循环到错误数据，案例中共6条数据，即使最后一条数据错误，我们也只需要按五次即可发现问题数据，但是在正式/测试环境中，你无法确认从数据库中查询到多少条数据，假如是1000条，接下来很长一段时间你将被这个问题所困扰。Spring Boot项目在启动时，会加载所有被标注的元数据，此时我们自定义了一个Bean的类型叫a，我们可以在BeanFactoryUtils对应的加载方法中添加条件断点，这样就可以更快的查看我们自定义的Bean的加载逻辑。]]></description><category></category></item><item><title><![CDATA[Apache Commons IO：文件流处理利器，让Java IO操作更简单]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/153137387</link><guid>https://blog.youkuaiyun.com/mcband/article/details/153137387</guid><author>mcband</author><pubDate>Sun, 12 Oct 2025 21:43:38 +0800</pubDate><description><![CDATA[两者对比，代码量减少 80%，且FileUtils内部做了大量优化：自动处理缓冲区大小、支持大文件断点续传、完善的异常封装。这就是 Commons IO 的核心价值 —— 将文件操作的复杂细节封装成直观的 API，让开发者专注于业务逻辑。处理文件名和路径时，不同操作系统的差异（如 Windows 用\，Linux 用/）是常见陷阱。FilenameUtils提供了跨平台的文件名处理方法。处理目录时无需担心子文件或多级目录的问题，forceMkdir比 JDK 的mkdirs()更健壮，会自动处理权限问题。]]></description><category></category></item><item><title><![CDATA[SpringBoot配置优化：Tomcat+数据库+缓存+日志全场景教程]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/151934181</link><guid>https://blog.youkuaiyun.com/mcband/article/details/151934181</guid><author>mcband</author><pubDate>Sun, 21 Sep 2025 20:14:06 +0800</pubDate><description><![CDATA[用@Async注解实现异步任务时，Spring Boot默认用SimpleAsyncTaskExecutor——这个执行器“每次都新创建线程”，高并发时会生成大量线程，导致“系统资源耗尽”，就像“每次办事都找新临时工，人太多管理不过来”。文件没变则用缓存，兼顾“快”和“新”。Spring Boot默认用HikariCP作为数据库连接池（性能最优的连接池之一），但默认最大连接数仅10，若项目并发高，会出现“数据库连接不够用，请求卡壳”的情况，就像“餐厅只有10个服务员，客人多了要排队”。]]></description><category></category></item><item><title><![CDATA[Hutool CompareUtil搞定中文排序、自定义顺序全支持]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/151689775</link><guid>https://blog.youkuaiyun.com/mcband/article/details/151689775</guid><author>mcband</author><pubDate>Sun, 14 Sep 2025 22:11:28 +0800</pubDate><description><![CDATA[做开发时总被 “比较排序” 折磨：比较两个日期，一个是 null 直接报 NullPointerException，查了半天才定位到中文姓名排序，按默认 String 比较变成 “张三” 排在 “李四” 后面（按 ASCII 码），完全不符合拼音习惯商品状态要按 “待支付> 已支付 > 已取消” 自定义顺序排序，得写十几行 Comparator，逻辑绕来绕去其实 Hutool 的 CompareUtil 早就把这些事搞定了。]]></description><category></category></item><item><title><![CDATA[MyBatis 拦截器让搞定监控、脱敏和权限控制]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/151294548</link><guid>https://blog.youkuaiyun.com/mcband/article/details/151294548</guid><author>mcband</author><pubDate>Sun, 07 Sep 2025 20:49:06 +0800</pubDate><description><![CDATA[MyBatis 的拦截器本质是JDK 动态代理，能在 SQL 执行的关键节点 “插队” 执行我们的逻辑。1234→************34）脱敏。比如先注册脱敏拦截器，再注册慢查询拦截器，会导致慢查询日志里的参数已经被脱敏，排查问题时看不到原始值。正确顺序：按 “SQL 执行前→执行中→执行后” 排序，比如：权限拦截器（改 SQL）→慢查询拦截器（监控）→脱敏拦截器（处理结果）。需求：自动记录所有 SQL 的执行时间，超过 500ms 就报警，包含完整 SQL 和参数。]]></description><category></category></item><item><title><![CDATA[Hutool DsFactory多数据源切换]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/151050807</link><guid>https://blog.youkuaiyun.com/mcband/article/details/151050807</guid><author>mcband</author><pubDate>Sun, 31 Aug 2025 20:41:30 +0800</pubDate><description><![CDATA[DsFactory 的核心优势是零侵入配置，支持多种配置方式，不管是 properties 文件还是代码里直接定义，都能快速初始化数据源。当然它也有局限：复杂的分库分表场景还是需要 Sharding-JDBC，但普通多数据源场景用它足够了。驱动包要配齐：使用哪种数据库，就要添加对应的驱动依赖，不然会提示 “找不到驱动类”默认数据源必须有：至少要配置一个default数据源，否则会报错。切换方便：通过名称获取数据源，一行代码完成切换，不用 AOP。动态灵活：运行时可以添加、移除数据源，适合动态场景。]]></description><category></category></item><item><title><![CDATA[MyBatis流式查询详解]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/150711345</link><guid>https://blog.youkuaiyun.com/mcband/article/details/150711345</guid><author>mcband</author><pubDate>Sun, 24 Aug 2025 20:06:45 +0800</pubDate><description><![CDATA[普通查询：一次性将全部结果加载到内存，然后再处理。流式查询：数据库返回一个游标（Cursor），应用端一批一批地从游标读取数据，边读边处理，避免占用大量内存。适用场景导出大批量数据（CSV、Excel）批量处理（数据同步、数据迁移）实时计算。]]></description><category></category></item><item><title><![CDATA[Java中四种引用的区别]]></title><link>https://blog.youkuaiyun.com/mcband/article/details/150472360</link><guid>https://blog.youkuaiyun.com/mcband/article/details/150472360</guid><author>mcband</author><pubDate>Sun, 17 Aug 2025 20:38:30 +0800</pubDate><description><![CDATA[在JDK 1.2以前，Java中的引用定义为：如果引用类型的数据中存储的数值代表的是另一块内存的起始地址，则这块内存即代表着一个引用。故在该定义下，一个Java对象仅有被应用和未被引用两种状态。在JDK 1.2之后，Java对引用的概念进行了扩充，将引用分为强引用、软引用、弱引用和虚引用。这四种引用与Java虚拟机的垃圾回收机制紧密关联，建议重点关注。]]></description><category></category></item></channel></rss>