
简介这是一套面向高校计算机专业毕业设计场景的Java个人日记本系统完整项目包适合正在准备毕设、需要参考真实项目结构与开发流程的学生也可作为Java Web入门后的综合练手案例。压缩包共4个文件约53MB包含1个源代码压缩包、1个SQL数据库脚本和2个MP4视频分别对应项目源码、数据库初始化与部署演示。系统后端可能采用Spring Boot、Servlet等框架结合MVC模式组织业务逻辑前端使用HTML、CSS与JavaScript构建界面数据库涵盖用户表、日记表等核心结构并可能借助MyBatis或Hibernate完成持久化操作。部署视频则演示环境配置、项目导入、数据库连接与功能测试的完整过程。目前已有1556人学习下载读者可从中获取可运行的源码、建库脚本、部署录屏以及异常处理与代码组织思路对理解Web开发全流程和完成毕业设计具有较高参考价值。1. 个人日记本系统毕设从一堆源码里拆出能跑通的最小闭环很多同学拿到「基于 Java 的个人日记本系统毕业设计」这个题目时第一反应是去搜现成的压缩包解压、导入、点运行然后卡在数据库连不上、Tomcat 起不来、页面 404 上。我带过几届学生的毕设答辩见过太多人把源码当黑匣子结果老师一问「你的日记加密怎么做的」「分页查询 SQL 写在哪」就答不上来。这篇笔记不讲空话就按一个真实可交付的路径把 Java 个人日记本系统从环境搭建、数据库设计、核心功能实现到部署录屏的完整链路拆开。适合正在做计算机毕业设计、软件工程毕设选题的同学也适合想拿一个 CRUD 项目练手 Java Web 的初学者。读完你能自己判断这套源码值不值得改、数据库该怎么建、部署视频里哪些步骤是坑。2. 环境与选型为什么这套毕设绕不开 JDK MySQL Tomcat2.1 先确认你拿到的是什么技术栈市面上叫「个人日记本系统」的毕设源码主流分两种一种是纯 Java SE 带 Swing 界面的桌面版另一种是 Java Web 带浏览器访问的版本。从热搜词里「java server pages」「数据库增删改查」「java环境变量配置」这些信号看绝大多数毕设交付的是 JSP Servlet MySQL 的 Web 版本少数用 SSMSpring SpringMVC MyBatis或 Spring Boot。你解压后先看目录结构如果有WEB-INF、web.xml、index.jsp那就是传统 Java Web如果有pom.xml且启动类带SpringBootApplication那是 Spring Boot 版本。这一步决定了你后面装什么、怎么部署别急着双击运行。我一般会让学生先做一件事把压缩包里的README或部署说明.txt找出来没有的话就看lib文件夹里的 jar 包名字。看到mysql-connector-java说明连 MySQL看到servlet-api说明是 Servlet 容器跑。确认技术栈之后再对照下面这张表准备环境。组件传统 JSP/Servlet 版本Spring Boot 版本备注JDK1.8 或 111.8 或 17看源码编译级别别乱升数据库MySQL 5.7 / 8.0MySQL 5.7 / 8.08.0 要改驱动类名服务器Tomcat 8.5 / 9.0内置 Tomcat传统版必须外置构建工具手动导 jar 或 MavenMaven看有没有 pom.xmlIDEEclipse / IDEAIDEA社区版够用选型理由很直接毕设答辩老师通常只关心功能跑没跑通、数据库设计合不合理不会要求你用最新技术。JDK 8 加 MySQL 5.7 是翻车率最低的组合网上教程最多遇到报错一搜就有答案。如果你非要用 JDK 17 配老版本 Spring光模块化访问限制就能耗掉两天。2.2 数据库建库建表的最小操作拿到源码后先找.sql文件。通常在db、sql或database文件夹里。用 Navicat 或命令行导入之前先看一眼建库语句的字符集。血泪经验很多毕设 SQL 文件用的是utf8而不是utf8mb4存中文日记没问题但一旦日记里带 emoji 就会报错。如果你不打算支持 emoji保持原样最省事。-- 常见个人日记本系统的核心表结构字段名以实际源码为准 CREATE DATABASE diary_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE diary_db; -- 用户表毕设一般不做复杂权限role 字段可能都没有 CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, nickname VARCHAR(50), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 日记表核心中的核心注意 user_id 外键和分类字段 CREATE TABLE t_diary ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, title VARCHAR(200) NOT NULL, content TEXT, mood VARCHAR(20), weather VARCHAR(20), category_id INT, is_private TINYINT DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES t_user(id) ); -- 分类表有些版本直接写死在代码里没有这张表 CREATE TABLE t_category ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, name VARCHAR(50) NOT NULL );上面这段 SQL 的逻辑说明t_user存账号密码t_diary是主表user_id关联用户实现数据隔离is_private控制私密日记是否公开。参数上要注意content用TEXT而不是VARCHAR因为日记正文可能很长create_time和update_time用数据库默认值省去 Java 代码里手动 set 的麻烦。如果你的源码 SQL 文件里表名是user、diary这种记得在 MySQL 8.0 里user是保留字要么加反引号要么改表名否则建表直接失败。导入完成后执行SHOW TABLES;确认表都在。然后去源码里找数据库连接配置传统项目一般在src/db.properties或c3p0-config.xmlSpring Boot 在application.yml。把用户名密码改成你本地的这一步不改后面所有报错都从这里来。3. 核心功能落地登录、日记增删改查、分页搜索怎么写3.1 登录与 Session 保持别把密码明文存进去个人日记本系统的登录逻辑简单但毕设答辩常被问「密码安全怎么考虑」。常见做法是 MD5 加盐源码里如果直接WHERE username? AND password?明文比对你可以在答辩前改成 MD5工作量不大但能加分。// 登录 Servlet 核心逻辑传统 JSP 项目写法 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); // 如果数据库存的是 MD5这里要先加密再比对 // String md5Pwd DigestUtils.md5Hex(password diary_salt); UserDao userDao new UserDao(); User user userDao.login(username, password); if (user ! null) { // 登录成功把用户对象放进 Session request.getSession().setAttribute(currentUser, user); response.sendRedirect(diary?actionlist); } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } }逻辑说明先取表单参数调用 DAO 层查询查到就把User对象塞进HttpSession后续所有日记操作都从 Session 里取user_id保证每个用户只能看到自己的日记。参数上注意sendRedirect和forward的区别登录成功用重定向防止刷新重复提交失败用转发保留错误提示。如果你的源码用request.getSession().setAttribute(user, user)字段名不一致会导致后面取不到统一改成一样的。3.2 日记增删改查的 DAO 层与分页 SQL日记的增删改查是毕设工作量的大头也是数据库课程设计常考的点。核心在 DAO 层写 SQLServlet 只负责收参数和跳页面。下面是一个带分页的查询示例热搜词里「数据库增删改查」说的就是这个。// DiaryDao 分页查询page 从 1 开始pageSize 每页条数 public ListDiary findByPage(int userId, int page, int pageSize) { ListDiary list new ArrayList(); // 关键LIMIT 第一个参数是偏移量公式 (page-1)*pageSize String sql SELECT * FROM t_diary WHERE user_id ? ORDER BY create_time DESC LIMIT ?, ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, userId); ps.setInt(2, (page - 1) * pageSize); ps.setInt(3, pageSize); ResultSet rs ps.executeQuery(); while (rs.next()) { Diary d new Diary(); d.setId(rs.getInt(id)); d.setTitle(rs.getString(title)); d.setContent(rs.getString(content)); d.setCreateTime(rs.getTimestamp(create_time)); list.add(d); } } catch (SQLException e) { e.printStackTrace(); } return list; }逻辑说明LIMIT ?, ?是 MySQL 分页的标准写法第一个问号是跳过多少条第二个是取多少条。参数上pageSize一般设 10毕设演示够用。注意ORDER BY create_time DESC让最新日记排前面符合使用习惯。如果你的源码用rownum或子查询分页那是 Oracle 写法MySQL 里跑不通直接换成 LIMIT。搜索功能通常是在这个 SQL 上加AND title LIKE ?参数传% keyword %。这里有个坑LIKE 以%开头会导致索引失效但毕设数据量小无所谓答辩老师也不会追问索引优化。3.3 前端 JSP 页面与表单提交的对应关系JSP 页面负责展示和收集数据重点是表单name属性和后端getParameter的字符串必须完全一致。常见翻车是前端写namediaryTitle后端取request.getParameter(title)结果永远是 null。!-- diary_edit.jsp 日记编辑页核心表单 -- form actiondiary methodpost input typehidden nameaction valuesave input typehidden nameid value${diary.id} input typetext nametitle value${diary.title} required textarea namecontent rows10${diary.content}/textarea select namemood option value开心开心/option option value平静平静/option option value难过难过/option /select button typesubmit保存/button /form逻辑说明隐藏域actionsave告诉 Servlet 这是保存操作id为空是新增有值是修改。参数上required是 HTML5 校验减少后端空值判断。如果你的源码用 AJAX 提交那form的action就不重要了看 JavaScript 里的url配置。4. 部署与录屏把项目跑起来并留下能交差的视频4.1 Tomcat 部署传统 Web 项目的完整命令传统 JSP 项目部署到 Tomcat最稳的方式是打 WAR 包丢进webapps。如果你在 IDEA 里配了 Artifact直接 Build 就行。命令行方式如下# 假设项目目录为 diary-systemTomcat 安装在 /opt/tomcat cd diary-system # 用 Maven 打包没有 pom.xml 就跳过这步直接复制整个项目 mvn clean package -DskipTests # 把生成的 war 复制到 Tomcat cp target/diary.war /opt/tomcat/webapps/ # 启动 Tomcat /opt/tomcat/bin/startup.sh # 查看日志确认启动成功 tail -f /opt/tomcat/logs/catalina.out逻辑说明mvn package会编译并打包-DskipTests跳过测试节省时间。复制到webapps后 Tomcat 会自动解压部署。参数上注意 WAR 包名字决定访问路径diary.war对应http://localhost:8080/diary。如果日志里出现ClassNotFoundException: com.mysql.jdbc.Driver说明 MySQL 驱动 jar 没放进WEB-INF/lib手动拷进去重启。4.2 部署视频该录哪些内容才不返工毕设要求交部署视频很多同学录了一遍发现漏了步骤又重录。我一般会按这个顺序录先展示解压后的目录结构再打开数据库工具导入 SQL 并SELECT验证然后配置数据库连接文件接着启动 Tomcat 并展示日志无报错最后浏览器访问登录、发一篇日记、删除、搜索。全程 8 到 10 分钟一次过。注意录屏时把命令行字体调大老师看的是你能不能独立部署不是看你打字快。提示录屏前把浏览器缓存清掉避免旧 Session 导致直接跳进主页看起来像没登录就进去了。5. 避坑与排查毕设跑不起来时先查这 5 个地方5.1 数据库连不上Access denied 与驱动类名现象启动报Access denied for user rootlocalhost。原因db.properties里的密码和你本地 MySQL 密码不一致或者 MySQL 8.0 用了caching_sha2_password插件而老驱动不认。解决先命令行mysql -uroot -p确认密码改配置文件如果是驱动问题把com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.DriverURL 加?serverTimezoneAsia/ShanghaiuseSSLfalse。5.2 页面 404WAR 包名与访问路径不匹配现象Tomcat 启动成功访问http://localhost:8080/显示 Tomcat 首页加项目名就 404。原因WAR 包名和你在浏览器里输的路径不一致或者web.xml里url-pattern配错。解决看webapps下解压出来的文件夹名那就是路径检查web.xml的servlet-mapping是否和表单action对应。5.3 中文乱码三处编码要统一现象日记标题存进数据库变成问号或者页面显示乱码。原因JSP 页面pageEncoding、数据库连接 URLcharacterEncoding、Tomcatserver.xml的URIEncoding三处不统一。解决JSP 顶部加% page contentTypetext/html;charsetUTF-8 %URL 加characterEncodingutf8Tomcat 连接器加URIEncodingUTF-8。5.4 分页点击没反应page 参数没传或 SQL 写死现象点下一页 URL 变了但内容不变。原因前端链接没带page参数或者 DAO 里 SQL 写死了LIMIT 0,10。解决检查 JSP 分页链接hrefdiary?actionlistpage${page1}再确认 DAO 用的是动态参数而不是常量。5.5 部署视频里 Tomcat 闪退JAVA_HOME 没配好现象双击startup.bat窗口一闪而过。原因系统环境变量JAVA_HOME没指向 JDK 安装目录或者指向了 JRE。解决echo %JAVA_HOME%确认路径必须是 JDK 根目录不是bin也不是 JRE。配完重启命令行再启动。6. 进阶技巧用 MD5 加盐和日志切面给毕设加两分如果你已经把基础功能跑通答辩想拿良好以上可以在两个地方做小升级。第一个是密码存储改成 MD5 加盐代码量不到二十行但能体现安全意识。第二个是给 DAO 层加一个简单的日志切面记录每次数据库操作耗时答辩时展示「系统可观测性」这个概念老师会觉得你有工程思维。// MD5 加盐工具类盐值写死或从配置读 public class PasswordUtil { private static final String SALT diary_2024; public static String encrypt(String password) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest((password SALT).getBytes(StandardCharsets.UTF_8)); StringBuilder sb new StringBuilder(); for (byte b : bytes) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(MD5 算法不可用, e); } } }逻辑说明注册时调encrypt存密文登录时把输入的密码同样加密再比对。参数上SALT每个用户最好不同但毕设统一盐值也够用。注意 MD5 本身不安全答辩时主动说「生产环境应该用 BCrypt」反而显得你清楚边界。日志切面用 Spring AOP 实现传统项目可以手动在 DAO 方法首尾加System.currentTimeMillis()打印耗时。我一般会让学生在DiaryDao的findByPage里加一行long start System.currentTimeMillis();方法返回前打印耗时: (end-start) ms。这样演示搜索功能时控制台能看到每次查询花了多久比干巴巴点页面有说服力。最后一个习惯每次改完代码先mvn clean再重新部署别依赖热部署。我见过太多人改了 JSP 没生效折腾半小时才发现是 Tomcat 缓存了旧编译结果。把work目录删掉重启比什么都管用。希望帮到你。本文还有配套的精品资源点击获取