各位代码战士,在 Java 业务战场中,「业务要塞」(业务系统)是承载核心战力的关键阵地 —— 而 Spring Boot 3.x 如同「要塞地基咒」,能快速搭建稳定的系统骨架;MyBatis 如同「数据通灵术」,可打通与数据总仓库(数据库)的连接。但新手战士常因咒文配置错误、依赖冲突等问题,导致要塞刚动工就崩塌(项目启动失败)。

今天,吾将带各位从无到有,解锁「Spring Boot 3.x+MyBatis」的业务要塞召唤全流程,同步揭秘 3 大高频避坑咒文,助你 30 分钟内搭建出可投入实战的基础要塞!

一、战前准备:召唤要塞的「法器清单」

在动工前,需先集齐以下核心法器,确保后续咒文能正常生效:

法器名称

规格要求

核心作用

结界视角解读

JDK 法器

JDK 17+(推荐 JDK 21)

提供 Java 程序运行的基础环境

要塞的「能量核心」,驱动所有法术运行

构建咒文

Maven 3.6+ 或 Gradle 7.5+

管理依赖、编译项目、打包部署

要塞的「工程蓝图」,规范施工流程

IDE 祭坛

IntelliJ IDEA 2022.3+(需装 Lombok 插件)

编写代码、调试程序、可视化操作

要塞的「指挥中心」,实时监控施工进度

数据仓库

MySQL 8.0+(或 PostgreSQL 14+)

存储业务数据(如用户、订单信息)

要塞的「物资仓库」,存放核心资源

Spring Initializr

官方在线工具(start.spring.io

生成 Spring Boot 项目骨架

要塞的「地基模板」,快速搭建基础框架

二、第一步:构筑要塞地基(创建 Spring Boot 3.x 项目)

1. 用 Spring Initializr 生成项目骨架

访问 Spring 官方祭坛(start.spring.io),按以下参数配置「地基咒文」:

  • Project:Maven Project(选择 Maven,生态更完善,新手易上手);

  • Language:Java(核心开发语言);

  • Spring Boot:3.2.x(稳定版,避免使用快照版,减少兼容性问题);

  • Group/Artifact:自定义(如com.codewarrior/order-service,前者为组织名,后者为项目名);

  • Name:order-service(项目名称,与 Artifact 一致即可);

  • Package name:com.codewarrior.order(包路径,按业务模块划分);

  • Dependencies:勾选以下核心依赖(如同为地基注入关键法术):

  • Spring Web:提供 Web 服务能力(要塞的「出入口」,接收外部请求);

  • MyBatis Framework:数据通灵术(连接数据仓库的核心法术);

  • MySQL Driver:MySQL 数据库驱动(数据仓库的「钥匙」);

  • Lombok:简化代码咒文(自动生成 getter/setter,减少重复代码)。

配置完成后点击「Generate」,下载项目压缩包,解压后用 IDEA 打开 —— 此时要塞地基已初步成型!

2. 配置核心咒文(application.yml)

打开src/main/resources/application.yml(若无则新建),写入以下「地基参数咒文」,配置服务器端口、数据库连接、MyBatis 参数:

# 服务器端口配置(要塞的「主入口」端口,避免与其他要塞冲突)

server:

port: 8081 # 选择8081端口,避免8080被其他服务占用

# 数据库连接配置(数据仓库的「通灵地址」,确保能正确访问)

spring:

datasource:

url: jdbc:mysql://localhost:3306/order_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

# 说明:order_db为数据库名(需提前创建),useSSL=false关闭SSL验证,serverTimezone=UTC设置时区

username: root # 数据库用户名(默认root)

password: 123456 # 数据库密码(按实际配置填写)

driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8.0+专用驱动,旧版为com.mysql.jdbc.Driver

# MyBatis配置(数据通灵术的「核心参数」)

mybatis:

mapper-locations: classpath:mapper/**/*.xml # 通灵咒文(Mapper XML)存放路径

type-aliases-package: com.codewarrior.order.entity # 数据实体包路径(简化XML中的类名引用)

configuration:

map-underscore-to-camel-case: true # 开启驼峰命名映射(如数据库order_id映射实体orderId)

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志(便于调试通灵咒文)

三、第二步:注入数据通灵术(MyBatis 核心配置)

数据通灵术是连接要塞与数据仓库的关键,需完成「实体定义→通灵接口→咒文编写」三步,确保能正常读取 / 写入数据。

1. 定义数据实体(Entity)

在com.codewarrior.order.entity包下创建Order类(订单实体),用 Lombok 简化代码(如同给实体注入「简化咒文」):

package com.codewarrior.order.entity;

import lombok.Data;

import java.math.BigDecimal;

import java.util.Date;

@Data // Lombok核心咒文:自动生成getter/setter/toString/equals/hashCode方法

public class Order {

private Long id; // 订单ID(主键,自增)

private String orderNo; // 订单编号(如20251110001)

private Long userId; // 用户ID(关联用户表)

private BigDecimal totalAmount; // 订单总金额

private Integer orderStatus; // 订单状态(0:待支付,1:已支付,2:已取消)

private Date createTime; // 创建时间

private Date updateTime; // 更新时间

}

2. 编写通灵接口(Mapper)

在com.codewarrior.order.mapper包下创建OrderMapper接口,定义数据操作咒文(如新增订单、查询订单):

package com.codewarrior.order.mapper;

import com.codewarrior.order.entity.Order;

import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper // MyBatis核心咒文:标记为通灵接口,Spring会自动扫描并创建代理对象

public interface OrderMapper {

// 新增订单(向数据仓库注入订单物资)

int insertOrder(Order order);

// 根据ID查询订单(从数据仓库提取指定订单)

Order selectOrderById(@Param("id") Long id); // @Param指定参数名,与XML中#{}对应

// 根据用户ID查询订单列表(提取指定用户的所有订单)

List<Order> selectOrderListByUserId(@Param("userId") Long userId);

// 根据ID更新订单状态(修改订单物资状态)

int updateOrderStatus(@Param("id") Long id, @Param("orderStatus") Integer orderStatus);

}

3. 编写通灵咒文(Mapper XML)

在src/main/resources下创建mapper文件夹,再创建OrderMapper.xml,编写 SQL 通灵咒文(连接接口与数据库操作):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace绑定对应的通灵接口,确保接口与XML关联 -->

<mapper namespace="com.codewarrior.order.mapper.OrderMapper">

<!-- 新增订单:对应OrderMapper的insertOrder方法 -->

<insert id="insertOrder" parameterType="Order">

INSERT INTO order (order_no, user_id, total_amount, order_status, create_time, update_time)

VALUES (#{orderNo}, #{userId}, #{totalAmount}, #{orderStatus}, NOW(), NOW())

<!-- 说明:NOW()为MySQL函数,自动填充当前时间order为关键字,需用反引号包裹 -->

</insert>

<!-- 根据ID查询订单:对应selectOrderById方法 -->

<select id="selectOrderById" parameterType="Long" resultType="Order">

SELECT id, order_no, user_id, total_amount, order_status, create_time, update_time

FROM order

WHERE id = #{id}

</select>

<!-- 根据用户ID查询订单列表:对应selectOrderListByUserId方法 -->

<select id="selectOrderListByUserId" parameterType="Long" resultType="Order">

SELECT id, order_no, user_id, total_amount, order_status, create_time, update_time

FROM order

WHERE user_id = #{userId}

ORDER BY create_time DESC <!-- 按创建时间倒序,最新订单在前 -->

</select>

<!-- 根据ID更新订单状态:对应updateOrderStatus方法 -->

<update id="updateOrderStatus">

UPDATE order

SET order_status = #{orderStatus},

update_time = NOW()

WHERE id = #{id}

</update>

</mapper>

四、第三步:搭建业务防线(Service+Controller)

业务防线是要塞的「核心战力层」——Service 封装业务逻辑(如同防线的「作战策略」),Controller 暴露接口(如同防线的「出入口」),两者配合确保业务正常运行。

1. 编写业务逻辑(Service)

在com.codewarrior.order.service包下创建OrderService接口及实现类,封装订单相关业务逻辑:

// OrderService接口(业务逻辑抽象定义)

package com.codewarrior.order.service;

import com.codewarrior.order.entity.Order;

import java.util.List;

public interface OrderService {

// 创建订单

boolean createOrder(Order order);

// 根据ID查询订单

Order getOrderById(Long id);

// 根据用户ID查询订单列表

List<Order> getOrderListByUserId(Long userId);

// 更新订单状态

boolean updateOrderStatus(Long id, Integer orderStatus);

}

// OrderService实现类(业务逻辑具体实现)

package com.codewarrior.order.service.impl;

import com.codewarrior.order.entity.Order;

import com.codewarrior.order.mapper.OrderMapper;

import com.codewarrior.order.service.OrderService;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;

import java.util.List;

import java.util.UUID;

@Service // Spring核心咒文:标记为业务服务组件,Spring会自动扫描并注入

@RequiredArgsConstructor // Lombok咒文:自动生成带参构造器,用于注入Mapper(替代@Autowired)

public class OrderServiceImpl implements OrderService {

// 注入OrderMapper(数据通灵接口,通过构造器注入,更符合Spring最佳实践)

private final OrderMapper orderMapper;

@Override

public boolean createOrder(Order order) {

// 业务校验:防御非法请求(如同要塞的「第一道岗哨」)

if (order == null || order.getUserId() == null || order.getTotalAmount() == null) {

return false; // 参数不全,创建失败

}

// 生成订单编号(用UUID简化,实际项目可自定义规则,如时间戳+随机数)

String orderNo = "ORDER_" + UUID.randomUUID().toString().replace("-", "").substring(0, 16);

order.setOrderNo(orderNo);

// 设置默认状态:待支付(0)

order.setOrderStatus(0);

// 调用Mapper插入数据

return orderMapper.insertOrder(order) > 0; // 插入成功返回true,失败返回false

}

@Override

public Order getOrderById(Long id) {

// 校验ID合法性

if (id == null || id <= 0) {

return null;

}

return orderMapper.selectOrderById(id);

}

@Override

public List<Order> getOrderListByUserId(Long userId) {

if (userId == null || userId <= 0) {

return null;

}

return orderMapper.selectOrderListByUserId(userId);

}

@Override

public boolean updateOrderStatus(Long id, Integer orderStatus) {

// 校验参数合法性(订单状态仅允许0/1/2)

if (id == null || id <= 0 || orderStatus == null || !List.of(0, 1, 2).contains(orderStatus)) {

return false;

}

return orderMapper.updateOrderStatus(id, orderStatus) > 0;

}

}

2. 编写接口入口(Controller)

在com.codewarrior.order.controller包下创建OrderController,暴露 HTTP 接口(要塞的「对外出入口」):

package com.codewarrior.order.controller;

import com.codewarrior.order.entity.Order;

import com.codewarrior.order.service.OrderService;

import lombok.RequiredArgsConstructor;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController // Spring核心咒文:标记为REST接口控制器,返回JSON数据

@RequestMapping("/api/order") // 接口统一前缀(要塞的「入口路径」,避免与其他接口冲突)

@RequiredArgsConstructor

public class OrderController {

private final OrderService orderService;

// 新增订单:POST请求(提交数据用POST)

@PostMapping

public String createOrder(@RequestBody Order order) {

// @RequestBody:将请求体JSON转为Order对象

boolean success = orderService.createOrder(order);

return success ? "订单召唤成功!订单编号:" + order.getOrderNo() : "订单召唤失败(参数不全或非法)!";

}

// 根据ID查询订单:GET请求(查询数据用GET)

@GetMapping("/{id}")

public Order getOrderById(@PathVariable Long id) {

// @PathVariable:从URL路径中获取参数(如/api/order/1中的1)

return orderService.getOrderById(id);

}

// 根据用户ID查询订单列表:GET请求

@GetMapping("/user/{userId}")

public List<Order> getOrderListByUserId(@PathVariable Long userId) {

return orderService.getOrderListByUserId(userId);

}

// 更新订单状态:PUT请求(更新数据用PUT)

@PutMapping("/{id}/status/{orderStatus}")

public String updateOrderStatus(@PathVariable Long id, @PathVariable Integer orderStatus) {

boolean success = orderService.updateOrderStatus(id, orderStatus);

return success ? "订单状态更新成功!" : "订单状态更新失败(参数非法或订单不存在)!";

}

}

五、第四步:激活要塞(初始化 + 启动 + 测试)

1. 初始化数据仓库(创建数据库与表)

登录 MySQL,执行以下 SQL,创建订单数据库(order_db)与订单表(order):

-- 创建数据库(若不存在)

CREATE DATABASE IF NOT EXISTS order_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库

USE order_db;

-- 创建订单表

CREATE TABLE IF NOT EXISTS order (

id BIGINT AUTO_INCREMENT COMMENT '订单ID(主键)' PRIMARY KEY,

order_no VARCHAR(32) NOT NULL COMMENT '订单编号',

user_id BIGINT NOT NULL COMMENT '用户ID',

total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额(单位:元)',

order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付,1-已支付,2-已取消',

create_time DATETIME NOT NULL COMMENT '创建时间',

update_time DATETIME NOT NULL COMMENT '更新时间',

UNIQUE KEY uk_order_no (order_no) COMMENT '订单编号唯一索引,避免重复'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

2. 启动要塞(运行 Spring Boot 项目)

在 IDEA 中找到项目启动类OrderServiceApplication(默认在com.codewarrior.order包下),点击「运行」按钮:

package com.codewarrior.order;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // Spring Boot核心咒文:自动配置、组件扫描、启动类标记

public class OrderServiceApplication {

public static void main(String[] args) {

SpringApplication.run(OrderServiceApplication.class, args);

System.out.println("==== 订单业务要塞激活成功!可通过 http://localhost:8081/api/order 访问 ====");

}

}

启动成功后,IDEA 控制台会输出 Spring Boot 启动日志,且无报错信息 —— 此时要塞已具备对外服务能力!

3. 测试要塞接口(验证战力)

推荐使用「Postman」或「curl」工具测试接口,以下为详细测试步骤(以 Postman 为例):

(1)测试「创建订单」接口

  • 请求方式:POST

  • 请求体(JSON 格式):

{

"userId": 1001,

"totalAmount": 99.9

}

  • 点击发送,成功响应:

"订单召唤成功!订单编号:ORDER_5f8d2a7c9b1e3f4a"
  • 验证数据:登录 MySQL,执行SELECT * FROM order_db.order;,可看到新增的订单数据(create_time、update_time 已自动填充)。

(2)测试「根据 ID 查询订单」接口

  • 获取订单 ID:从数据库中查看新增订单的id(如 1);

  • 请求方式:GET

  • 成功响应(JSON 格式):

{

"id": 1,

"orderNo": "ORDER_5f8d2a7c9b1e3f4a",

"userId": 1001,

"totalAmount": 99.9,

"orderStatus": 0,

"createTime": "2025-11-10T16:30:00.000+00:00",

"updateTime": "2025-11-10T16:30:00.000+00:00"

}

(3)测试「根据用户 ID 查询订单列表」接口

  • 请求方式:GET

  • 成功响应(JSON 数组格式):

[

{

"id": 1,

"orderNo": "ORDER_5f8d2a7c9b1e3f4a",

"userId": 1001,

"totalAmount": 99.9,

"orderStatus": 0,

"createTime": "2025-11-10T16:30:00.000+00:00",

"updateTime": "2025-11-10T16:30:00.000+00:00"

}

]

(4)测试「更新订单状态」接口

  • 请求方式:PUT

  • 成功响应

"订单状态更新成功!"
  • 验证数据:执行SELECT order_status FROM order_db.order WHERE id=1;,可看到order_status已变为 1。

六、核心避坑咒文:破解要塞召唤 3 大高频故障

新手战士在召唤要塞时,常因咒文配置疏漏触发故障,以下为 3 大高频问题的「破解咒文」:

1. 避坑咒文 1:JDK 版本不兼容(能量核心不匹配)

故障现象

启动项目时控制台报错:java.lang.UnsupportedClassVersionError: com/codewarrior/order/OrderServiceApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

故障原因

Spring Boot 3.x 要求 JDK 17+(class file version 61.0),若使用 JDK 11(55.0)或 JDK 8(52.0),会因「能量核心版本不匹配」导致要塞启动失败。

破解咒文

  • 步骤 1:在 IDEA 中配置 JDK 17+

打开「File → Project Structure → Project SDK」,选择已安装的 JDK 17/21,点击「Apply」。

  • 步骤 2:在 pom.xml 中指定 Java 版本

确保properties标签中包含以下配置,强制项目使用 JDK 17 编译:

<properties>

<java.version>17</java.version>

<maven.compiler.source>${java.version}</maven.compiler.source>

<maven.compiler.target>${java.version}</maven.compiler.target>

</properties>

2. 避坑咒文 2:Mapper 接口扫描失效(通灵通道未打通)

故障现象

启动项目时控制台报错:No qualifying bean of type 'com.codewarrior.order.mapper.OrderMapper' available: expected at least 1 bean which qualifies as autowire candidate

故障原因

Spring 未扫描到OrderMapper接口,导致「数据通灵通道未打通」—— 本质是未添加@Mapper或@MapperScan咒文。

破解咒文(二选一即可)

  • 方案 1:单个 Mapper 添加 @Mapper

在OrderMapper接口上添加@Mapper注解(前文已采用此方案):

@Mapper // 标记为MyBatis通灵接口,Spring会自动扫描

public interface OrderMapper { ... }

  • 方案 2:启动类添加 @MapperScan 批量扫描

在OrderServiceApplication启动类上添加@MapperScan,指定 Mapper 包路径,批量扫描所有 Mapper 接口:

@SpringBootApplication

@MapperScan("com.codewarrior.order.mapper") // 批量扫描Mapper包

public class OrderServiceApplication { ... }

3. 避坑咒文 3:数据库连接失败(物资仓库无法访问)

故障现象

启动项目时控制台报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure 或 Access denied for user 'root'@'localhost' (using password: YES)

故障原因

  • 原因 1:MySQL 服务未启动(物资仓库未开门);

  • 原因 2:application.yml 中url的数据库名不存在(仓库地址错误);

  • 原因 3:username/password错误(仓库钥匙不对);

  • 原因 4:MySQL 8.0 + 使用了旧版驱动类(com.mysql.jdbc.Driver)。

破解咒文

  • 步骤 1:检查 MySQL 服务状态

  • Windows:打开命令提示符,执行net start mysql80(若服务名不是 mysql80,需先执行sc query | findstr MySQL查看);

  • Linux:执行systemctl status mysql,若未启动则执行systemctl start mysql。

  • 步骤 2:核对数据库连接配置

确保 application.yml 中以下参数正确:

spring:

datasource:

url: jdbc:mysql://localhost:3306/order_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

# 确认order_db数据库已创建(可执行CREATE DATABASE IF NOT EXISTS order_db;创建)

username: root # 确认MySQL用户名正确

password: 123456 # 确认MySQL密码正确

driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8.0+必须用此驱动

七、要塞强化建议:提升实战战力

基础要塞搭建完成后,可通过以下方式「强化战力」,应对更复杂的业务场景:

1. 添加全局异常处理(防御非法攻击)

创建GlobalExceptionHandler类,统一捕获接口异常,避免直接返回错误堆栈给前端:

package com.codewarrior.order.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice // 全局异常处理咒文:拦截所有@RestController的异常

public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class) // 捕获所有Exception类型异常

public String handleException(Exception e) {

// 实际项目中可记录日志,此处简化返回

return "要塞遭遇异常!异常信息:" + e.getMessage();

}

}

2. 集成接口文档(添加导航咒文)

集成SpringDoc-OpenAPI(Spring Boot 3.x 推荐),自动生成接口文档,方便前端对接:

  • 步骤 1:在 pom.xml 中添加依赖:

<dependency>

<groupId>org.springdoc</groupId>

<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>

<version>2.3.0</version>

</dependency>

3. 添加事务管理(保障物资一致性)

在OrderServiceImpl的方法上添加@Transactional注解,确保数据库操作的原子性(如创建订单时若出现异常,自动回滚数据):

@Service

@RequiredArgsConstructor

public class OrderServiceImpl implements OrderService {

private final OrderMapper orderMapper;

@Transactional // 事务咒文:确保方法内的数据库操作要么全成功,要么全回滚

@Override

public boolean createOrder(Order order) {

// 业务逻辑不变...

}

}

八、结语:成为业务要塞的掌控者

通过「地基构筑→通灵注入→防线搭建→激活测试→避坑强化」五步,你已成功召唤出 Spring Boot 3.x+MyBatis 业务要塞!记住:技术要塞的修行永无止境,后续可继续探索「缓存集成(Redis)」「分布式事务」「服务注册发现(Nacos)」等高阶法术,让要塞成长为能抵御千万级请求的「分布式堡垒」。

若你在强化要塞时遇到新的故障,欢迎在「跨域通信阵」(留言板)留下问题,吾将为你提供新的破解咒文!