KnowFlow Agent Day07:知识库模块接入 MySQL 📅 2026/7/22 9:02:13 今天继续推进 KnowFlow Agent 项目。Day06 已经完成了知识库模块的基础 CRUD 接口不过当时的数据是保存在内存里的。也就是说接口虽然可以新增、查询、修改、删除知识库但是服务一重启新增的数据就会丢失。所以 Day07 的主要任务是把知识库模块接入 MySQL让知识库数据可以真正保存到数据库中。一、今日目标Day07 的目标很明确就是把 Day06 的“内存版知识库”升级为“数据库版知识库”。需要完成的内容包括新增 MySQL 版 Repository 使用 kf_knowledge_bases 表保存知识库数据 启用 MySQL 时走数据库版本 未启用 MySQL 时保留内存版本 新增知识库名称重复校验 删除知识库时使用逻辑删除这样做完之后知识库模块就不只是接口能跑而是开始具备真实项目中的数据持久化能力。二、为什么要接入 MySQLDay06 的内存版实现主要是为了先把接口流程跑通。当时的调用流程是Controller 接收请求 Service 处理业务逻辑 Repository 在内存中保存数据 返回统一 JSON这种方式适合学习和快速验证接口但是不适合真实项目。因为内存数据有一个明显问题服务一重启数据就没了而企业项目中的知识库数据必须长期保存。例如售后政策、维修流程、退换货规则等内容不能因为服务重启就丢失。所以 Day07 要把知识库数据保存到 MySQL 中。三、保留内存版新增 MySQL 版这次并没有直接删掉 Day06 的内存版 Repository而是保留了它同时新增了 MySQL 版 Repository。当前项目支持两种模式MYSQL_ENABLEDfalse使用内存版 Repository MYSQL_ENABLEDtrue使用 MySQL 版 Repository这样做的好处是如果本地暂时没有启动 MySQL项目依然可以正常运行和测试。如果需要验证真实数据库保存效果就把MYSQL_ENABLED设置为true后端就会走 MySQL 版实现。这种设计对本地开发比较友好。四、新增 JdbcTemplate 配置Day07 新增了JdbcTemplate配置。JdbcTemplate可以理解为 Spring 提供的一个数据库操作工具。它可以帮助我们执行 SQL比如SELECT 查询数据 INSERT 新增数据 UPDATE 修改数据相比直接使用原生 JDBCJdbcTemplate会帮我们处理一部分重复代码比如连接、执行 SQL、结果映射等。本次知识库 MySQL 版 Repository 就是基于JdbcTemplate实现的。五、知识库表 kf_knowledge_bases知识库数据保存到数据库表kf_knowledge_bases主要字段包括id name description owner_id status created_at updated_at deleted这些字段和 Day06 的知识库对象基本对应。其中比较重要的是deleted这个字段用于逻辑删除。六、什么是逻辑删除以前理解删除可能就是直接把数据库里的记录删掉。但是在真实项目中很多时候不会直接物理删除数据而是使用逻辑删除。所谓逻辑删除就是不是真的删除这一行数据而是把某个状态字段改掉。例如deleted 0正常数据 deleted 1已删除数据查询知识库列表时只查询deleted 0这样用户看不到已经删除的数据但数据库里仍然保留记录。这样做的好处是方便后续追踪数据 避免误删导致数据无法恢复 保留历史记录 更符合企业项目的数据管理方式所以 Day07 删除知识库时并不是直接删除数据库记录而是把deleted字段更新为1。七、增加知识库名称重复校验Day07 还新增了一个业务校验知识库名称不能重复。比如已经存在一个售后服务知识库如果再次创建同名知识库系统会返回错误{ code: 400, message: 知识库名称已存在, data: null }这个功能看起来很小但在后台系统中很常见。如果允许重复名称后续用户在选择知识库、上传文档、进行问答时就容易混乱。因此新增和修改知识库时都需要判断名称是否重复。八、分层结构的好处Day07 最明显能感受到后端分层的好处。Day06 使用的是内存版 RepositoryInMemoryKnowledgeBaseRepositoryDay07 新增的是 MySQL 版 RepositoryJdbcKnowledgeBaseRepository但是 Controller 和 Service 的整体结构没有大改。也就是说接口层基本不变 业务层只增加校验 数据访问层替换实现这说明分层设计是有意义的。如果一开始把所有 SQL、业务逻辑、接口代码都写在 Controller 里面后面想从内存版改成 MySQL 版就会很混乱。