- 博客(39)
- 收藏
- 关注
原创 Java 注解
Java注解核心知识点摘要 Java注解通过元注解控制其使用方式和生命周期: @Target - 定义注解可应用的位置(类、方法、字段等),通过ElementType枚举指定。未指定时可应用于任意声明位置。 @Retention - 决定注解保留阶段: SOURCE:仅源码可见 CLASS:默认值,写入class文件但运行时不可见 RUNTIME:运行时可通过反射读取 @Documented - 控制注解是否包含在生成的API文档中,影响文档展示但不改变运行时行为。 注解设计要点: 通过组合元注解精确控制注
2026-04-07 20:02:35
367
原创 Git分支命名规范与最佳实践
本文介绍了Git分支命名规范与最佳实践。详细列举了5种常见分支类型:功能分支(feature/)、修复分支(bugfix/)、发布分支(release/)、热修复分支(hotfix/)和实验分支(experiment/)。推荐使用小写字母、连字符分隔单词,保持简短但有描述性,并可包含相关票号。避免特殊字符、空格和含糊名称。团队协作建议统一前缀规范,可选包含开发者信息和日期格式。最后提供了实际命名示例,如feat/add-user-avatar-upload等。
2026-03-18 19:11:40
97
原创 localStorage vs sessionStorage
localStorage和sessionStorage都是Web Storage API提供的键值存储方式,仅支持字符串数据且受同源策略限制。主要区别在于:localStorage数据长期保存(需手动清除),可跨标签页共享;sessionStorage仅在当前会话有效(关闭标签页即清除)。两者API相同,存储对象需JSON序列化。登录态场景中,localStorage适合长期记忆(如管理后台),sessionStorage适合临时会话(如单页流程)。安全方面,两者均面临XSS风险,需配合XSS防护措施
2026-03-18 18:33:48
487
原创 Vue 路由配置解析
Vue路由配置解析 该代码实现了一个基于Vue Router的后台管理系统路由配置,主要功能包括: 路由表定义:包含登录页和主布局页(带多个子路由) 权限控制:通过路由守卫实现登录拦截 动态导入:使用懒加载提升性能 核心特点: 采用HTML5 History模式 通过meta字段标记页面权限和标题 主布局采用嵌套路由结构 路由守卫检查token实现登录保护 适用于需要权限管理的后台系统开发。
2026-02-27 22:24:35
378
原创 SpringBoot 的启动流程
Spring Boot 启动流程核心总结: 入口:主类main方法调用SpringApplication.run() 环境准备:加载配置、处理Profile 容器创建:根据应用类型选择上下文实现 自动配置:通过条件注解按需加载配置类 容器刷新:完成Bean实例化、依赖注入等核心操作 启动Web服务器(Web应用) 发布就绪事件,执行Runner扩展点 关键点:自动配置通过@ConditionalOnXXX条件控制,Web服务器在refresh阶段启动,启动后可通过Runner接口扩展。
2026-02-27 15:01:09
386
原创 Java 集合框架详解
Java集合框架提供了存储和操作数据的接口与实现,包含两大体系:Collection(List/Set/Queue)和Map(键值对)。常用实现包括ArrayList、LinkedList、HashSet、HashMap等,各有不同的有序性、唯一性和性能特点。文章详细介绍了各集合的使用场景、底层结构(如动态数组、链表、红黑树)、时间复杂度(O(1)/O(n)/O(log n))以及最佳实践,包括遍历删除的正确方式、排序比较器、Stream API操作等。特别强调了线程安全选择(如ConcurrentHash
2026-02-26 22:42:29
491
原创 SpringBoot 常用注解
SpringBoot常用注解总结 SpringBoot通过一系列注解简化了应用开发,主要包括: 启动类注解:@SpringBootApplication组合了配置、自动装配和组件扫描功能 IOC容器相关: 组件声明:@Component、@Service、@Controller等 依赖注入:@Autowired和@Resource的区别 特殊配置:@Configuration+@Bean的代理行为 自动装配机制:基于@Conditional系列注解的条件装配 Web开发:@RestController和各类
2026-02-26 22:35:21
463
原创 Mybatis的插件原理
MyBatis插件机制基于拦截器和动态代理实现,通过责任链模式为四大核心组件(Executor、StatementHandler等)添加增强逻辑。插件需实现Interceptor接口,在intercept方法中编写自定义逻辑(如SQL改写、日志记录等),并通过plugin方法生成代理对象。MyBatis初始化时会按配置顺序将插件层层包装到目标对象上,形成调用链。执行时方法调用会依次经过各插件的拦截逻辑,最后到达原始方法。这种机制实现了AOP风格的横切功能,典型应用包括SQL日志、分页、审计等。开发插件时需通
2026-02-25 16:09:31
701
原创 MyBatis 中动态 SQL 的作用
摘要: MyBatis动态SQL通过XML标签(如<if>、<foreach>等)实现SQL语句的灵活拼接,主要作用包括:1)多条件查询时动态生成WHERE子句;2)减少重复代码,替代if-else逻辑;3)支持批量操作;4)防止SQL注入;5)按需更新字段。典型应用场景包括条件搜索、批量处理、动态排序等。其执行原理基于OGNL表达式解析和SqlNode树组合,最终通过预编译保证安全性。相比手动拼接SQL,动态SQL提高了代码可读性、维护性和安全性。
2026-02-25 13:38:39
644
原创 MyBatis 分页查询
MyBatis分页查询主要有三种实现方式:原生手动分页(物理分页)、RowBounds逻辑分页和分页插件(如PageHelper/MyBatis-Plus)。原生方式通过SQL编写LIMIT/OFFSET实现物理分页,性能好但需手动计算偏移量;RowBounds是逻辑分页,先查全表再内存截取,大数据量时性能差;分页插件(推荐)自动改写SQL实现物理分页,支持多数据库方言且开发效率高。MyBatis-Plus提供更集成的分页方案。实践中建议使用物理分页+分页插件,避免内存压力和性能问题。
2026-02-25 13:19:38
560
原创 MyBatis 与 MyBatis-Plus 的区别
MyBatis是一个基础的SQL映射框架,强调SQL的灵活可控;而MyBatis-Plus是其增强工具包,在保持MyBatis所有特性的同时,提供开箱即用的单表CRUD、条件构造、分页等能力,显著减少样板代码。MyBatis更适合复杂SQL场景,MyBatis-Plus则适合大量单表操作的项目。两者可混合使用,MP不替代原生功能,开发时可根据需求选择合适方式。核心区别在于MP提升了开发效率,但复杂SQL仍需依赖MyBatis原生能力。
2026-02-24 20:21:58
712
原创 MyBatis 如何防止 SQL 注入?
MyBatis 防 SQL 注入的核心是:参数一律使用 #{} 做参数绑定(PreparedStatement 的 ? 占位),实现 SQL 结构与数据分离;对于必须使用 ${} 的表名/列名/排序等 SQL 片段,必须采用白名单或 <choose> 枚举替代。#{} 通过 TypeHandler 进行参数绑定而非简单转义,而 ${} 直接拼接 SQL 结构存在注入风险。关键场景如 LIKE 查询应使用 CONCAT 函数,IN 查询使用 <foreach> 生成多个 #{},分页参
2026-02-24 20:06:12
1042
原创 MyBatis 的缓存机制
MyBatis采用两级缓存机制:一级缓存为SqlSession级别,默认开启,同一会话内相同查询可复用结果;二级缓存为Mapper命名空间级别,需手动开启,支持跨会话共享。一级缓存解决会话内重复查询问题,二级缓存适用于读多写少场景但需注意一致性问题。缓存查询顺序为:先查一级缓存,再查二级缓存,最后查数据库。生产环境建议谨慎使用二级缓存,对于分布式系统更推荐采用Redis等集中式缓存方案。
2026-02-23 16:40:52
867
原创 MyBatis 中 ${} 和 #{} 有什么区别?
MyBatis中#{}和${}的核心区别在于安全性与应用场景。#{}采用预编译参数绑定,通过PreparedStatement防止SQL注入,适用于值传递;而${}是字符串拼接,存在注入风险,仅可用于SQL片段(如表名、列名等),使用时必须配合白名单验证。最佳实践是优先使用#{},必须用${}时需严格限制输入范围。LIKE和IN查询应使用#{}配合特定语法,避免直接拼接字符串。
2026-02-23 16:06:44
848
原创 ThreadLocal
ThreadLocal 摘要 ThreadLocal 是为每个线程提供独立变量副本的机制,通过线程内部的 ThreadLocalMap 实现数据隔离。其核心特点包括: 线程隔离:每个线程拥有独立副本,互不干扰 内存管理:使用弱引用作为key,但仍需手动remove避免内存泄漏 适用场景:请求上下文、线程绑定资源等线程维度数据 线程池风险:必须配合finally块清理,否则会导致数据污染和内存泄漏 最佳实践:定义为static final变量,及时remove,避免大对象存储 实现原理上,每个Thread维护
2026-02-23 13:55:05
982
原创 Java 线程池详解
Java线程池核心要点总结 线程池通过复用线程降低资源消耗,提高响应速度和管理性。核心参数包括: corePoolSize(常驻线程) maximumPoolSize(最大线程) workQueue(任务队列) handler(拒绝策略) 执行流程:优先创建核心线程→入队→创建临时线程→触发拒绝策略。 创建方式对比: Executors工厂类(简单但易OOM) ThreadPoolExecutor手动配置(生产推荐) 参数设置建议: CPU密集型:核心数+1 IO密集型:核心数×2 典型应用需结合命名、有界
2026-02-22 21:12:25
548
1
原创 Java 中 == 与 equals() 的区别
Java中==与equals()的区别: ==用于基本类型比较值,引用类型比较内存地址 equals()是Object类方法,默认比较地址,但String/包装类等通过重写实现内容比较 关键区别:==判断"是否同一个对象",equals()判断"逻辑是否相等" 注意事项:字符串常量池、包装类缓存、equals与hashCode契约 实用建议:比较对象内容用equals(),基本类型用==,null安全比较推荐"常量.equals(变量)"
2026-02-22 20:31:22
937
原创 TODO 注释添加规范
TODO注释规范:团队约定TODO注释需包含:责任人(@owner)、日期(YYYY-MM-DD)、优先级(P0-P3)和关联问题(#issue)。要求紧贴代码问题点,用动词描述可验证的改进动作(如"修复NPE根因")。禁止模糊的"以后优化"类TODO,P0/P1级必须关联工单。默认30天有效期,超期需更新或清理。PR合并时需检查模板合规性,建议CI工具扫描过期TODO。反例包括无具体行动项的"TODO:优化一下"等。通过规范让TO
2026-02-22 13:53:36
608
原创 Spring MVC: @RequestBody 注解详解
Spring MVC @RequestBody注解详解:用于读取HTTP请求体数据,通过Jackson反序列化为Java对象,适用于RESTful API开发。支持接收JSON格式的简单列表或复杂DTO对象,需前端设置Content-Type: application/json。与@RequestParam、@PathVariable相比,更适合处理复杂数据结构。注意事项包括:仅适用于POST/PUT请求、一个方法只能有一个@RequestBody、需注意JSON字段名匹配和日期格式转换等问题。开发REST
2026-02-22 13:53:14
678
原创 Apache Tika
Apache Tika是一个用于文档解析和内容提取的Java工具库,主要功能包括检测文件类型(MIME)、提取文本内容和元数据。它支持多种格式如PDF、Office文档、HTML、图片等,常用于文档上传处理、搜索索引构建等场景。核心组件包括类型检测(Detector)、文档解析(Parser)和元数据处理(Metadata)。使用时需注意内存管理、安全防护和性能优化,如处理大文件时的内存限制、防范Zip炸弹攻击等。Tika提供简单API(Tika类)和更可控的Parser接口两种使用方式,建议生产环境使用后
2026-02-21 10:00:32
849
原创 Spring MVC:@PathVariable 注解详解
Spring MVC的@PathVariable注解用于将URL路径中的变量绑定到控制器方法参数上,是RESTful接口的核心注解。它通过{variableName}占位符定义路径变量,支持简单映射(参数名一致可省略)、多变量接收以及Map集合接收等用法。与@RequestParam不同,@PathVariable参数位于URL路径而非查询字符串,更符合RESTful风格。该注解包含value/name和required属性,默认要求路径变量必须存在。适用于资源标识等场景,使URL更简洁规范。
2026-02-21 10:00:06
515
原创 MinIO
摘要: MinIO是一个兼容S3协议的对象存储服务,用于存储各类文件(图片、视频、日志等)及大文件,支持海量对象存储。核心概念包括Bucket(业务隔离的容器)、Object(文件实体)及元数据。在Spring Boot中通过MinioClient集成,支持上传(流式处理)、下载、删除及生成预签名URL(前端直连)。最佳实践包括:避免直接使用原始文件名(防路径穿越)、公私桶权限分离、流式处理大文件,以及解决MinIO与数据库的一致性问题(如失败补偿机制)。注意@Transactional不适用于MinIO操
2026-02-20 01:38:04
701
原创 Spring:@Transactional 注解详解
Spring @Transactional 注解简明指南 @Transactional 是 Spring 提供的声明式事务管理注解,用于将多个数据库操作包装为一个事务,保证 ACID 特性。核心功能包括: 事务范围:可应用于类(所有public方法)或方法 回滚规则:默认对RuntimeException/Error回滚,可通过rollbackFor/noRollbackFor自定义 传播行为:控制嵌套事务关系(如REQUIRED/REQUIRES_NEW) 隔离级别:解决并发问题(脏读/不可重复读/幻读)
2026-02-20 01:37:13
1237
原创 Spring MVC:MultipartFile 详解
MultipartFile是Spring MVC处理文件上传的核心接口,用于接收multipart/form-data请求中的文件数据。它提供getOriginalFilename()、getSize()等方法获取文件信息,支持getInputStream()流式读取或transferTo()直接保存。使用时需配合@RequestParam注解,并注意配置上传大小限制。常见注意事项包括:避免路径穿越攻击、不要对大文件使用getBytes()、校验文件类型等。Spring Boot通过spring.servl
2026-02-19 14:01:05
588
原创 Spring MVC:@RequestParam 注解详解
摘要:Spring MVC的@RequestParam注解用于绑定HTTP请求参数到控制器方法参数,支持查询参数、表单字段和文件上传。主要特性包括:1)自动类型转换;2)通过value/name指定参数名;3)required控制必选/可选;4)defaultValue设置默认值。与@RequestBody不同,它处理简单参数而非JSON body。常见应用场景包括分页查询、文件上传等。使用时需注意参数名匹配、基本类型处理等问题,推荐对可选参数使用包装类型或默认值。
2026-02-19 13:46:20
1078
原创 JETBRAINS 插件:FreqFiles
FreqFiles是一款IntelliJ IDEA插件,提供两种方式快速访问常用和高频文件:悬浮球和传统悬浮面板。主要功能包括:悬浮球支持hover展开、拖拽吸边和位置记忆;手动维护常用文件列表;自动统计高频文件;右键菜单快速添加文件;所有数据持久化保存。插件可通过IDEA插件市场安装,默认启用悬浮球功能,使用Shift+Alt+F快捷键切换显示。该工具旨在帮助开发者提高日常文件访问效率。
2026-01-26 20:51:10
305
原创 Docker
创建自定义桥接网络 docker network create mynet # 创建网络时指定配置 docker network create \ --driver bridge \ --subnet 172.20 .0.0/16 \ --gateway 172.20 .0.1 \ my-custom-net # 查看网络详细信息 docker network inspect mynet# 启动容器时指定网络# 验证网络连通性(使用容器名作为域名)# 使用 curl 测试服务访问。
2026-01-17 21:54:40
1029
原创 Spring IoC 与 AOP 的基本概念
本文介绍了Spring框架中的两个核心概念:IoC(控制反转)和AOP(面向切面编程)。IoC通过容器管理对象创建,实现对象依赖的自动注入,提供XML和注解两种配置方式。AOP则将横切关注点(如日志、事务)与核心业务逻辑分离,通过动态代理实现解耦。文章详细展示了IoC的配置方法(XML/注解)、依赖注入(@Autowired)以及AOP的基本原理,对比了有无AOP时的代码结构差异,帮助开发者理解Spring框架的核心思想及其实现方式。
2026-01-15 13:55:46
261
原创 Servlet 基本概念
允许用户请求服务器上的某个资源,并向用户显示请求结果:接收客户请求,然后向客户返回一些结果:告诉浏览器怎样把内容呈现给用户:Web客户与服务器通信所用的协议。
2026-01-01 12:52:02
818
原创 Ubuntu 安装 idea
z : 使用 gzip 解压,表示归档文件是经过 gzip 压缩的(通常以。f : 指定后面紧跟的 文件名(file),表示要操作的归档文件。x : 解压(extract) 模式,表示从归档文件中提取内容。正常情况:输出 :0、:1 或类似值。检查并设置 DISPLAY 环境变量。然后重新运行 IDEA。
2025-07-06 18:12:33
1226
原创 数据库课程设计-购物系统(纯MySQL)
首先从“店铺”实体和“商品”实体以及它们之间的联系来考虑,“店铺”实体与“商品”实体之间是一对多联系,需要在“商品”实体转换的关系模式中加入“店铺”实体的键。create_bill_pr包含八个参数:input_cust_id、input_shop_id、input_comm_id_1、input_count_1、input_comm_id_2、input_count_2、input_comm_id_3和input_count_3,含义是消费者编号、店铺编号,以及三个商品的商品编号和需求量。
2025-01-09 11:03:59
2786
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅