分类 后端 下的文章 - CorePlayers
首页
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
搜 索
1
2026技术架构新趋势:从微服务回调到AI原生架构设计
45 阅读
2
DDD领域驱动设计:从底层原理到生产级全链路落地实战
41 阅读
3
Go + 云原生2026:从微服务到AI Infra的实战架构
35 阅读
4
事件驱动架构(EDA):从理论到项目落地的完整实践
34 阅读
5
2026 AI编程范式演进:从Vibe Coding到Spec-Driven Development再到Harness Engineering
31 阅读
ALL
(78)
AI
(20)
前端
(24)
后端
(23)
Dify/Coze
(7)
架构设计
(6)
登录
/
注册
搜 索
标签搜索
AI Agent
边缘计算
RSC
虚拟线程
Java
Spring Boot 4
Vibe Coding
AI原生
SDD
全栈开发
高并发
Project Loom
性能优化
2026趋势
协议标准
工具调用
MCP协议
多Agent协作
CrewAI
Spring AI
EthanCcc
累计撰写
78
篇文章
累计收到
1
条评论
首页
栏目
ALL
AI
前端
后端
Dify/Coze
架构设计
页面
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
用户登录
登录
注册
后端
2025-04-10
SpringBoot 3 + MyBatis-Plus 全栈项目实战:从零搭建企业级应用
SpringBoot 3 + MyBatis-Plus 是目前 Java 后端开发中最流行的技术组合。本文将从零开始,带你搭建一个具备完整前后端分离能力的企业级项目,涵盖项目结构设计、数据库操作、权限认证和部署方案。项目初始化:最佳实践的项目结构src/main/java/com/example/project/\n├── config/ # 配置类(Security、CORS、MyBatis-Plus)\n├── controller/ # 控制器层\n├── service/ # 服务接口\n│ └── impl/ # 服务实现\n├── mapper/ # MyBatis Mapper 接口\n├── entity/ # 数据库实体\n├── dto/ # 数据传输对象\n├── vo/ # 视图对象(返回给前端)\n├── common/ # 公共类(统一响应、异常处理)\n│ ├── Result.java\n│ ├── GlobalExceptionHandler.java\n│ └── PageResult.java\n└── utils/ # 工具类MyBatis-Plus:告别手写 SQL1. 基础配置// application.yml\nspring:\n datasource:\n url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8mb4\n username: root\n password: $\nmybatis-plus:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL 日志\n map-underscore-to-camel-case: true # 下划线转驼峰\n global-config:\n db-config:\n logic-delete-field: deleted # 逻辑删除字段\n logic-delete-value: 1\n logic-not-delete-value: 02. 实体与 Mapper// User.java - 实体类\n@Data\n@TableName("t_user")\npublic class User \n\n// UserMapper.java - 一行代码完成 CRUD\n@Mapper\npublic interface UserMapper extends BaseMapper ")\n User selectByEmail(@Param("email") String email);\n}3. 分页查询(一行代码)// Controller\n@GetMapping("/list")\npublic Result list(\n @RequestParam(defaultValue = "1") Integer page,\n @RequestParam(defaultValue = "10") Integer size,\n @RequestParam(required = false) String keyword\n) \n wrapper.orderByDesc(User::getCreateTime);\n return Result.success(userService.page(pageParam, wrapper));\n}统一响应与异常处理// Result.java - 统一响应格式\n@Data\npublic class Result \n public static Result error(String message) \n}\n\n// GlobalExceptionHandler.java - 全局异常处理\n@RestControllerAdvice\npublic class GlobalExceptionHandler \n @ExceptionHandler(MethodArgumentNotValidException.class)\n public Result handleValidation(MethodArgumentNotValidException e) \n}Spring Security + JWT 认证// SecurityConfig.java\n@Configuration\n@EnableWebSecurity\npublic class SecurityConfig \n}\n\n// JwtUtil.java\n@Component\npublic class JwtUtil ")\n private String secret;\n\n public String generateToken(Long userId, String username) \n}前后端分离项目部署Docker Compose 一键部署# docker-compose.yml\nversion: '3.8'\nservices:\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: $\n volumes:\n - mysql_data:/var/lib/mysql\n\n backend:\n build: ./backend\n ports:\n - "8080:8080"\n depends_on:\n - mysql\n environment:\n SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb\n\n frontend:\n build: ./frontend\n ports:\n - "80:80"\n depends_on:\n - backend\n\nvolumes:\n mysql_data:总结SpringBoot 3 + MyBatis-Plus 的组合让 Java 后端开发变得异常高效——MyBatis-Plus 消除了 80% 的 CRUD 样板代码,SpringBoot 3 的自动配置让你专注于业务逻辑。但高效不等于简单:理解 Spring 的 IoC 容器、AOP 切面编程、事务传播机制,才能真正驾驭这套技术栈。
2025年04月10日
11
0
1
2025-03-20
Java 8~26 新特性全景解读:从 Lambda 到 Virtual Threads 的进化之路
Java 从 2014 年发布 Java 8 以来,已经经历了十多个版本的重大演进。从 Lambda 表达式到虚拟线程,从模块化系统到模式匹配,Java 已经从"啰嗦的老年人"蜕变为"现代化的强力语言"。本文系统梳理 Java 8 到最新版本的核心新特性,帮你快速掌握 Java 的进化脉络。Java 8(2014.03):里程碑版本Lambda 表达式与函数式接口// 以前:匿名内部类 new Thread(new Runnable() { @Override public void run() }).start(); // Java 8:Lambda 表达式 new Thread(() -> System.out.println("Hello")).start(); // 方法引用 List names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(System.out::println);Stream API:声明式数据处理List result = list.stream() .filter(x -> x > 10) // 过滤 .map(x -> x * 2) // 转换 .sorted(Comparator.reverseOrder()) // 排序 .distinct() // 去重 .limit(5) // 截取 .collect(Collectors.toList());Stream 的核心特点:惰性求值——中间操作不会立即执行,直到遇到终端操作;短路操作——limit() 和 findFirst() 可以提前终止遍历;并行流——parallelStream() 利用 ForkJoinPool 实现多核并行处理。Optional:告别 NullPointerExceptionOptional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("Unknown"); // 链式安全访问CompletableFuture:异步编程利器CompletableFuture.supplyAsync(() -> fetchUser()) .thenApplyAsync(User::getOrders) .thenAcceptAsync(orders -> System.out.println(orders.size())) .exceptionally(e -> );Java 9~11:模块化与增强Java 9:模块化系统(Project Jigsaw)// module-info.java module com.example.myapp { requires java.sql; requires spring.boot; exports com.example.api; opens com.example.entity to spring.core; }Java 10:局部变量类型推断(var)var list = new ArrayList<String>(); var user = userService.getById(1L);Java 11:HttpClient 标准化HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());Java 12~17:Switch 表达式与记录类Switch 表达式(Java 14)String result = switch (day) { case MONDAY, FRIDAY -> "工作日开始了"; case SATURDAY, SUNDAY -> default -> "普通的一天"; };Record 类(Java 16):消灭样板代码public record User(Long id, String name, String email) // 自动生成:构造函数、getter、equals()、hashCode()、toString()Sealed Classes(Java 17):精准的类型控制public sealed interface Shape permits Circle, Rectangle, Triangle public record Circle(double radius) implements Shape public record Rectangle(double width, double height) implements Shape Java 21(LTS):虚拟线程革命虚拟线程是 Java 21 最重磅的特性,彻底改变了 Java 的并发编程模型:// 平台线程(传统):1:1 映射到 OS 线程,创建成本高 // 虚拟线程:由 JVM 管理,创建成本极低,可以轻松创建百万级 Thread.ofVirtual().start(() -> { System.out.println("Running in virtual thread"); }); try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10000).forEach(i -> { executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }); }); } // 10000 个虚拟线程轻松处理虚拟线程 vs 响应式编程:虚拟线程让你用同步代码写出异步性能——不再需要 WebFlux、RxJava 的复杂链式调用。Java 22~最新:持续进化模式匹配增强:switch 支持类型模式和解构。字符串模板:更优雅的字符串拼接方式。Vector API:SIMD 指令加速数值计算。Foreign Function API:安全地调用 C/C++ 原生代码。总结Java 的现代化演进可以用三个关键词概括:简洁——Record、var、Switch 表达式消灭样板代码;并发——虚拟线程将 Java 的并发能力提升到新高度;安全——密封类、模块化、模式匹配让类型系统更强大。对于一个现代 Java 开发者来说,Java 17 LTS 是底线,Java 21 LTS 是标配,而持续跟随新版本是保持竞争力的关键。
2025年03月20日
12
0
1
2025-03-15
Git 分支管理与团队协作工作流完全指南
Git 是现代软件开发的基石,但很多开发者对 Git 的理解停留在"git add、git commit、git push"三板斧。本文将深入 Git 的分支模型、合并策略和团队协作工作流,帮助你从"会用 Git"进阶到"懂 Git"。Git 的核心数据模型理解 Git 的关键是理解它的三个核心对象:blob(文件快照)、tree(目录结构)、commit(提交快照)。所有 Git 操作本质上都是在操作这些对象的指针。// Git 内部对象查看\ngit cat-file -p HEAD // 查看当前提交对象\ngit cat-file -p HEAD^ // 查看当前 tree 对象\ngit cat-file -p HEAD~1 // 查看上一次提交每次 commit 都会创建一个完整的项目快照,而不是存储差异。Git 通过"指针"在这些快照之间建立关系,形成 DAG(有向无环图)。分支的本质:一个可移动的指针Git 的分支非常轻量——它只是一个指向某个 commit 的指针(40 字节的 SHA-1 文件)。创建一个分支几乎是瞬间完成的:git branch feature-login # 创建分支(仅仅是新建了一个指针)\ngit checkout feature-login # 切换分支(移动 HEAD 指针)\n# HEAD → feature-login → commit合并策略深度对比1. Fast-Forward Merge(快进合并)# 场景:feature 分支在主分支之后线性开发\ngit checkout main\ngit merge feature # 直接移动 main 指针到 feature 的 commit\n# 结果:线性历史,干净但丢失分支信息2. 三方合并(3-Way Merge)# 场景:两个分支都有独立提交\ngit merge --no-ff feature # 显式创建一个 merge commit\n# 结果:保留完整的分支历史,推荐用于重要功能分支3. Squash Merge(压缩合并)git merge --squash feature\ngit commit -m "feat: 添加登录功能"\n# 结果:feature 的所有提交被压缩为一个 commit,保持 main 历史整洁4. Rebase(变基)git checkout feature\ngit rebase main\n# 原理:找到共同祖先 → 暂存 feature 的提交 →\n# 将 main 的最新 commit 作为新基底 → 逐个重放暂存的提交\n# 结果:完全线性的历史,但重写了提交的 SHARebase 的黄金法则:永远不要 rebase 已经推送到远程仓库的公共分支。Rebase 会改变 commit 的 SHA,导致合作者的本地分支与远程分支产生冲突。主流工作流对比Git Flow分支类型:master + develop + feature/* + release/* + hotfix/*。优点:结构清晰、适合有固定发布周期的项目。缺点:分支繁多、合并复杂、不适合持续部署。GitHub Flow分支类型:仅 main + feature/*。优点:极其简单、适合持续部署、Pull Request 驱动。缺点:不适合多版本并行维护。GitLab Flow在 GitHub Flow 基础上增加环境分支(staging、production),支持环境相关的部署管理。Trunk-Based Development所有开发者频繁向主干(trunk/main)提交小改动,通过 feature flag 控制功能开关。优点:合并冲突最少、持续集成效率最高。 缺点:对开发者素质要求高、需要完善的测试和 feature flag 基础设施。冲突解决实战# 1. 冲突发生\ngit merge feature\n# Auto-merging src/App.ts\n# CONFLICT (content): Merge conflict in src/App.ts\n# Automatic merge failed; fix conflicts and then commit.\n\n# 2. 查看冲突文件\ngit status\ngit diff # 查看详细冲突\n\n# 3. 手工解决冲突后\ngit add src/App.ts\ngit commit -m "merge: resolve conflict in App.ts"\n\n# 4. 如果想撤销合并\ngit merge --abort # 回到合并前的状态实战技巧1. 交互式 Rebase 整理提交历史git rebase -i HEAD~4\n# pick abc1234 feat: 添加登录页\n# squash def5678 fix: 登录页样式修正\n# reword ghi9012 wip: 还在开发中\n# drop jkl3456 debug: 临时调试代码\n\n# 最终只保留 2 个干净的 commit2. Cherry-Pick:选择性地引入提交git cherry-pick abc1234 # 将特定 commit 应用到当前分支3. Git Reflog:救命的后悔药git reflog # 查看所有 HEAD 移动记录(包括已删除的分支)\ngit reset --hard HEAD@ # 回到 2 步前的状态\ngit checkout -b recovered-branch HEAD@ # 恢复误删的分支4. Bisect:二分法定位 buggit bisect start\ngit bisect bad HEAD # 当前版本有 bug\ngit bisect good v1.0 # v1.0 是好的\n# Git 会自动 checkout 中间版本,你测试后标记 good/bad\n# 重复直到定位到引入 bug 的具体 commit\ngit bisect reset # 结束后回到正常状态总结Git 的强大之处在于它的简单性——所有复杂的操作都可以分解为对 commit 指针的操作。掌握 Git 不需要记忆所有命令,而是要理解它的数据模型:一切皆对象,分支即指针。当你在脑中能画出 commit DAG 图时,rebase、merge、cherry-pick 这些操作就会变得直观而自然。
2025年03月15日
11
0
1
1
...
4
5