1. 技术选型为什么选择SpringBootSSM作为Java新手你可能听说过SpringBoot和SSMSpringSpringMVCMyBatis这两个技术栈。为什么《苍穹外卖》项目会选择它们我用实际开发经验告诉你答案。SpringBoot就像是一个开箱即用的工具箱。以前用传统SSM框架时我们需要手动配置大量XML文件光是整合Spring和MyBatis就要写几十行配置。而SpringBoot通过自动配置机制只需要几行代码就能跑起来一个Web项目。我做过对比测试用SpringBoot初始化项目比传统SSM快至少3倍。SSM组合则是经过市场验证的黄金搭档。Spring负责管理各个组件控制反转SpringMVC处理Web请求MyBatis操作数据库。这种分层架构让代码结构清晰特别适合外卖系统这种需要快速迭代的业务场景。去年我参与过一个餐饮系统开发用SSM框架两周就完成了核心功能模块。具体到《苍穹外卖》项目技术选型还有这些实际考虑微信小程序对接SpringMVC的RESTful接口开发简单能快速对接小程序前端高并发订单处理SpringBoot内置Tomcat容器配合Redis缓存能支撑千人级并发快速开发周期MyBatis的逆向工程可以自动生成基础CRUD代码节省30%开发时间2. 环境准备新手必备工具清单在开始搭建项目前我们需要准备好开发环境。这里我列出一个经过实战验证的工具清单并附上避坑指南。2.1 基础软件安装JDK 1.8建议选择Oracle JDK而不是OpenJDK。我在CentOS服务器上测试发现OpenJDK运行SpringBoot项目时偶尔会出现内存泄漏。安装后记得配置JAVA_HOME环境变量# 检查安装是否成功 java -version javac -versionMaven 3.6项目管理神器。配置文件settings.xml需要做两个关键修改阿里云镜像加速依赖下载调整JVM内存参数防止构建时OOMmirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrorMySQL 5.7千万要避开MySQL 8.0的坑新版本的身份认证方式会导致MyBatis连接失败。安装完成后建议设置默认字符集为utf8mb4创建专属数据库用户并限制权限2.2 开发工具选择IntelliJ IDEA社区版就够用但终极版的MyBatis插件特别好用。有个小技巧开启Auto Import功能可以自动解决依赖问题。Postman接口测试必备。建议把项目API保存为Collection团队可以共享测试用例。我通常会为每个接口编写测试脚本比如登录接口的Tests脚本pm.test(登录成功, function() { pm.response.to.have.status(200); pm.expect(pm.response.json().data.token).to.be.a(string); });Git代码版本管理。新手最容易犯的错误是忘记.gitignore文件导致把IDE配置文件提交到仓库。这里提供一份标准Java项目的.gitignore模板# IDE .idea/ *.iml # 日志 logs/ *.log # 依赖 target/3. 项目初始化从零搭建骨架现在进入实战环节我会手把手教你用Spring Initializr创建项目。这个过程中有几个关键决策点需要注意。3.1 使用Spring Initializr创建项目访问start.spring.io按这些参数配置Project: Maven ProjectLanguage: JavaSpring Boot: 2.7.x不要选3.0兼容性风险大Packaging: Jar即使是Web项目也推荐用Jar部署Java: 8依赖选择要精打细算初期只需要Spring Web包含SpringMVCMyBatis FrameworkMySQL Driver点击生成后会下载一个zip包解压后用IDEA打开。第一次加载时Maven会自动下载依赖这个过程可能需要几分钟。如果卡住可以尝试以下命令手动构建mvn clean install -U3.2 项目结构规划标准的Maven项目结构应该像这样src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── sky/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制器 │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # MyBatis接口 │ │ ├── service/ # 业务层 │ │ └── SkyApplication.java # 启动类 │ └── resources/ │ ├── static/ # 静态资源 │ ├── templates/ # 模板文件 │ ├── application.yml # 主配置文件 │ └── mapper/ # MyBatis映射文件 └── test/ # 测试代码特别提醒几个易错点实体类建议放在entity包而不是domainMyBatis的mapper接口和xml文件要同名静态资源要放在static而不是resources目录3.3 基础配置详解application.yml是SpringBoot的核心配置文件我推荐用YAML格式而不是properties因为结构更清晰。以下是外卖项目的关键配置server: port: 8080 servlet: context-path: /sky spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sky_take_out?useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true # 开启驼峰命名转换这里有个性能优化技巧在开发环境可以关闭MyBatis的二级缓存避免调试时看到过期数据mybatis: configuration: cache-enabled: false4. 数据库设计与MyBatis集成数据库是外卖系统的核心我们先设计基础表结构再集成MyBatis。4.1 数据库表设计对于外卖系统至少需要这些表用户表存储小程序用户信息员工表餐厅管理员账号菜品表记录菜品详情套餐表组合菜品订单表核心业务表以员工表为例SQL脚本如下CREATE TABLE employee ( id bigint NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, username varchar(32) NOT NULL, password varchar(64) NOT NULL, phone varchar(11) NOT NULL, sex varchar(2) NOT NULL, id_number varchar(18) NOT NULL, status int DEFAULT 1, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, create_user bigint DEFAULT NULL, update_user bigint DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY idx_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;注意几个设计要点为用户名添加唯一索引密码字段长度要足够建议64位包含创建/更新时间和操作人4.2 MyBatis逆向工程手动写CRUD代码太枯燥我们可以用MyBatis Generator自动生成基础代码。在pom.xml中添加插件plugin groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.4.1/version configuration configurationFilesrc/main/resources/generatorConfig.xml/configurationFile overwritetrue/overwrite /configuration /plugin创建generatorConfig.xml配置文件指定要生成的表。运行命令mvn mybatis-generator:generate生成后你会得到实体类Employee.javaMapper接口EmployeeMapper.javaXML映射文件EmployeeMapper.xml4.3 编写第一个接口让我们实现员工登录功能体验完整的开发流程。首先在Controller中定义接口RestController RequestMapping(/admin/employee) public class EmployeeController { Autowired private EmployeeService employeeService; PostMapping(/login) public ResultEmployee login(RequestBody EmployeeLoginDTO employeeLoginDTO) { Employee employee employeeService.login(employeeLoginDTO); return Result.success(employee); } }Service层处理业务逻辑Service public class EmployeeServiceImpl implements EmployeeService { Autowired private EmployeeMapper employeeMapper; public Employee login(EmployeeLoginDTO employeeLoginDTO) { // 1. 根据用户名查询数据库 Employee employee employeeMapper.getByUsername(employeeLoginDTO.getUsername()); // 2. 处理各种异常情况 if (employee null) { throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND); } // 3. 密码比对 if (!password.equals(employee.getPassword())) { throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); } // 4. 返回实体对象 return employee; } }最后用Postman测试接口应该能看到返回的JSON数据。至此我们已经完成了一个完整功能的开发闭环。