拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Spring Boot个人博客系统实战:源码解析、数据库配置与本地运行指南

简介这是一套基于Spring Boot的个人博客系统完整源码与数据库资源面向具备Java Web基础、希望练习前后台整合开发的学生与开发者可用于课程设计、毕业设计或技术栈实战演练。压缩包共598个文件约92.43MB涵盖29个Java源文件、30个HTML页面、70个JavaScript脚本、58个CSS样式、119个XML配置及1个SQL数据库脚本另含图片、字体、依赖jar等静态资源结构完整便于直接导入IDEA运行。系统前台基于Thymeleaf与jQuery实现用户登录、文章分页展示、详情查看与评论后台采用Spring MVCSpring BootMyBatis整合支持登录、系统数据展示及文章的发布、修改与删除共设计6张数据表并引入Redis做缓存管理。目前已有5048人学习下载读者可借此掌握Spring Boot项目搭建、MyBatis持久层配置、前后台数据交互与缓存集成的完整思路快速理解博客类系统的业务分层与目录组织方式。1. 基于 Spring Boot 的个人博客系统从源码到数据库一套能跑起来的落地路径很多人第一次接触 Spring Boot 项目都是从「个人博客系统」开始的。它不像商城、SaaS 那样一上来就堆几十张表但麻雀虽小五脏俱全用户登录、文章发布、分类标签、评论、分页查询一个都不少。你拿到一份「源码数据库」的压缩包真正卡住你的往往不是代码看不懂而是环境跑不起来、数据库连不上、表结构和实体对不上。这篇笔记就围绕这套基于 Spring Boot 的个人博客系统把源码结构、数据库设计、启动配置、接口调试和常见翻车点讲清楚。适合正在做 Java 课程设计、想拿一个完整项目练手、或者准备把博客系统改成自己作品集的开发者。读完你能独立把项目在本地跑通并且知道每个参数该改哪里。2. 先看清这套源码的骨架Spring Boot 博客系统到底由哪些层组成2.1 从目录结构判断项目用的是哪种分层方式拿到源码先别急着点运行先看目录。常见的 Spring Boot 博客系统一般分两种组织方式按层分包controller、service、mapper、entity和按功能分包article、user、comment。前者适合新手后者适合后续扩展。你打开src/main/java下面的包名基本就能判断作者的习惯。一个典型的按层分包结构长这样src/main/java/com/example/blog ├── controller // 接收前端请求 ├── service // 业务逻辑 │ └── impl ├── mapper // 数据库访问接口 ├── entity // 数据库表对应实体 ├── dto // 前端传参对象 ├── vo // 返回给前端的对象 ├── config // 拦截器、跨域、MyBatis 配置 └── BlogApplication.java看到mapper包基本可以确定用的是 MyBatis 或 MyBatis-Plus。看到repository包多半是 Spring Data JPA。这两种在博客系统里都很常见但配置方式完全不同。MyBatis 需要写 XML 或注解 SQLJPA 靠方法名自动生成查询。你如果不先确认这一点后面改数据库连接会一直报错。resources目录同样关键。application.yml或application.properties里藏着数据库地址、端口、日志级别。mapper文件夹下如果有 XML 文件说明 SQL 写在 XML 里改字段名时要同步改 XML 和实体类漏一个就查不出数据。2.2 数据库表结构和实体类的对应关系怎么核对博客系统的数据库通常有 5 到 8 张表用户表、文章表、分类表、标签表、文章标签关联表、评论表。你拿到.sql文件后先别直接导入打开看一眼建表语句和字段类型。表名关键字段对应实体常见坑userid, username, password, avatarUser密码是否加密存储articleid, title, content, user_id, category_id, create_timeArticlecontent 用 text 还是 longtextcategoryid, nameCategory名称是否唯一tagid, nameTag和文章是多对多article_tagarticle_id, tag_id无独立实体联合主键容易漏commentid, article_id, user_id, content, parent_idCommentparent_id 支持楼中楼核对方法很简单打开实体类看TableName或Table注解指定的表名再看每个字段的TableField或Column是否和数据库列名一致。常见翻车是数据库用下划线命名create_time实体用驼峰createTime但没开驼峰映射结果查出来全是 null。MyBatis-Plus 默认开启驼峰转换MyBatis 原生需要手动配map-underscore-to-camel-case: true。提示导入 SQL 前先确认数据库版本。MySQL 5.7 和 8.0 在字符集和默认排序规则上有差异utf8和utf8mb4混用会导致 emoji 存入报错。2.3 启动类之外哪些配置决定了项目能不能跑起来BlogApplication.java本身通常只有一行SpringApplication.run真正决定成败的是配置文件。你需要重点看四个地方数据库连接、端口、文件上传路径、日志。数据库连接串里url后面的参数最容易被忽略。比如serverTimezoneAsia/Shanghai不加MySQL 8.0 可能报时区错误useUnicodetruecharacterEncodingutf8不加中文标题可能乱码。端口默认 8080如果被占用就改成 8081。文件上传路径如果是本地磁盘路径换电脑后要同步改否则头像和封面图全部 404。spring: datasource: url: jdbc:mysql://localhost:3306/blog?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 10MB max-request-size: 10MB server: port: 8080这段配置里driver-class-name在 MySQL 8.0 之后必须用com.mysql.cj.jdbc.Driver老版本用com.mysql.jdbc.Driver会提示已废弃。max-file-size不调大上传封面图超过 1MB 就直接抛异常。这些参数不改项目启动日志看着正常一操作就报错。3. 把源码跑起来数据库导入、依赖安装和启动命令的完整顺序3.1 数据库导入先建库再导表字符集一次设对第一步永远是建库。不要直接导入 SQL 文件先手动创建数据库并指定字符集CREATE DATABASE blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE blog;然后导入表结构和初始数据。如果你用的是 Navicat 或 dbx 这类数据库管理工具右键数据库选择「运行 SQL 文件」选中源码里的.sql文件执行。命令行方式更直接mysql -u root -p blog blog.sql导入完成后执行SHOW TABLES;确认表数量。常见问题是 SQL 文件里带了CREATE DATABASE语句但没指定字符集导入后中文变成问号。解决办法是删库重建或者用ALTER TABLE逐张表改字符集。更省事的做法是导入前用编辑器把 SQL 文件开头的建库语句改成utf8mb4。初始数据里通常有一个默认管理员账号密码可能是明文也可能是 MD5。如果是明文登录后第一件事就是改密码如果是 MD5你需要知道原始密码才能登录一般在 README 或 SQL 注释里会写。找不到就自己插一条新用户记录密码字段用 MD5 工具生成。3.2 Maven 依赖拉取换源和跳过测试的两个实用参数数据库准备好后用 IDEA 或命令行打开项目。Maven 会自动下载依赖但默认中央仓库在国内速度很慢。在settings.xml里配阿里云镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror配好后执行编译命令。第一次跑建议跳过测试因为测试类可能连的是另一个数据库mvn clean package -DskipTestsclean清掉旧编译产物package打包成 jar-DskipTests跳过测试执行但依然编译测试代码。如果依赖里有spring-boot-starter-test但数据库没配好不跳过测试会直接失败。打包成功后target目录下会出现一个可执行 jar。注意如果项目用的是 Gradle命令换成./gradlew clean build -x test。先看项目根目录有没有pom.xml或build.gradle别搞混。3.3 启动项目java -jar 和 IDE 运行的区别与选择启动方式有两种。IDE 里直接运行BlogApplication的main方法适合调试改代码后热部署生效快。命令行java -jar适合验证打包结果java -jar target/blog-0.0.1-SNAPSHOT.jar --spring.profiles.activedev--spring.profiles.activedev指定使用application-dev.yml配置。如果项目没有多环境配置去掉这个参数。启动日志里看到Started BlogApplication in X seconds就算成功。如果卡在HikariPool或Tomcat相关日志多半是数据库连不上或端口被占用。启动后浏览器访问http://localhost:8080。如果返回 Whitelabel Error Page说明项目起来了但没有配首页控制器这时候访问/login或/index试试。前端页面通常在resources/static或resources/templates下前后端不分离的项目直接访问对应路径即可。4. 接口调试与数据库增删改查验证博客系统核心功能是否正常4.1 用 curl 和 Postman 验证文章列表与详情接口项目跑起来后先测最核心的文章接口。假设控制器映射是/api/article列表接口通常是 GET 请求curl -X GET http://localhost:8080/api/article/list?page1size10 -H Accept: application/json返回 JSON 里应该有code、msg、data三个字段data里是文章数组和总数。如果返回 401说明接口被拦截器拦了需要先登录拿 token。如果返回 500看控制台异常栈多半是 SQL 写错或字段映射失败。详情接口一般传文章 idcurl -X GET http://localhost:8080/api/article/1 -H Accept: application/json这里容易翻车的是 id 类型。数据库用 bigint前端传字符串后端用 Long 接收一般没问题。但如果用了PathVariable(id) int id文章 id 超过 21 亿就溢出。博客系统虽然不至于但养成用 Long 的习惯没坏处。4.2 数据库增删改查从 SQL 到 Mapper 的对应检查博客系统的增删改查集中在文章和评论上。你改一个字段要同时检查四个地方数据库列、实体属性、Mapper XML 或注解、前端传参名。漏一个就出现「新增成功但列表不显示」或者「更新后字段没变」。以新增文章为例Mapper XML 里常见写法insert idinsertArticle parameterTypeArticle INSERT INTO article (title, content, user_id, category_id, create_time) VALUES (#{title}, #{content}, #{userId}, #{categoryId}, NOW()) /insert#{userId}对应实体里的userId属性如果实体写的是user_id这里就取不到值插入变成 null。NOW()是数据库函数如果实体里也有createTime并且前端传了值两者会冲突建议只保留一种。查询列表时分页参数用LIMIT还是插件决定了你改 SQL 的方式。MyBatis-Plus 的分页插件会自动拼LIMIT你手写 SQL 时如果又加了一次LIMIT就会报语法错误。判断方法看config包里有没有PaginationInterceptor或MybatisPlusInterceptor的 Bean。4.3 评论和分类接口的联调顺序评论依赖文章和用户分类依赖文章。联调顺序建议先测分类列表再测文章列表最后测评论。因为评论查询通常要 join 用户表拿头像和昵称如果用户表没数据评论接口返回空数组但不报错你会误以为接口坏了。分类接口一般有树形结构parent_id为 0 是顶级分类。如果返回的分类列表是平铺的前端需要自己组装成树。这一步在博客系统里经常被简化你看到category表只有 id 和 name 两个字段说明不支持多级分类别硬加。提示调试接口时打开 MyBatis 的 SQL 日志在配置里加logging.level.com.example.blog.mapperdebug控制台会打印实际执行的 SQL 和参数比猜快得多。5. 避坑与排查个人博客系统源码跑不通的 5 个高频问题5.1 启动报错 Access denied for user数据库账号密码不对现象启动日志里出现java.sql.SQLException: Access denied for user rootlocalhost。原因配置文件里的用户名或密码和本地 MySQL 不一致。很多人本地 MySQL 密码是空的或者自己改过但源码里写的是123456。解决打开application.yml把username和password改成你本地实际的值。如果 MySQL 是 8.0 且用了caching_sha2_password插件老版本驱动连不上要么升级驱动要么改用户认证插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码;。5.2 页面 404 但接口能通静态资源路径没配对现象/api/article/list返回正常 JSON但访问http://localhost:8080显示 404。原因前端页面放在resources/templates下但没有配 Thymeleaf 或模板引擎依赖或者页面放在static下的子目录里访问路径没带子目录名。解决先看pom.xml有没有spring-boot-starter-thymeleaf。有的话控制器要返回视图名而不是 JSON。没有的话页面应该在static目录下直接访问文件名比如http://localhost:8080/index.html。前后端分离的项目前端单独跑一个端口后端只提供接口404 是正常的。5.3 中文乱码字符集从数据库到前端一路要统一现象文章标题在数据库里正常页面上显示问号或者前端提交中文存进数据库变成乱码。原因数据库字符集、连接串字符集、前端页面编码三者不一致。常见是数据库用了latin1或者连接串没加characterEncodingutf8。解决按顺序检查。数据库执行SHOW VARIABLES LIKE character%;确保character_set_database是utf8mb4。连接串加useUnicodetruecharacterEncodingutf8。前端 HTML 的meta charsetUTF-8不能少。三步都对了乱码基本消失。5.4 分页查询返回总数不对count 语句被插件改写现象文章列表每页 10 条但总数显示 10 而不是 100。原因MyBatis-Plus 分页插件会自动生成 count 语句但如果你的 SQL 里有GROUP BY或DISTINCT自动 count 可能不准。解决手写 count 查询在 Mapper 里单独定义一个selectCount方法分页插件配置里指定countSql或关闭自动 count。更简单的办法是看插件版本老版本对复杂 SQL 支持不好升级到最新稳定版通常能解决。5.5 上传图片后访问 404文件路径和映射没对上现象头像上传成功数据库里也有路径但浏览器访问图片地址返回 404。原因文件存到了本地磁盘某个目录但 Spring Boot 没有把这个目录映射为静态资源路径。解决在配置类里加资源映射Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocations(file: System.getProperty(user.dir) /upload/); } }/upload/**是访问路径file:后面是实际存储目录。存文件时用同一个目录路径就对上了。Windows 和 Linux 的路径分隔符不同用System.getProperty(user.dir)拼相对路径比写死D:/或/home/更稳。6. 把博客系统改成自己的作品三个进阶技巧和验证方法6.1 用 Spring Boot 日志定位慢查询而不是靠猜博客系统文章多了以后列表接口变慢。别急着加缓存先开 SQL 日志看执行时间。在application.yml里加logging: level: com.example.blog.mapper: debug控制台会打印每条 SQL 和耗时。如果某条查询超过 500ms看它有没有走索引。文章表按create_time排序分页就给create_time加索引ALTER TABLE article ADD INDEX idx_create_time (create_time);加完再测耗时通常从几百毫秒降到几毫秒。这个验证方法比任何理论都直接改之前记时间改之后再记一次对比数字。6.2 把硬编码的配置抽成环境变量方便换机器源码里数据库密码、文件路径、端口经常写死在application.yml。换一台电脑就要改一遍容易漏。改成环境变量引用spring: datasource: url: ${DB_URL:jdbc:mysql://localhost:3306/blog?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai} username: ${DB_USER:root} password: ${DB_PASSWORD:123456}${DB_URL:默认值}的意思是先读环境变量DB_URL读不到就用冒号后面的默认值。这样本地开发不用设环境变量部署到服务器时设一下就行。验证方法本地不设任何环境变量启动能跑通然后export DB_PASSWORD新密码再启动看是否用了新密码。6.3 用接口测试代替手动点页面回归更快每次改完代码手动点页面验证效率低还容易漏。用curl写一个简单的回归脚本#!/bin/bash BASEhttp://localhost:8080 echo 文章列表: curl -s $BASE/api/article/list?page1size5 | head -c 200 echo echo 文章详情: curl -s $BASE/api/article/1 | head -c 200 echo echo 分类列表: curl -s $BASE/api/category/list | head -c 200三个接口都返回 JSON 且没有error字段说明核心链路正常。这个脚本可以放进 CI每次提交自动跑。我自己的习惯是改完 Mapper 先跑一遍这个脚本比打开浏览器快得多也避免了自己骗自己「应该没问题」。这套基于 Spring Boot 的个人博客系统源码和数据库本身不复杂难的是环境配置和字段对应。把上面这些参数和排查点过一遍基本能跑通九成以上的同类项目。后面想加 Redis 缓存、Markdown 渲染、全文检索都是在这个骨架上叠不会动到根基。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门