
一、项目需求搭建一个用户管理系统的后端 API┌──────────────────────────────────────────────────┐ │ 用户管理 RESTful API │ ├────────┬──────────┬─────────────────────────────┤ │ 接口 │ 方法 │ 说明 │ ├────────┼──────────┼─────────────────────────────┤ │/users │ GET │ 获取用户列表分页 │ │/users │ POST │ 创建用户 │ │/users/{id}│ GET │ 获取单个用户 │ │/users/{id}│ PUT │ 更新用户 │ │/users/{id}│ DELETE│ 删除用户 │ └────────┴──────────┴─────────────────────────────┘技术栈Spring Boot 3.2 Java 17MyBatis-Plus简化数据库操作MySQL 8.0Lombok二、Cursor 新建项目2.1 创建 Spring Boot 项目在 Cursor 中打开终端输入# 方式一用 Spring Initializr推荐在 Cursor Terminal 中操作# 访问 https://start.spring.io/ 下载项目然后在 Cursor 中打开# 方式二或者直接让 Cursor 生成# 打开 Cursor 的 Composer (CtrlI / CmdI)输入Cursor Prompt帮我创建一个 Spring Boot 3.2 项目要求 1. Java 17 2. 依赖spring-boot-starter-web, mybatis-plus-spring-boot3-starter, mysql-connector-j, lombok 3. groupId: com.example, artifactId: user-management 4. 在 application.yml 中配置 MySQL 数据源用户名root密码123456数据库user_db 5. 创建数据库建表SQLusers表id, username, email, phone, create_time, update_time, is_deleted逻辑删除Cursor 会自动帮你生成项目结构和配置文件。2.2 项目结构生成后项目结构应该是user-management/ ├── src/main/java/com/example/usermanagement/ │ ├── UserManagementApplication.java │ ├── entity/ │ │ └── User.java │ ├── mapper/ │ │ └── UserMapper.java │ ├── service/ │ │ ├── UserService.java │ │ └── impl/ │ │ └── UserServiceImpl.java │ ├── controller/ │ │ └── UserController.java │ ├── dto/ │ │ ├── UserCreateDTO.java │ │ ├── UserUpdateDTO.java │ │ └── UserVO.java │ ├── common/ │ │ ├── Result.java │ │ └── PageResult.java │ └── config/ │ └── MybatisPlusConfig.java ├── src/main/resources/ │ ├── application.yml │ └── db/ │ └── schema.sql └── pom.xml三、Cursor 对话实录搭框架3.1 让 Cursor 生成实体类和 MapperPrompt在 Cursor Chat 中输入基于上面的 users 表结构帮我生成以下文件 1. User.java (entity) - 使用 MyBatis-Plus 注解 TableName, TableId, TableField 2. UserMapper.java - 继承 BaseMapperUser 3. MybatisPlusConfig.java - 配置分页插件和逻辑删除 注意 - 使用 TableLogic 实现逻辑删除 - id 使用雪花算法 TableId(type IdType.ASSIGN_ID) - create_time 和 update_time 使用 TableField(fill FieldFill.INSERT/UPDATE) - 代码风格要简洁用 Lombok3.2 Cursor 生成的实体类packagecom.example.usermanagement.entity;importcom.baomidou.mybatisplus.annotation.*;importlombok.Data;importjava.time.LocalDateTime;DataTableName(users)publicclassUser{/** 主键ID雪花算法 */TableId(typeIdType.ASSIGN_ID)privateLongid;/** 用户名 */privateStringusername;/** 邮箱 */privateStringemail;/** 手机号 */privateStringphone;/** 创建时间自动填充 */TableField(fillFieldFill.INSERT)privateLocalDateTimecreateTime;/** 更新时间自动填充 */TableField(fillFieldFill.INSERT_UPDATE)privateLocalDateTimeupdateTime;/** 逻辑删除0正常1已删除 */TableLogicprivateIntegerisDeleted;}四、Cursor 对话实录写业务代码4.1 Service 层Prompt帮我生成 UserService 和 UserServiceImpl 要求 1. 分页查询用户列表支持按用户名模糊搜索 2. 根据 ID 获取用户详情 3. 创建用户校验用户名不能重复邮箱格式校验 4. 更新用户只更新非空字段 5. 删除用户逻辑删除 返回值统一用 ResultT 包装分页用 PageResultT DTO 和 VO 要和 Entity 分开// Service 接口publicinterfaceUserService{/** 分页查询 */PageResultUserVOlistUsers(intpageNum,intpageSize,Stringusername);/** 获取详情 */UserVOgetUserById(Longid);/** 创建用户 */LongcreateUser(UserCreateDTOdto);/** 更新用户 */voidupdateUser(Longid,UserUpdateDTOdto);/** 删除用户 */voiddeleteUser(Longid);}// Service 实现ServiceRequiredArgsConstructorpublicclassUserServiceImplimplementsUserService{privatefinalUserMapperuserMapper;OverridepublicPageResultUserVOlistUsers(intpageNum,intpageSize,Stringusername){PageUserpagenewPage(pageNum,pageSize);LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.like(username!null!username.isBlank(),User::getUsername,username);wrapper.orderByDesc(User::getCreateTime);userMapper.selectPage(page,wrapper);ListUserVOvoListpage.getRecords().stream().map(this::toVO).collect(Collectors.toList());returnnewPageResult(voList,page.getTotal());}OverridepublicUserVOgetUserById(Longid){UseruseruserMapper.selectById(id);if(usernull){thrownewRuntimeException(用户不存在);}returntoVO(user);}OverrideTransactionalpublicLongcreateUser(UserCreateDTOdto){// 校验用户名唯一LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.eq(User::getUsername,dto.getUsername());if(userMapper.selectCount(wrapper)0){thrownewRuntimeException(用户名已存在);}UserusernewUser();user.setUsername(dto.getUsername());user.setEmail(dto.getEmail());user.setPhone(dto.getPhone());userMapper.insert(user);returnuser.getId();}OverrideTransactionalpublicvoidupdateUser(Longid,UserUpdateDTOdto){UseruseruserMapper.selectById(id);if(usernull){thrownewRuntimeException(用户不存在);}// 只更新非空字段if(dto.getUsername()!null)user.setUsername(dto.getUsername());if(dto.getEmail()!null)user.setEmail(dto.getEmail());if(dto.getPhone()!null)user.setPhone(dto.getPhone());userMapper.updateById(user);}OverridepublicvoiddeleteUser(Longid){userMapper.deleteById(id);// 逻辑删除}privateUserVOtoVO(Useruser){returnUserVO.builder().id(user.getId()).username(user.getUsername()).email(user.getEmail()).phone(user.getPhone()).createTime(user.getCreateTime()).build();}}4.2 Controller 层Prompt帮我生成 UserController遵循 RESTful 风格 - GET /api/users?page1size10usernamexxx - POST /api/users - GET /api/users/{id} - PUT /api/users/{id} - DELETE /api/users/{id} 用 Valid 做参数校验统一异常处理RestControllerRequestMapping(/api/users)RequiredArgsConstructorTag(name用户管理)publicclassUserController{privatefinalUserServiceuserService;GetMappingOperation(summary分页查询用户列表)publicResultPageResultUserVOlistUsers(RequestParam(defaultValue1)intpage,RequestParam(defaultValue10)intsize,RequestParam(requiredfalse)Stringusername){returnResult.success(userService.listUsers(page,size,username));}GetMapping(/{id})Operation(summary获取用户详情)publicResultUserVOgetUser(PathVariableLongid){returnResult.success(userService.getUserById(id));}PostMappingOperation(summary创建用户)publicResultLongcreateUser(ValidRequestBodyUserCreateDTOdto){returnResult.success(userService.createUser(dto));}PutMapping(/{id})Operation(summary更新用户)publicResultVoidupdateUser(PathVariableLongid,ValidRequestBodyUserUpdateDTOdto){userService.updateUser(id,dto);returnResult.success();}DeleteMapping(/{id})Operation(summary删除用户)publicResultVoiddeleteUser(PathVariableLongid){userService.deleteUser(id);returnResult.success();}}五、Cursor 对话实录写测试Prompt帮我写 UserController 的集成测试类使用 SpringBootTest MockMvc 1. 测试创建用户正常 用户名重复 2. 测试分页查询 3. 测试获取用户详情存在 不存在 4. 测试更新用户 5. 测试删除用户SpringBootTestAutoConfigureMockMvcclassUserControllerTest{AutowiredprivateMockMvcmockMvc;AutowiredprivateObjectMapperobjectMapper;TestvoidcreateUser_success()throwsException{UserCreateDTOdtonewUserCreateDTO();dto.setUsername(testuser);dto.setEmail(testexample.com);mockMvc.perform(post(/api/users).contentType(MediaType.APPLICATION_JSON).content(objectMapper.writeValueAsString(dto))).andExpect(status().isOk()).andExpect(jsonPath($.code).value(200)).andExpect(jsonPath($.data).isNumber());}}六、接口测试用 Apifox / Postman / cURL 测试# 1. 创建用户curl-XPOST http://localhost:8080/api/users\-HContent-Type: application/json\-d{username:张三,email:zhangsanexample.com,phone:13800138000}# 2. 查询用户列表curlhttp://localhost:8080/api/users?page1\size10# 3. 获取用户详情curlhttp://localhost:8080/api/users/1# 4. 更新用户curl-XPUT http://localhost:8080/api/users/1\-HContent-Type: application/json\-d{email:newemailexample.com}# 5. 删除用户curl-XDELETE http://localhost:8080/api/users/1七、Cursor 使用技巧总结7.1 Prompt 编写技巧┌─────────────────────────────────────────────────────────┐ │ ✅ 好的 Prompt │ ❌ 差的 Prompt │ ├───────────────────────────────┬──────────────────────────┤ │ 用 MyBatis-Plus 写雪花算法ID │ 写一个用户管理 │ │ 返回 ResultT 包装 │ 给我代码 │ │ 校验用户名唯一邮箱格式 │ 加上校验 │ │ 只更新非空字段 │ 写 update 方法 │ │ 分页查询按创建时间倒序 │ 查询所有用户 │ └───────────────────────────────┴──────────────────────────┘7.2 Cursor Debug 技巧当代码有 bug 时不要直接让 Cursor “帮我修”。正确做法Step 1: 先自己看报错信息理解错误原因 Step 2: 在 Cursor Chat 中粘贴报错日志 Step 3: 告诉 Cursor 你已经做了什么排查 Step 4: 让 Cursor 给出修复建议而不是直接给完整代码 示例 Prompt 用户创建时报错 DuplicateKeyException我已经检查了数据库确实有唯一索引。 但我的代码里有校验用户名唯一性为什么还会报这个错 我的校验逻辑是[粘贴代码]。帮我看看问题在哪。7.3 效率对比┌─────────────────────────────────────────────────────┐ │ 传统开发 vs Cursor 开发本项目管理API │ ├──────────────┬──────────────┬───────────────────────┤ │ 步骤 │ 传统方式 │ Cursor 辅助 │ ├──────────────┼──────────────┼───────────────────────┤ │ 创建项目 │ 10分钟 │ 2分钟自动生成 │ │ 写实体类 │ 15分钟 │ 1分钟Prompt生成 │ │ 写 Mapper │ 5分钟 │ 30秒 │ │ 写 Service │ 40分钟 │ 5分钟Prompt微调 │ │ 写 Controller │ 20分钟 │ 3分钟 │ │ 写 DTO/VO │ 15分钟 │ 2分钟 │ │ 写异常处理 │ 15分钟 │ 3分钟 │ │ 写测试 │ 30分钟 │ 5分钟 │ │ 调试Bug │ 30分钟 │ 10分钟 │ ├──────────────┼──────────────┼───────────────────────┤ │ 总计 │ ~3小时 │ ~30分钟 │ └──────────────┴──────────────┴───────────────────────┘八、踩坑记录踩坑1MyBatis-Plus 分页不生效忘记配置分页插件分页查询返回的是全部数据。// ❌ 忘记加这个配置ConfigurationpublicclassMybatisPlusConfig{BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}踩坑2逻辑删除和查询冲突配置了TableLogic后selectById会自动加is_deleted0条件。如果需要查包含已删除的数据需要手写 SQL。踩坑3Cursor 生成的 import 可能缺失Cursor 有时不会自动添加所有 import特别是自定义的类。编译报错后让 Cursor “帮我修复 import” 即可。总结Cursor 最大的价值不是帮你写代码而是把你的想法快速变成可运行的代码让你把精力放在架构设计和业务逻辑上。用对 Prompt效率可以提升 5-10 倍。如果觉得有帮助点赞 收藏支持一下有问题欢迎评论区讨论