《FGO》影之国圣杯战线图文教程汇总 影之国的舞斗会圣杯战线图文操作步骤
2026-08-08
2026-08-11 0
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 3 —— 消息表设计 + 级联删除 + 事务管理并不只看表面做法,关键还要理解相关条件、限制和后续影响。
作为一名技术人,我深知学习新框架时的迷茫与焦虑。尤其是当你已经熟悉了一套技术栈,想要转向另一个生态时,那种“无从下手”的感觉尤为强烈。

最近,我开始系统学习Spring Boot生态,并尝试将Spring AI集成到实际项目中。经过一段时间的摸索,我整理出了一份7天学习路线图,目标是让有编程基础的开发者能快速上手Spring Boot + Spring AI,独立完成一个完整的AI对话应用。
这份计划不是零基础教程,而是为有一定后端开发经验(不限于Java)的朋友量身定制的“快速转型指南”。如果你对Python、Node.js或其他后端语言已有了解,这份计划将帮助你在最短时间内建立Spring Boot的核心认知,并跟上AI应用开发的浪潮。
下面,我将这7天的学习中的第三天,消息表设计 + 级联删除 + 事务管理。
USE chat_db;CREATETABLE IF NOTEXISTS message (id BIGINTNOTNULL AUTO_INCREMENT COMMENT '消息ID',session_id BIGINTNOTNULL COMMENT '会话ID(逻辑外键,关联session表)',role VARCHAR(20) NOTNULL COMMENT '角色:user(用户)/assistant(AI)',content TEXT NOTNULL COMMENT '消息内容',created_at DATETIME NOTNULLDEFAULTCURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id),INDEX idx_session_id (session_id),INDEX idx_created_at (created_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息表';
创建 entity/Message.java:
package com.example.chatapi.entity;import com.baomidou.mybatisplus.annotation.*;import lombok.Data;import java.time.LocalDateTime;publicclassMessage {privateLong id;privateLong sessionId;private String role;private String content;private LocalDateTime createdAt;}
创建 mapper/MessageMapper.java:
packagecom.example.chatapi.mapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.chatapi.entity.Message;importorg.apache.ibatis.annotations.*;importjava.util.List;@MapperpublicinterfaceMessageMapperextendsBaseMapper<Message> {@Select("SELECT * FROM message WHERE session_id = #{sessionId} ORDER BY created_at ASC")List
创建 dto/ApiResponse.java:
package com.example.chatapi.dto;import lombok.Data;publicclassApiResponse
创建 dto/MessageSaveRequest.java:
package com.example.chatapi.dto;import lombok.Data;publicclassMessageSaveRequest {privateLong sessionId;private String role;private String content;}
创建 service/MessageService.java:
package com.example.chatapi.service;import com.example.chatapi.entity.Message;import com.example.chatapi.mapper.MessageMapper;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.List;publicclassMessageService {privatefinal MessageMapper messageMapper;public List
更新 service/SessionService.java:
package com.example.chatapi.service;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;import com.example.chatapi.entity.Session;import com.example.chatapi.mapper.MessageMapper;import com.example.chatapi.mapper.SessionMapper;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime;import java.util.List;publicclassSessionService {privatefinal SessionMapper sessionMapper;privatefinal MessageMapper messageMapper;public List
开始事务↓删除消息(成功)✓↓删除会话(失败)✗ 抛出异常↓回滚事务 → 删除的消息恢复,数据回到原状
创建 controller/MessageController.java:
package com.example.chatapi.controller;import com.example.chatapi.dto.ApiResponse;import com.example.chatapi.dto.MessageSaveRequest;import com.example.chatapi.entity.Message;import com.example.chatapi.service.MessageService;import com.example.chatapi.service.SessionService;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.*;import java.util.List;publicclassMessageController {privatefinal MessageService messageService;privatefinal SessionService sessionService;public ApiResponse> getMessages(Long sessionId) {log.info("接收请求:获取会话 {} 的消息列表", sessionId);if (!sessionService.exists(sessionId)) {return ApiResponse.error(404, "会话不存在");}List
运行 ChatApiApplication.java,控制台看到以下日志即成功:
POST http://localhost:8080/api/messagesContent-Type: application/json{"sessionId": 1, "role": "user", "content": "什么是Spring Boot?"}
学习建议: 今天的重点是创建一个message表,和级联删除。不要只复制代码,动手敲一遍,再用 Postman 把所有接口测一遍。