AI辅助编程实践:基于SpringBoot与MyBatis-Plus快速构建CRUD服务

📅 2026/7/21 9:00:06
AI辅助编程实践:基于SpringBoot与MyBatis-Plus快速构建CRUD服务
在实际 Java Web 项目开发中搭建一个基础的 SpringBoot 服务框架往往需要经历创建项目、配置依赖、编写实体、Mapper、Service、Controller 等一系列重复性工作。这个过程虽然不复杂但对于快速验证想法或构建原型来说依然存在效率瓶颈。近年来随着 AI 辅助编程工具的兴起一种被称为“氛围编程”或“Vibe Coding”的实践开始被讨论其核心是开发者通过自然语言描述需求由 AI 工具直接生成可运行的代码骨架从而极大提升从想法到可运行服务的速度。本文将围绕如何利用这种思路在几分钟内搭建一个具备基础 CRUD 功能的完整 SpringBoot 服务并深入探讨其背后的技术选型、生成代码的解读以及实际落地时的注意事项。1. 理解 Vibe Coding 与 AI 辅助编程的核心1.1 什么是 Vibe Coding“Vibe Coding”并非一个官方的技术术语它更像是一种开发范式的描述。在这种模式下开发者不再需要逐行编写所有样板代码而是通过向 AI 工具如 Cursor、GitHub Copilot、Claude Code 等提供清晰的上下文和需求描述即“氛围”或“Vibe”由 AI 生成符合预期的代码结构、业务逻辑甚至测试用例。其目标是将开发者的精力从繁琐的语法和框架配置中解放出来更聚焦于业务逻辑设计、架构决策和问题定义。1.2 为什么选择 SpringBoot 作为实践对象SpringBoot 是 Java 领域最流行的 Web 应用框架其“约定大于配置”的理念与 AI 辅助编程的效率目标高度契合。一个标准的 SpringBoot CRUD 服务包含的组件Controller, Service, Mapper, Entity, 配置文件具有高度可预测的模式这非常适合 AI 进行学习和生成。通过让 AI 快速搭建 SpringBoot 服务我们可以验证 AI 对主流技术栈的理解深度并评估生成代码的可用性。1.3 本次实践的技术栈与目标我们将构建一个简单的用户信息管理服务。技术栈选择 SpringBoot 2.7.18一个长期支持的稳定版本集成 MyBatis-Plus 作为数据持久层框架MySQL 作为数据库并使用 Maven 进行项目管理。最终目标是通过向 AI 工具描述需求在 3 分钟左右获得一个可启动、可通过 API 进行用户增删改查的完整 SpringBoot 项目代码。2. 环境与工具准备为 AI 编码铺平道路2.1 基础开发环境配置要让 AI 生成的代码能够顺利运行本地或开发环境必须先就绪。以下是必须提前安装和配置的组件Java 开发套件 (JDK)推荐 JDK 8 或 JDK 11确保JAVA_HOME环境变量正确配置。Apache Maven用于管理项目依赖和构建。安装后需配置MAVEN_HOME并加入系统 PATH。MySQL 数据库安装 MySQL 5.7 或 8.0并启动服务。需要提前创建一个数据库例如demo_db。集成开发环境 (IDE)IntelliJ IDEA 或 VS Code。本文演示将基于 IDEA 进行因为它对 SpringBoot 和 Maven 的支持非常完善。可以通过以下命令快速验证环境java -version mvn -v mysql --version2.2 AI 编程工具的选择与配置目前主流的 AI 编程工具均支持类似“Vibe Coding”的交互。你可以根据习惯选择Cursor内置了强大的 AI 模型支持通过Cmd/Ctrl K进行聊天式编程直接编辑文件。GitHub Copilot作为 IDE 插件提供行级和函数级的代码补全与生成。Claude Code在特定平台提供擅长理解复杂指令并生成结构化代码。本次演示以通用指令为例你可以在任何支持代码生成的 AI 工具中尝试。核心在于如何清晰地描述需求。2.3 初始化项目结构可选但推荐虽然 AI 可以生成整个项目但先创建一个标准的 Maven 项目骨架有助于 AI 更好地理解上下文。在 IDEA 中你可以使用 Spring Initializr 快速生成选择 SpringBoot 2.7.18。添加依赖Spring Web,MyBatis Framework,MySQL Driver。生成项目并解压。你也可以完全跳过这一步让 AI 从零生成所有文件。但拥有一个pom.xml基础文件能让 AI 的依赖推荐更准确。3. 向 AI 描述需求获取完整 SpringBoot CRUD 代码与 AI 交互的质量直接决定了生成代码的质量。模糊的指令会产生混乱的代码而清晰的指令则能生成近乎可用的成果。3.1 构建清晰、具体的“氛围”指令不要只说“创建一个 SpringBoot 项目”。应该提供尽可能多的技术细节和业务上下文。以下是一个高效的指令示例“请为我生成一个完整的 SpringBoot 2.7.18 项目代码实现对一个User实体字段id(Long主键自增), username(String), email(String), createTime(LocalDateTime)的 RESTful CRUD 接口。技术要求使用 Maven 管理pom.xml需包含spring-boot-starter-web,mybatis-plus-boot-starter,mysql-connector-java,lombok依赖。使用 MyBatis-Plus 作为 ORM 框架需要包含它的通用 Mapper 和 Service 实现。数据库连接配置在application.yml中数据库名为demo_db。代码结构需包含User实体类、UserMapper接口、UserService接口及其实现类UserServiceImpl、UserController控制器。Controller 层需提供标准的 REST APIPOST /users(创建),DELETE /users/{id}(删除),PUT /users/{id}(更新),GET /users/{id}(查询单个),GET /users(分页查询所有)。请确保代码符合 SpringBoot 和 MyBatis-Plus 的最佳实践并包含必要的注解如RestController,RequestMapping,Service,Mapper等。”3.2 AI 生成的核心代码文件解读AI 工具会根据你的指令生成多个文件。以下是关键文件的内容及其作用分析1.pom.xml- 项目依赖管理?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent groupIdcom.example/groupId artifactIdvibe-coding-demo/artifactId version0.0.1-SNAPSHOT/version namevibe-coding-demo/name descriptionDemo project for Vibe Coding/description properties java.version1.8/java.version mybatis-plus.version3.5.3.1/mybatis-plus.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project关键点这里明确了 SpringBoot 父版本、Java 版本以及 MyBatis-Plus 的版本。mybatis-plus-boot-starter依赖已经包含了 MyBatis 和 MyBatis-Spring 的依赖无需单独引入。2.application.yml- 应用配置spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo_db?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 SQL 日志便于调试 global-config: db-config: id-type: auto # 主键策略对应数据库自增关键点数据库连接信息需要根据你的实际环境修改。log-impl配置在开发阶段非常有用可以查看 MyBatis-Plus 执行的 SQL。3.User.java- 数据实体package com.example.vibecodingdemo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; Data TableName(user) // 指定对应数据库表名 public class User { TableId(type IdType.AUTO) // 主键自增 private Long id; private String username; private String email; private LocalDateTime createTime; }关键点使用 Lombok 的Data注解自动生成 getter、setter 等方法。TableName和TableId是 MyBatis-Plus 的注解用于对象-关系映射。4.UserMapper.java- 数据访问层接口package com.example.vibecodingdemo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.vibecodingdemo.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper // 标记为 MyBatis 的 MapperSpring 会自动扫描并注入 public interface UserMapper extends BaseMapperUser { // 继承 BaseMapper 后即拥有了基本的 CRUD 方法无需编写 XML }关键点通过继承 MyBatis-Plus 的BaseMapper接口免费获得了insert,deleteById,updateById,selectById,selectList等数十个通用方法。这是 MyBatis-Plus 的核心便利性之一。5.UserService.java与UserServiceImpl.java- 业务逻辑层// UserService.java package com.example.vibecodingdemo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.vibecodingdemo.entity.User; public interface UserService extends IServiceUser { // 可以在此定义复杂的业务方法简单的 CRUD 已由 IService 提供 } // UserServiceImpl.java package com.example.vibecodingdemo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.vibecodingdemo.entity.User; import com.example.vibecodingdemo.mapper.UserMapper; import com.example.vibecodingdemo.service.UserService; import org.springframework.stereotype.Service; Service // 标记为 Spring 的业务 Bean public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { // 继承 ServiceImpl 后同样免费获得了大量 Service 层 CRUD 方法 }关键点服务层也通过继承 MyBatis-Plus 提供的IService和ServiceImpl极大减少了模板代码。如果需要复杂业务逻辑再在接口和实现类中添加自定义方法。6.UserController.java- Web 控制层package com.example.vibecodingdemo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.vibecodingdemo.entity.User; import com.example.vibecodingdemo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; RestController RequestMapping(/users) public class UserController { Autowired private UserService userService; PostMapping public Boolean createUser(RequestBody User user) { user.setCreateTime(LocalDateTime.now()); return userService.save(user); } DeleteMapping(/{id}) public Boolean deleteUser(PathVariable Long id) { return userService.removeById(id); } PutMapping(/{id}) public Boolean updateUser(PathVariable Long id, RequestBody User user) { user.setId(id); // 确保 ID 一致 return userService.updateById(user); } GetMapping(/{id}) public User getUser(PathVariable Long id) { return userService.getById(id); } GetMapping public PageUser listUsers(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize) { PageUser page new Page(pageNum, pageSize); LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); // 可以在此添加查询条件例如 wrapper.like(User::getUsername, Tom); return userService.page(page, wrapper); } }关键点这是一个标准的 RESTful 风格控制器。RestController结合RequestMapping定义了 API 前缀。方法上的PostMapping、GetMapping等注解定义了具体的 HTTP 方法和路径。Page对象用于实现分页查询。3.3 创建数据库表AI 通常不会生成 SQL 文件你需要手动在 MySQL 的demo_db数据库中执行建表语句CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT, username varchar(255) DEFAULT NULL, email varchar(255) DEFAULT NULL, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;确保表名和字段名与实体类中的TableName和属性名对应MyBatis-Plus 默认使用驼峰转下划线命名映射。4. 项目运行与接口验证4.1 启动 SpringBoot 应用在 IDEA 中找到主启动类通常名为XxxApplication例如VibeCodingDemoApplication运行其main方法。观察控制台日志如果没有报错且看到Tomcat started on port(s): 8080类似的日志说明服务启动成功。4.2 使用 API 测试工具进行验证使用 Postman、curl 或任何你熟悉的 HTTP 客户端工具测试生成的 API。创建用户 (POSThttp://localhost:8080/users)curl -X POST -H Content-Type: application/json -d {username:testUser, email:testexample.com} http://localhost:8080/users预期响应true表示插入成功。检查数据库应有一条新记录且create_time已自动填充。查询单个用户 (GEThttp://localhost:8080/users/1)curl http://localhost:8080/users/1预期响应返回 ID 为 1 的用户的 JSON 数据。分页查询用户 (GEThttp://localhost:8080/users?pageNum1pageSize5)curl http://localhost:8080/users?pageNum1pageSize5预期响应返回一个分页对象包含records数据列表、total总记录数等信息。更新用户 (PUThttp://localhost:8080/users/1)curl -X PUT -H Content-Type: application/json -d {username:updatedUser, email:updatedexample.com} http://localhost:8080/users/1预期响应true数据库中对应用户名和邮箱被更新。删除用户 (DELETEhttp://localhost:8080/users/1)curl -X DELETE http://localhost:8080/users/1预期响应true数据库中 ID 为 1 的记录被删除。如果所有测试通过恭喜你一个由 AI 生成的、功能完整的 SpringBoot CRUD 服务已经成功运行。5. 生成代码的常见问题与手动修正AI 生成的代码在大多数情况下能运行但可能忽略一些细节或采用默认配置需要开发者进行审查和修正。5.1 依赖版本冲突问题AI 可能使用较新或较旧的依赖版本。你需要检查pom.xml中的版本是否兼容。特别是mybatis-plus-boot-starter的版本需要与 SpringBoot 2.7.x 兼容。如果启动时出现ClassNotFoundException或NoSuchMethodError通常是版本不匹配。可以到 Maven 中央仓库查看该 Starter 的版本发布记录选择与 SpringBoot 版本匹配的稳定版。5.2 数据库连接与驱动类问题现象启动时报错Failed to configure a DataSource或Communications link failure。排查检查application.yml中的url,username,password是否正确。检查 MySQL 服务是否启动。检查数据库demo_db是否已创建。对于 MySQL 8.0驱动类应为com.mysql.cj.jdbc.Driver且url中建议包含serverTimezone参数如示例所示。5.3 MyBatis-Plus 配置未生效现象程序能启动但执行插入时主键未自增或 SQL 日志未打印。排查确保application.yml中mybatis-plus的配置前缀正确。确保实体类中的TableId(type IdType.AUTO)注解已添加。确保数据库表的主键字段设置了AUTO_INCREMENT。检查UserMapper接口是否有Mapper注解或被MapperScan扫描到。5.4 日期时间字段处理问题现象插入数据时createTime为 null或者返回的 JSON 中日期格式奇怪。处理在User实体类中可以给createTime字段添加TableField(fill FieldFill.INSERT)注解并配置一个 MetaObjectHandler 来自动插入时间而不是在 Controller 中手动设置。这是更优雅的做法。如需统一 JSON 日期格式可以在application.yml中配置spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT85.5 分页查询不生效现象调用分页接口返回了所有数据没有分页效果。处理MyBatis-Plus 的分页插件需要显式配置。在主启动类或配置类中添加以下 BeanConfiguration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }添加此配置后分页查询才会生效。6. 从“能运行”到“能上线”生产环境考量AI 生成的代码提供了一个完美的起点但距离生产级应用还有距离。以下是在此基础上必须加强的环节6.1 输入校验与异常处理生成的 Controller 缺乏参数校验和统一的异常处理。输入校验在User实体的字段上添加 Jakarta Bean Validation 注解。import javax.validation.constraints.NotBlank; import javax.validation.constraints.Email; Data TableName(user) public class User { // ... NotBlank(message 用户名不能为空) private String username; Email(message 邮箱格式不正确) private String email; // ... }并在 Controller 方法的RequestBody参数前添加Valid注解。全局异常处理创建RestControllerAdvice类捕获MethodArgumentNotValidException校验异常、BusinessException自定义业务异常等并返回结构化的错误信息。6.2 日志与监控日志在application.yml中配置更详细的日志级别特别是 SQL 日志在生产环境应关闭或改为DEBUG级别仅在需要时开启。监控引入 Spring Boot Actuator 端点用于健康检查、指标收集等。6.3 安全与权限生成的 API 是完全开放的。生产环境必须加入安全层。方案集成 Spring Security 或 Sa-Token 等框架实现认证Authentication和授权Authorization。操作为 API 添加访问令牌JWT校验或配置基于角色的访问控制RBAC。6.4 数据库性能与规范索引根据查询模式如按username查询在数据库表上建立合适的索引。连接池默认的 HikariCP 连接池参数如最大连接数需要根据实际并发量调整。字段规范username和email字段应考虑添加唯一约束并在业务代码中处理重复异常。6.5 API 文档为生成的 REST API 编写文档是重要环节。可以集成 Swagger/OpenAPI 工具如 SpringDoc OpenAPI。添加springdoc-openapi-ui依赖。在 Controller 和 API 方法上使用Operation,Parameter等注解描述接口。启动后访问http://localhost:8080/swagger-ui.html即可查看和测试接口文档。7. Vibe Coding 实践总结与最佳实践通过这次实践我们可以看到 AI 辅助编程在生成结构性、模式化代码方面的巨大潜力。它极大地减少了初期的搭建成本。为了更有效地利用这项技术可以遵循以下最佳实践指令越具体代码越可用像写需求文档一样描述你的需求包括技术栈、版本、功能点、代码风格偏好。生成的代码是“草案”不是“成品”必须进行代码审查。重点检查依赖版本、安全漏洞如 SQL 注入风险虽然 MyBatis-Plus 已规避、异常处理、性能隐患。理解生成的代码不要成为“代码黑盒”的使用者。花时间阅读 AI 生成的代码理解其背后的框架原理和设计模式。这是学习的好机会。迭代式交互如果第一次生成的代码不完美可以针对具体文件或问题继续向 AI 提问。例如“请为上面的UserController添加基于 Bean Validation 的参数校验。”建立自己的代码模板和片段库将 AI 生成的、经过你验证和优化的代码块保存下来形成你自己的“最佳实践模板”。下次可以直接让 AI 参考你的模板进行生成。平衡使用场景对于高度定制、复杂的业务逻辑AI 可能力不从心。此时它更适合作为“高级代码补全”工具帮助你编写某个复杂方法或算法。而对于搭建框架、编写数据访问层、创建标准 API 等场景则是其优势所在。AI 辅助编程和 Vibe Coding 的本质是提升开发者的效率上限而非替代开发者。它要求开发者具备更清晰的架构思维、更严谨的审查能力和更深入的技术理解从而将精力投入到真正创造价值的复杂问题解决中。从搭建一个 SpringBoot 服务开始尝试将 AI 作为你的编程伙伴并不断磨合你们之间的协作方式。