
简介基于 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 WorkspaceIDEA 选择 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.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/blog_db?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456你需要核对三个地方一是jdbc.url里的数据库名blog_db是否和你建库时一致二是jdbc.username和jdbc.password是否对应当前 MySQL 的账号三是如果你的 MySQL 是 8.0jdbc.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 BYSELECT 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 11甚至能直接登录后台。再说事务。评论接口通常要同时做两件事插入一条评论记录、更新文章的评论数或最后评论时间。这两步要么都成功要么都失败否则就会出现评论写了但文章统计没变的脏数据。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.javapublic 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里注册 Filterfilter filter-nameLoginFilter/filter-name filter-classcom.blog.filter.LoginFilter/filter-class /filter filter-mapping filter-nameLoginFilter/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 连接串没指定characterEncodingutf8。解决先执行ALTER DATABASE blog_db CHARACTER SET utf8mb4;再修改表。最彻底的办法是删库重导脚本建库时直接写DEFAULT CHARACTER SET utf8mb4。连接串那侧的characterEncodingutf8也必须保留否则页面输出还是乱码。坑二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 rootlocalhost 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 鉴权这些底层思路依然通用。希望帮到你也希望你的博客系统能顺利通过答辩。本文还有配套的精品资源点击获取