news 2026/10/7 7:46:17

JavaEE+MySQL个人博客系统:数据库设计、事务与Filter鉴权全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaEE+MySQL个人博客系统:数据库设计、事务与Filter鉴权全解析

简介:基于 JavaEE 与 MySQL 的个人博客系统资源包,面向毕业设计、课程设计以及初学 JavaWeb 的开发者,提供了前后端完整、可直接运行与继续开发的博客案例。压缩包约 179.66MB,里面包含源码工程、数据库 SQL 脚本、毕业论文文档、答辩 PPT 和演示视频,可以覆盖从环境搭建、功能演示到文档撰写、答辩准备的全过程。目前已有 95 人学习,系统主要模块包括后台登录、博客发布与管理、博客类别维护、评论审核、个人信息设置、友情链接管理等;前台支持游客浏览日志、查阅文章并参与评论。借助源码、SQL 脚本和视频,读者可以理解 Shiro 安全认证、MySQL 数据交互、百度富文本编辑器接入等关键实现,并可将现有功能替换或扩展,快速形成自己的课设或毕设作品。包内论文与答辩 PPT 可进一步作为文档模板和演示素材,减少从零整理的时间成本。

1. 个人博客系统为什么还值得用 JavaEE + MySQL 做一遍

每年到毕业设计季,总有人纠结要不要用 Spring Boot 重写一个博客系统。我的看法很直接:如果你需要的是能顺利答辩、论文有东西可写、代码和数据库能自圆其说的完整项目,那么基于 JavaEE + MySQL 实现的个人博客系统依然是性价比最高的选题之一。它不是什么高深架构,但恰好覆盖了 Servlet/JSP、数据库设计、会话管理、权限控制这些必考知识点,而且附带源码、数据库 SQL、论文、答辩 PPT 和演示视频,从动手到讲稿都能直接复用。这套方案适合三类人:计算机相关专业的毕业生、想快速搭建可演示项目的初级开发者、以及需要给课程设计交一个像样作品的同学。接下来我会按“跑通→读懂→改造→排坑→验收”的顺序,把这个项目从头到尾拆给你看。

2. 从零跑通项目:环境搭建与最小启动命令

拿到一个带源码和数据库 SQL 的 JavaEE 博客系统,第一步不是急着改代码,而是把环境对齐。很多人在这一步就卡住,不是因为代码有问题,而是 JDK、Tomcat、MySQL 的版本之间不匹配,导致项目跑不起来。这里我先讲一套通用且稳定的版本搭配,再给出检查和导入的具体命令。

2.1 JDK、Tomcat、MySQL 版本搭配与安装检查

常见做法是 JDK 8 + Tomcat 8.5/9.0 + MySQL 5.7。这套组合在 JavaEE 项目里最稳,网上绝大多数源码也是按这个环境写的。如果你的机器上装的是 MySQL 8.0,也能跑,但需要额外处理驱动和认证插件的问题,后面避坑专章会单独说。先做一次环境体检,打开命令行工具,逐条执行下面的命令:

java -version javac -version mysql --version

三条命令都正常输出版本号,说明 JDK 和 MySQL 已装好。注意javac必须有输出,因为编译 Java 代码要用它;只装了 JRE 是不行的。如果提示找不到命令,需要先把对应的 bin 目录加到PATH环境变量里。

接下来检查 Tomcat。去 Tomcat 官网下载 8.5 或 9.0 的 zip 包,解压后进入 bin 目录,执行:

startup.bat

在浏览器访问http://localhost:8080,能看到 Tomcat 默认页面就说明容器没问题。如果你用 IDE 内嵌的 Tomcat,也要先确保本机这个 Tomcat 能正常起来,否则后面项目启动失败时,很难分清是源码问题还是容器问题。我一般习惯用命令行先独立启动一次 Tomcat,给环境打个底。

2.2 导入源码与数据库 SQL 的完整步骤

项目源码解压后,通常会看到这样的目录结构:src目录放 Java 源码,WebContent或web目录放 JSP 页面、样式文件和WEB-INF配置,数据库脚本一般是blog.sql或init.sql,放在根目录或db文件夹里。先用 IDE 导入:Eclipse 选择 "Import → Existing Projects into Workspace",IDEA 选择 "Open",然后定位到解压目录。

数据库导入是整个环节最容易出问题的一步。很多同学直接在 Navicat 里双击运行 SQL 脚本,遇到外键约束或建表顺序不对就报错。更稳妥的方式是用 MySQL 命令行导入。以 MySQL 5.7 为例,先建一个空数据库,再导入脚本:

mysql -u root -p -e "CREATE DATABASE blog_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -u root -p blog_db < blog.sql

第一行创建数据库,指定utf8mb4字符集,这是为了兼容文章里的 emoji 和生僻字;第二行把整个 SQL 脚本导入。执行完没有报错,可以用mysql -u root -p blog_db -e "SHOW TABLES;"查看表清单,能列出用户表、文章表等核心表,说明导入成功。顺带提一句:如果你是从 PDF 或网页里复制 SQL,粘贴到命令行执行基本都会翻车,因为引号和特殊字符被转了,务必用原始脚本文件。

2.3 配置数据源与启动项目的三个关键改动

导入项目后,先不要急着点 Run。JavaEE 项目的数据库连接一般写在src/jdbc.properties或者WEB-INF/classes/db.properties里,内容类似这样:

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/blog_db?useUnicode=true&characterEncoding=utf8&useSSL=false jdbc.username=root jdbc.password=123456

你需要核对三个地方:一是jdbc.url里的数据库名blog_db是否和你建库时一致;二是jdbc.username和jdbc.password是否对应当前 MySQL 的账号;三是如果你的 MySQL 是 8.0,jdbc.driver必须改成com.mysql.cj.jdbc.Driver,否则启动时会报ClassNotFoundException。改完保存,再用 IDE 把项目部署到 Tomcat 上启动。

启动后看控制台日志,如果出现Tomcat started on port(s): 8080说明容器起来了。访问http://localhost:8080/项目名(项目名通常是blog或你的工程名),能看到博客首页,说明这个项目已经跑通了。到这里,你已经完成了从“拿到源码”到“本地运行”的关键一步,剩下的时间都花在怎么把系统讲清楚、改出自己的东西上。

3. 数据库设计:博客系统的表结构与 SQL 脚本怎么读

跑通项目之后,你手里最有含金量的资产就是那份blog.sql。论文和答辩 PPT 里的 E-R 图、表结构说明全要从它里面提炼。很多同学把脚本导入完就不管了,结果答辩老师问“这两张表什么关系”时答不上来。我建议你把脚本打开,对照下面的核心表结构逐张看过。

3.1 用户、文章、分类、评论四张核心表的关系

典型的个人博客系统至少包含这四张表:用户表、文章表、分类表、评论表。它们的关系是:一个用户拥有多篇文章,一篇文章属于一个分类,一篇文章被多个评论。有的项目还会有标签表和多对多关联表,但基础版先看这四张就够了。

表结构大致如下:

表名主要字段说明
t_userid, username, password, nickname, avatar用户表,密码通常存 MD5 或 SHA1 值
t_categoryid, name, description分类表
t_articleid, title, content, user_id, category_id, view_count, create_time文章表,外键关联用户和分类
t_commentid, article_id, user_id, content, create_time评论表,关联文章和用户

手工设计时,外键的命名风格要统一。比如文章表里的user_id和category_id,在创建索引时直接叫idx_article_user、idx_article_category,这样后面写 SQL 的时候不会晕。另外注意:view_count这种统计字段最好直接落在文章表里,不要每次用COUNT(*)去查浏览记录表,否则以后数据量上来,慢查询会先卡在博客详情页。

3.2 常用查询:分页、标签、热度排序的 SQL 写法

读懂表结构之后,要能自己写出几个核心查询。博客系统最常用的就是分页查文章列表,按热度排序,以及统计评论数。这里给三条可以直接抄的 SQL,也是答辩时老师常问的考点。

分页查询,用 MySQL 的LIMIT实现:

SELECT a.id, a.title, a.view_count, c.name AS category_name FROM t_article a LEFT JOIN t_category c ON a.category_id = c.id ORDER BY a.create_time DESC LIMIT 0, 10;

这条语句查第一页的 10 篇文章,LIMIT 0, 10中第一个参数是偏移量,第二个是每页条数。如果你用PageHelper这种工具,底层拼的也是这个语法。注意LEFT JOIN用了c.name,如果某篇文章没有分类,分类名会是 NULL,前端要做好空值判断。

热门文章排序,按浏览量倒序:

SELECT a.id, a.title, a.view_count FROM t_article a ORDER BY a.view_count DESC LIMIT 10;

这是最简单的热度算法,只看浏览量。更精细一点的做法是加时间衰减,比如按view_count / DATEDIFF(NOW(), a.create_time)排序,但基础版用前者就够。

评论统计,用子查询或GROUP BY:

SELECT a.id, a.title, COUNT(c.id) AS comment_num FROM t_article a LEFT JOIN t_comment c ON a.article_id = c.article_id GROUP BY a.id, a.title ORDER BY comment_num DESC;

这条 SQL 在论文的“数据库访问层设计”里出现频率极高。写的时候注意GROUP BY的列必须和 SELECT 中非聚合列一致,否则在 MySQL 5.7 及以上版本开启ONLY_FULL_GROUP_BY后,会直接报错。

3.3 事务与防注入:登录和评论接口的代码级处理

数据库脚本只是基础,真正体现工程能力的地方是 Java 层的 JDBC 操作。尤其是登录和评论这两个入口,既涉及 SQL 注入风险,又可能遇到多步写入需要保证一致性的场景。先说 SQL 注入,典型的安全写法是使用PreparedStatement,而不是手动拼接字符串:

String sql = "SELECT id, username FROM t_user WHERE username = ? AND password = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, md5Password); ResultSet rs = ps.executeQuery();

这里有两个关键点:第一,所有用户输入都用?占位符,由驱动帮你转义,单引号、注释符都伤不到 SQL;第二,密码在存储时做了一次 MD5,所以这里比对的是哈希值,而不是明文。如果你在别人的源码里看到"SELECT ... WHERE username = '" + username + "'"这种写法,赶紧改掉,这是典型的注入漏洞。用' OR '1'='1甚至能直接登录后台。

再说事务。评论接口通常要同时做两件事:插入一条评论记录、更新文章的评论数或最后评论时间。这两步要么都成功,要么都失败,否则就会出现评论写了但文章统计没变的脏数据。JDBC 事务的标准写法是:

conn.setAutoCommit(false); try { insertComment(conn, comment); updateArticleCommentCount(conn, articleId); conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); conn.close(); }

setAutoCommit(false)之后,所有 SQL 都在同一个事务里,只有到commit()才统一生效。注意事务一定要在finally里恢复自动提交,并且要关闭连接,否则连接池里的连接再被拿回来时,还是非自动提交状态,那才是真正的“玄学 bug”:第一次操作正常,第二次就莫名锁表。这段代码写进论文的“系统实现”章节,比贴十张页面截图都管用。

4. 二次开发:从「跑通」到「能答辩」的功能改造

源码能跑只是起点。答辩老师不会只让你演示页面,大概率会问“哪些功能是你自己实现的”。空口无凭,你得真的动手改几处代码。这里我挑三个性价比最高的改造点:登录鉴权、图片上传、测试用例。每一处改动都不复杂,但对系统质量和答辩观感提升明显。

4.1 用 Filter 或拦截器实现登录鉴权与权限控制

很多博客源码的登录功能只是判断登录成功后跳转,但没有拦截未登录用户访问后台页面。你打开项目后,随便试着一个浏览器直接访问http://localhost:8080/blog/admin/index.jsp,如果它直接显示后台界面,就说明鉴权是缺失的。补上一个 Filter 是最快的方案。新建一个LoginFilter.java:

public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; Object user = request.getSession().getAttribute("user"); String path = request.getRequestURI(); // 放行登录页和静态资源 if (user != null || path.contains("/login.jsp") || path.contains("/css/") || path.contains("/images/")) { chain.doFilter(req, resp); } else { response.sendRedirect(request.getContextPath() + "/login.jsp"); } } }

这段代码的核心逻辑是:从 session 里取用户对象,如果为空就跳回登录页。放行规则要细心配,否则会出现 CSS 样式全丢或者登录页本身被拦掉的翻车现场。然后在web.xml里注册 Filter:

<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.blog.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping>

注意url-pattern写/admin/*而不是/*,这样只拦截后台路径,避免影响前台页面。这种改动的原理和 Spring MVC 的拦截器一样,但用 JavaEE 原生 Filter 写出来,答辩时更能展示你对 Servlet 规范的理解。

4.2 富文本编辑与图片上传的前后端协作

博客文章内容不能只用文本框,富文本编辑器是标配。常见做法是引入百度 UEditor 或 wangEditor,前者功能全但集成麻烦,后者轻量且容易改。这里我以 wangEditor 为例讲一下集成思路:在文章发布页面引入 JS,然后表单提交时把编辑器生成的 HTML 同步到隐藏字段。

var editor = new wangEditor('#editor'); editor.create(); // 在表单提交前,将编辑内容写入隐藏域 document.getElementById('content').value = editor.txt.html();

后端接收这个content字段,直接作为 HTML 存入数据库。这里要特别留意 XSS 风险:如果允许用户输入任意 HTML,别人可以在文章里插入脚本。谨慎做法是对<script>、iframe等标签做过滤,或者用StringEscapeUtils.escapeHtml4转义后存储。基础项目不处理,但你在论文里提一句“安全考虑”,比通篇写“实现功能”加分。

图片上传是另一个高频改造点。后端用 Servlet 接收文件,保存到指定目录并返回 URL。典型代码片段如下:

Part part = request.getPart("file"); String fileName = System.currentTimeMillis() + "_" + part.getSubmittedFileName(); String savePath = getServletContext().getRealPath("/upload"); part.write(savePath + File.separator + fileName); String url = request.getContextPath() + "/upload/" + fileName;

这段代码用 Servlet 3.0 的Part接口,省去了解析表单的麻烦。注意savePath用getRealPath拿到的是发布后的真实路径,在 IDEA 里可能是 target 目录,重启后会清空。我一般建议改到与其他项目共享的静态资源路径,或者用相对路径存到指定磁盘。血泪经验是:图片上传成功但刷新后丢失,八成是路径不对,根本原因是getRealPath指向了临时目录。

4.3 给论文和答辩准备的系统架构图与测试用例

二次开发不只是改代码,还要把改动沉淀成文档。论文里必放的系统架构图,你可以按这个层次画:浏览器层 → JSP/JavaScript → Servlet 控制器 → Service 业务层 → DAO 数据访问层 → MySQL 数据库。画图工具就用 Visio 或 draw.io,不要用截图替代。

测试用例是你最容易忽略但答辩必问的环节。我建议用表格整理一份测试清单:

测试模块测试操作预期结果
登录输入错误密码提示“用户名或密码错误”
登录直接访问后台 URL跳转至登录页
文章发布标题为空提交前端拦截,提交失败
评论非登录用户提交评论跳转登录页
数据库删除某分类后查看文章文章仍显示,分类名置空

这张表不仅能放进论文的“系统测试”章节,也能当作答辩演示的操作脚本。按表走一遍,相当于提前彩排。很多同学演示到一半不知道下一步点什么,就是因为没给自己准备这种“提词器”。到这里,你的项目已经不是原版了,而是带鉴权、带安全处理、带完整文档的“二次开发版”。

5. 避坑指南:JavaEE 项目最常见的 5 个坑与排查方法

从环境搭建到二次开发,最耗时间的往往不是写代码,而是排一些位置刁钻的坑。我把这些年接手过的 JavaEE 博客系统项目里最容易踩的五个坑列出来,每条都按“现象 → 原因 → 解决”写,你逐个排查,能省下至少两天时间。

坑一:数据库中文全是问号

现象:文章标题和内容里的中文在页面显示成????。原因有两个层面:一是数据库表字符集不是 utf8;二是 JDBC 连接串没指定characterEncoding=utf8。解决:先执行ALTER DATABASE blog_db CHARACTER SET utf8mb4;,再修改表。最彻底的办法是删库重导脚本,建库时直接写DEFAULT CHARACTER SET utf8mb4。连接串那侧的characterEncoding=utf8也必须保留,否则页面输出还是乱码。

坑二:Tomcat 启动显示端口被占用

现象:启动项目时控制台报Port 8080 was already in use。原因:另一个进程占用了 8080 端口,常见于已经启动过一个 Tomcat,或别的软件抢占了端口。解决:关掉多余的 Java 进程,或用命令查占用者:

netstat -ano | findstr 8080

看到 PID 后,在任务管理器里结束对应进程。如果你不想杀进程,也可以改 Tomcat 的server.xml里的端口号,改成 8081 或其他空闲端口。但注意,改了端口后,项目访问 URL 也要跟着变。

坑三:MySQL 8.0 连不上,报认证插件错误

现象:启动项目时日志出现Unable to load authentication plugin 'caching_sha2_password'。原因:MySQL 8.0 默认认证插件是caching_sha2_password,而项目里用的是老版本 MySQL 的mysql_native_password驱动或账号。解决:改驱动为com.mysql.cj.jdbc.Driver,或者在 MySQL 里给用户改回旧认证方式:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

如果你是跟着 2.3 节把驱动改成了com.mysql.cj.jdbc.Driver,通常不需要这条 SQL;但有些老驱动对这个错误无能为力,只能换驱动或改认证方式。

坑四:找不到或无法加载主类,或 ClassNotFound

现象:Tomcat 启动瞬间失败,报ClassNotFoundException: com.mysql.jdbc.Driver。原因:MySQL 驱动 jar 包没放到项目的WEB-INF/lib目录下,或者没有部署到 Tomcat。解决:在WEB-INF/lib里放一份mysql-connector-java-x.x.x.jar,然后在 IDE 里刷新依赖并重新部署。这个坑多在从 Git 拉取项目后出现,因为驱动 jar 是二进制,通常不提交到版本控制里。

坑五:操作数据库超时或卡死,出现锁等待

现象:评论发不出去,后台日志报Lock wait timeout exceeded。原因:事务没有正常提交或回滚,导致连接持有行锁不放。常见场景是代码里setAutoCommit(false)后,执行完 SQL 忘记commit()或没有在finally里恢复自动提交。解决:按 3.3 节的事务模板检查每一个 JDBC 操作,并加日志输出当前连接状态。或者临时用SHOW PROCESSLIST查看Sleep状态的连接,批量KILL掉。这个问题在开发环境不明显,演示现场出现就是灾难,务必提前排查。

6. 最后一步:用这三点验证你的博客系统真的能交付

到这里,项目能跑、代码能改、文档能写,但你还差一个“确定它能交付”的验收过程。我给你三个最直接的验证点,按顺序做一遍,任何一个失败就回头修。

第一,走一遍完整业务流程。从注册、登录、发文章、上传图片、评论到退出登录,全部按真实用户操作走一遍。重点看后台发布文章后,前台能否立即看到;评论提交后,文章详情页的评论数是否增加。这个过程要录屏,答辩 PPT 里可以放那一段视频,比讲半天截图更有说服力。

第二,验证数据库备份与恢复。用命令行导出一份当前数据库:

mysqldump -u root -p blog_db > blog_backup.sql

然后删除一张表,再用mysql -u root -p blog_db < blog_backup.sql恢复。这个测试能证明你的系统不依赖手头这台开发机,搬到任何一台装有 MySQL 的机器都能重建。很多同学答辩前把 U 盘弄丢了,数据库没法恢复,只能干瞪眼。

第三,检查代码里有没有写死的绝对路径和明文密码。用全局搜索功能搜一下localhost、123456等字符串,凡是出现在 Java 源码或配置文件里的,都要改成相对路径和脱敏方式。这一步是给项目做“保洁”,因为评审老师可能直接把源码拿走看。我在自己交付项目前,总会花半小时做这轮检查,避免把开发环境里的个人路径和无关文件带进去;每次这么做都像是给系统吃后悔药,但总比交上去后被人挑刺好。

如果你已经走到了这一步,说明这个 JavaEE + MySQL 的个人博客系统从源码到论文都被你吃透了。后续哪怕你上手 Spring Boot、微服务,数据库设计、事务控制、Filter 鉴权这些底层思路依然通用。希望帮到你,也希望你的博客系统能顺利通过答辩。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 7:44:46

YOLO小目标检测实战:篮球排球网球三类球体检测调优指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 7:43:12

每日安全情报报告 · 2026-10-06

每日安全情报报告 2026-10-06 由 AI 整理发布 覆盖范围&#xff1a;2026-10-05 ~ 2026-10-06&#xff08;近 24–48 小时新增 / 活跃威胁&#xff09; 数据来源&#xff1a;CISA KEV、NVD、MITRE CVE、The Hacker News、FreeBuf/安全客&#xff08;CN-SEC 聚合&#xff09;、V…

作者头像 李华
网站建设 2026/10/7 7:43:09

嵌入式系统全栈解析:从软硬件协同开发到系统集成与未来趋势

1. 产业全景&#xff1a;嵌入式系统正在重新定义“计算”的边界1.1 重新理解嵌入式系统&#xff1a;它其实无处不在入行这么多年&#xff0c;被问得最多的一句话是&#xff1a;嵌入式系统到底是个什么产业&#xff1f;很多人一听到“嵌入式”三个字&#xff0c;第一反应是单片机…

作者头像 李华