- 博客(143)
- 资源 (32)
- 问答 (1)
- 收藏
- 关注
原创 JAVA 项目统一 Result 响应类的一次优化和思考
静态常量解决高频无状态对象创建问题好的开发者必须关注内存和对象生命周期这不是微优化,是基本原则调用方有责任正确使用 API。
2026-07-09 18:07:29
243
原创 JAVA 代码赏析:更好的迭代器实践
在 Java 中使用Iterator进行集合遍历时,有两种常见的写法。本文档详细对比这两种写法的区别,并说明为什么推荐使用 for 循环写法。优先使用 for 循环迭代器写法) {// 处理逻辑仅在特殊情况下使用 while 循环需要在多个循环之间共享同一个迭代器迭代器的创建和使用需要分离(较少见)配合 HashSet/HashMap 进行去重时使用 for 循环迭代器可以在遍历中安全删除避免 ConcurrentModificationException。
2026-07-09 16:37:04
81
原创 Lombok @EqualsAndHashCode 注解详解
是 Lombok 提供的一个注解,用于自动生成equals()和hashCode()方法。这两个方法在 Java 中非常重要,特别是在使用集合类(如HashMapHashSet)时。减少样板代码:自动生成标准的 equals/hashCode 实现避免常见错误:确保两个方法的一致性提高可维护性:字段变更时无需手动更新方法灵活配置:支持排除、包含、调用父类等选项核心原则始终保证 equals 和 hashCode 的一致性谨慎选择参与比较的字段考虑性能和业务语义。
2026-07-08 17:33:20
210
原创 PostgreSQL JSONB 操作符详解
PostgreSQL 提供了专门的 JSONB 类型和操作符,用于高效存储和查询 JSON 数据。JSONB 以二进制格式存储,支持索引和快速字段访问。操作符返回类型用途示例->JSON单层提取,保持 JSON 格式->>TEXT单层提取,转为文本#>JSON多层嵌套提取,保持 JSON 格式#>>TEXT多层嵌套提取,转为文本->->>: 单层提取#>#>>: 多层嵌套提取箭头单数 (->#>: 返回 JSON 类型箭头双数 (->>#>>: 返回 TEXT 类型最佳实践。
2026-07-08 12:43:19
358
原创 Lombok @Accessors 注解详解
Accessors是 Lombok 提供的一个注解,用于配置 getter 和 setter 方法的生成方式。它可以控制是否生成链式调用(fluent)风格的 setter 方法,以及是否使用前缀。属性默认值作用适用场景chainfalsesetter 返回 thisDTO、VO、需要链式调用的场景fluentfalse去除 get/set 前缀内部类、配置类、追求简洁的场景prefix{}去除字段前缀遗留代码、特定命名规范优先保证框架兼容性保持团队代码风格一致。
2026-07-08 10:11:52
192
原创 第十二章:常用命令速查与实战技巧
学习路径回顾:第一章 理解 Gradle 与 Maven 的核心区别第二章 安装配置,设置国内镜像第三章 熟悉项目目录结构(与 Maven 基本相同)第四章 掌握 Groovy DSL 基础语法第五章 依赖管理:scope 映射、BOM、排除冲突第六章 插件:java、war、spring-boot、dependency-management第七章 Task 系统:执行模型、自定义任务第八章 多模块项目配置第九章 实战:将本项目 pom.xml → build.gradle(完整迁移)
2026-07-07 08:12:56
457
原创 第十一章:提速:三个配置开一开就行
Gradle Daemon 是常驻后台的 JVM 进程,第一次构建启动后,后续构建复用这个进程,省去 JVM 启动时间。Maven 没有这个能力,每次都从头编译,这是 Gradle 构建速度快的核心原因。默认已开启,无需配置。
2026-07-07 08:12:05
131
原创 第七章:日常构建命令
/ build.gradle 里加一个自定义任务doLast {${projectversion// build.gradle 里加一个自定义任务 tasks . register('printVersion') {doLast {println "当前版本: ${ project . version } " } } // 执行:gradle printVersioninto "${buildDir多模块配置。
2026-07-07 08:02:05
213
原创 第六章:插件
让 Spring Boot BOM 生效,Spring Boot 管理的依赖不用写版本号。Spring Boot 项目直接用。这两个 scope。
2026-07-06 12:26:34
163
原创 第五章:依赖管理
加了这两个插件之后,Spring Boot 管理的依赖都。自带一个版本清单(BOM),Gradle 里用。Spring Boot 的。旧版 Gradle 有个。
2026-07-06 09:44:59
418
原创 第四章:build.gradle 语法速览
/ 版本号统一管理,对应 <properties> ext {mybatisPlusVersion = '3.1.2' lombokVersion = '1.18.6' } // 用的时候: implementation "com.baomidou:mybatis-plus-boot-starter: ${ mybatisPlusVersion } " // ↑ 双引号才能插值,单引号不行${// 版本号统一管理,对应 <properties> ext {
2026-07-06 09:44:29
280
原创 第二章:安装、国内镜像、IDEA 集成
实际项目推荐用 Gradle Wrapper(见第十章),这里的全局安装主要用来初始化 Wrapper。配好 2.2 节的阿里云镜像,跟 Maven 的。两种方式选一个就行,推荐方式一,改一次到处生效。两者互不影响,但 Gradle 的。的目录,IDEA 自动识别。
2026-07-06 09:38:53
234
原创 第一章:Gradle vs Maven,该知道的差异
Gradle 用代码写配置,Maven 用 XML 写配置。Gradle 更快、更简洁,代价是刚开始不太顺手。(XML,只能描述,不能写逻辑)都是从头跑,这是本质差距。有 281 行,迁移后。
2026-07-06 09:34:14
155
原创 Java 内存模型中的内存屏障通俗解释
内存屏障是 JVM 和 CPU 用来实现 JMM 可见性、有序性规则的底层机制。它不是关闭缓存,也不是简单刷新主存,而是通过限制重排序、约束读写顺序、配合缓存一致性协议,让多线程之间能按 Java 规则正确看到彼此的写入。
2026-07-04 18:25:56
92
原创 Java 内存模型(JMM)通俗解释
JMM 是 Java 多线程的内存可见性规则。主内存工作内存主内存 ≠ 单纯物理 RAM工作内存 ≠ 固定的 L1/L2/L3volatile1. 保证可见性2. 禁止特定重排序复合操作原子性集合线程安全多个变量的一致性一句话:volatile 不是让线程不用缓存,而是让 JVM 和 CPU 按照 JMM 的规则保证变量读写的可见性和有序性。
2026-07-04 18:23:52
184
原创 JAVA 代码赏析:优雅的 Token 提取策略
提取通用工具方法可复用到其他场景单元测试容易编写使用可变参数简化调用firstNotBlank(a, b, c, d, e) // 灵活传入任意数量参数分层查找 + 短路返回// 提前退出,避免无效计算异常兜底保证健壮性// 优雅降级维度丑陋写法优雅写法代码行数~40 行~15 行嵌套层次4 层 if-else2 层逻辑可扩展性每加一个字段 +6 行每加一个字段 +1 参数可读性⭐⭐⭐⭐⭐⭐⭐可维护性⭐⭐⭐⭐⭐⭐⭐复用性无法复用可复用用简单的抽象(
2026-07-04 16:27:24
131
原创 MyBatis <bind> 使用指南
bind>是 MyBatis 动态 SQL 中用于定义临时变量的标签。它可以把一个表达式、参数路径或加工后的值,先绑定成一个新的变量名,然后在后续 SQL 中复用。<bind>就是给 MyBatis 动态 SQL 里的某个值起一个临时名字。示例:上面代码中,是通过<bind>生成的临时变量。那么最终%Tom%<bind>本身不会直接生成 SQL。例如:这行不会出现在最终 SQL 中。或者在动态判断中使用:= null " >= null " >= null " ><bind>
2026-07-04 15:55:35
264
原创 PostgreSQL to_json 与 row_to_json:妙用与区别详解
✅转换标量值或数组使用预定义的复合类型构造动态 JSON 结构性能敏感场景(略快)❌直接转换表行(语义不清晰)需要保留原始字段名的简单查询维度to_json灵活性⭐⭐⭐⭐⭐⭐⭐⭐⭐易用性⭐⭐⭐⭐⭐⭐⭐⭐性能⭐⭐⭐⭐⭐⭐⭐⭐⭐语义清晰度⭐⭐⭐⭐⭐⭐⭐⭐🎯简单表行转 JSON→ 用🎯复杂嵌套/动态结构→ 用to_json🎯性能敏感→ 优先to_json🎯代码可读性→ 优先好用是好用,但要注意效率!大数据量时务必分页处理,避免内存爆炸。
2026-07-04 13:10:12
640
原创 AtomicBoolean + CAS 机制通俗讲解
CAS(Compare And Swap,比较并交换)是一种原子操作,就像是一个"智能开关"。CAS是一种"乐观"的原子操作:先假设能成功,如果不成功就放弃提供了线程安全的布尔值操作是核心方法:如果当前值符合预期,就更新并返回 true适合用于简单的状态标记和防重复执行场景记得在finally块中释放状态,避免死锁。
2026-07-04 11:11:37
308
原创 AtomicBoolean + CAS 机制 关于 线程池任务丢弃策略优化
优先使用标准库:Java 并发包已经提供了丰富的工具,不要重复造轮子简单即是美:能用一行代码解决的问题,不要用十行让专业的人做专业的事:线程池负责管理任务,我们只负责提交任务。
2026-07-04 11:09:48
491
原创 第18篇 Kafka concurrency 含义、作用和生产设置建议
是每个应用实例内的 consumer 数量。总 consumer 数 =应用实例数 × concurrency。一个 partition 同一时刻只能被一个 consumer 消费。consumer 数小于 partition 数时,一个 consumer 会消费多个 partition。consumer 数等于 partition 数时,通常比较理想。consumer 数大于 partition 数时,多出来的 consumer 会空闲。
2026-07-03 21:01:24
194
原创 Java基础 中 `String` 和 `Character` 的区别,以及泛型中该用哪个
这些虽然看起来只有一个字符,但它们一般来自数据库、JSON、配置、接口参数,所以用。虽然它们只有一个字符,但它们是业务字段,通常来自数据库或 JSON,所以用。如果集合里保存的是文本、编码、状态、字段名、日期、表名、索引名,应该用。业务字段、数据库字段、JSON 字段、接口参数、ES 字段,基本都用。这样和 MyBatis、JSON、接口参数、前端传值都更统一。即使只有一个字符,只要它表达的是业务含义,通常也建议用。实际项目中,很多值都是字符串形式传输的。如果集合里保存的是单个字符,才用。
2026-06-30 10:51:59
300
原创 PostgreSQL 索引里到底存了什么?
内容是否常见通俗解释索引 key常见建索引的字段值,例如TID常见heap 表中真实数据行的位置INCLUDE 字段可选额外放进索引里的字段,用来减少访问 heap页面指针常见B-tree 从上一层找到下一层要用页面/元数据常见PostgreSQL 维护索引结构需要的内部信息完整行数据通常没有PostgreSQL 普通索引一般不存完整行MVCC 完整可见性信息通常没有所以 Index Only Scan 有时仍要访问 heap。
2026-06-29 15:05:55
474
原创 PostgreSQL 和 MySQL InnoDB:主键索引到底需不需要“回表”?
先通过索引找到数据位置,再去真正的数据表里把完整记录取出来,这一步就可以理解为回表。SELECT *如果索引里只有id和数据地址,那么数据库找到id = 1001后,还要再去数据表里取order_noamount等其他字段,这就是“回表”。数据库主键索引结构主键叶子节点存什么是否需要回表PostgreSQLB-tree 索引 + heap 表分离主键值 + TID通常需要访问 heapPostgreSQLCLUSTER后heap 按索引顺序重排主键值 + TID。
2026-06-29 14:42:42
472
原创 PostgreSQL 表继承设计:父表是否需要设置主键?
特性父表设置主键 ❌父表不设置主键 ✅主键约束继承❌ 不会继承数据唯一性保证❌ 仅父表内有效索引空间占用⚠️ 浪费空间✅ 无额外开销查询性能提升❌ 无效果符合官方最佳实践❌ 不符合✅ 符合维护复杂度⚠️ 增加复杂度✅ 简洁清晰在 PostgreSQL 表继承设计中:✅父表不应该设置主键主键约束不会继承父表通常不存储数据无法保证全局唯一性浪费存储空间和维护成本✅每个子表应独立设置主键保证子表内的数据唯一性提升子表查询性能。
2026-06-25 09:24:13
326
原创 PostgreSQL CUME_DIST() 窗口函数完全解析
累积分布(多少比例 ≤ 当前值)适用场景= 中位数、四分位数、累积分布曲线、异常检测返回值= 小数 1/n - 1.0,通常乘以 100 转成百分比计算公式= 小于等于当前值的行数 / 总行数使用时机= 需要"累积比例"或"分布分析"时。
2026-06-25 08:16:08
183
原创 PostgreSQL DENSE_RANK() 窗口函数完全解析
并列排名,不跳号(1, 1, 2, 3)适用场景= 成绩排名、等级划分、前 N 个不同值最大优势= 排名连续,符合人类直觉与 RANK 区别= 是否跳号使用时机= 需要"公平且紧凑"的排名时。
2026-06-24 20:13:36
225
原创 PostgreSQL PERCENT_RANK() 窗口函数完全解析
百分比排名(0% - 100%)适用场景= 百分位计算、前 N% 筛选、标准化数据、异常检测返回值= 小数 0.0 - 1.0,通常乘以 100 转成百分比计算公式= (排名 - 1) / (总行数 - 1)使用时机= 需要"相对位置"而非"绝对排名"时。
2026-06-24 20:12:36
446
原创 PostgreSQL RANK() 窗口函数完全解
RANK()= 并列排名,但会跳号(1, 1, 3, 4)适用场景= 排行榜、找并列第一、分段奖励与 ROW_NUMBER 区别= 相同值处理方式不同与 DENSE_RANK 区别= 是否跳号使用时机= 需要"公平排名"且允许空缺时。
2026-06-23 19:28:43
356
原创 PostgreSQL Schema:被我们常常忽略的层级
为什么我的表前面多了个public.?这个 schema 是什么鬼?其实,你一直在使用 schema,只是没意识到它的存在。就像空气一样,平时感觉不到,但关键时刻能救命。Schema 是 PostgreSQL 中数据库对象的命名空间容器表(Table)视图(View)函数(Function)序列(Sequence)索引(Index)小项目(< 20 张表):用public即可,别过度设计中大型项目:按模块/业务域划分 schema多租户系统:每个租户一个 schema团队协作。
2026-06-23 11:23:08
582
原创 PostgreSQL ROW_NUMBER() 窗口函数完全解析
窗口"不是窗户,而是"视野范围”!普通聚合函数(SUM、COUNT):把多行压缩成一行,你看不到原始数据了窗口函数(ROW_NUMBER):在每行旁边附加计算结果,原始数据还在普通聚合:把全班成绩汇总成平均分 → 你看不出每个人的分数窗口函数:在每个人旁边标注"班级第几名" → 既看到分数,又看到排名为什么叫"窗口"?因为你可以定义一个"滑动窗口"(比如"当前行 + 前2行"),在这个范围内计算。标记用户的首次登录和最后登录SELECTuser_id,CASETHEN '首次登录'
2026-06-22 19:47:43
153
原创 PostgreSQL LEFT 和 RIGHT 函数完全指南
✅数据脱敏(手机号、身份证、银行卡)提取固定长度的前缀/后缀解析编码/编号简单的字符串截取❌复杂的位置提取(用 SUBSTRING 或正则)可变长度的提取(用 POSITION + SUBSTRING)模式匹配(用 LIKE 或正则):从左边取 n 个字符:从右边取 n 个字符最常用场景:数据脱敏、编码解析、前缀/后缀提取性能关键:合理使用索引,优先使用 LIKE 进行前缀匹配安全第一:始终处理 NULL 值,使用 COALESCE。
2026-06-22 19:17:44
453
原创 Lombok @Value(staticConstructor = “of“) 完全解析
特性@Value@Data字段修饰符普通字段getter✅✅setter❌✅构造器全参构造器无参构造器可变性不可变可变适用场景值对象、DTOEntity、表单对象线程安全✅ 天然线程安全❌ 需要同步@Value= 不可变对象(final 字段 + 只有 getter)= 私有构造器 + 静态工厂方法遵循 Java 官方命名约定,代码更专业适合值对象、DTO、配置对象等不可变场景配合@NonNull、集合不可变化处理,保证真正的不可变性。
2026-06-22 18:49:50
200
原创 Lombok @Data 和 @Value 的区别:什么时候用可变对象,什么时候用不可变对象?
Data:生成可变 Java Bean,带 getter/setter/toString/equals/hashCode。@Value:生成不可变值对象,字段 final,没有 setter,类默认 final。
2026-06-22 18:04:39
213
原创 Java 对象比较:为什么要实现 equals 和 hashCode?它们到底比的是什么?
定义equalshashCode比较字段时,核心问题是:在你的业务里,什么字段能唯一代表这个对象?不是所有字段都应该拿来比较。==
2026-06-22 17:17:32
173
Maven + spring + spring mvc + mybatis 整合例子
2015-09-18
commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar.rar
2015-09-18
数据库索引最左原则问题?急
2015-04-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅