ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java毕业设计记事本小程序:从数据库设计到部署避坑全解析

Java毕业设计记事本小程序:从数据库设计到部署避坑全解析 简介这套记事本程序毕业设计资源面向计算机相关专业学生的课程设计与毕业设计参考也适合初学者学习常见桌面小工具的开发流程。压缩包内主要包含论文文档、前后台项目源码、数据库脚本以及项目截图整体约49.19MB。其中论文文档可用于编写毕业设计说明书前后台项目源码覆盖界面交互与业务逻辑数据库脚本提供建表与初始数据项目截图方便快速查看系统运行效果。目前已有241人学习下载说明其对同类项目有一定借鉴意义。借助这份资料读者可以快速熟悉多功能记事本的需求分析、界面设计、功能实现与数据持久化方法特别是前后台交互和数据库表设计部分对完成类似管理型小程序或毕业设计项目有直接帮助。1. 记事本小程序设计一个Java前后台毕业设计项目的完整拆解看到“记事本小程序”这几个字我猜大多数人第一反应是Windows自带的那个写字板或者是微信小程序。实际上这两者都不是——这份资源里的“小程序”指的是一个做了前后台分离的Java Web管理系统功能上对标的是有道云笔记的精简版用户注册登录、笔记分类管理、新增编辑删除、关键字搜索。换句话说它是把“记事”这件事完整地搬进了B/S架构里数据落在MySQL页面由JSP渲染后台用Servlet处理请求。对于正在做毕业设计、需要一套能跑通全文的Java Web项目的人来说这份资源的价值在于“全”——论文、源码、数据库脚本、截图四件套齐了可以直接从零复现到答辩演示。接下来我按自己的拆项目习惯从数据库设计讲起一路把部署、踩坑和扩展做完。2. 多功能记事本架构拆解数据表设计与Java后台分层的落地链路2.1 数据库设计先行三张核心表撑起整个记事系统我拆这类Java Web毕业设计项目第一步永远是先看数据库脚本因为数据表结构直接决定了功能的边界。打开这份资源里的SQL文件你会发现它没有把表设计得特别复杂核心就是三张表用户表、分类表、笔记表。用户表存登录账号分类表存笔记归类笔记表记标题和正文三者通过外键关联。这个设计很贴合毕业设计场景——既体现了表关联的设计能力又不至于像企业级系统那样动辄几十张表写论文时也好解释。CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, user_id INT NOT NULL, FOREIGN KEY (user_id) REFERENCES t_user(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_note ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, category_id INT, user_id INT NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES t_category(id), FOREIGN KEY (user_id) REFERENCES t_user(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这段建表SQL有三个关键点值得注意。第一密码字段用了VARCHAR(64)这是为哈希加密预留的长度——如果项目里用的MD5或者SHA-25632位或64位都能装下比VARCHAR(20)稳妥得多。第二所有表强制指定了utf8mb4字符集这是防止中文乱码的第一道防线比在JDBC连接串里加参数更根治。第三create_time用了DEFAULT CURRENT_TIMESTAMP插入记录时不需要手动塞时间MySQL会自动补。我见过不少同学在Java代码里用new Date()往数据库塞时间其实不如直接在表结构里解决来得干脆。2.2 Java后台三层结构Servlet接收请求、Service处理业务、DAO操作数据库看完了表结构再来看后台代码这套项目走的是最经典的JSP Servlet JDBC三层路线。我之所以说它适合毕业设计是因为每一层的职责划分得非常清楚JSP只负责展示和收集表单数据Servlet只做参数接收和转发控制DAO负责和MySQL打交道中间夹一层Service处理登录校验之类的业务逻辑。这种结构在答辩论上很好讲评委问“你的分层思想是什么”照着代码就能答出来。拿“新增笔记”这条链路来说前端表单提交后请求会先到NoteServlet的doPost方法里Servlet做两件事把表单字段取出来封装成Note对象调用Service层的addNote方法。真正执行INSERT语句的是DAO层的代码。以DAO层为例核心逻辑是这样的public int addNote(Note note) throws SQLException { String sql INSERT INTO t_note (title, content, category_id, user_id) VALUES (?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, note.getTitle()); ps.setString(2, note.getContent()); ps.setInt(3, note.getCategoryId()); ps.setInt(4, note.getUserId()); return ps.executeUpdate(); } }这段代码里有几个细节值得细看。PreparedStatement的?占位符形式是必须的不要在Java里拼字符串SQL那会留下SQL注入的隐患——用setString、setInt把参数传进去既安全又省去了给字符串加引号的麻烦。try-with-resources写法让Connection和PreparedStatement在方法结束时自动关闭不会出现连接泄漏。DBUtil.getConnection()通常是一个工具类里的静态方法从配置文件读取数据库地址和账号密码这一点后面部署的时候还需要再确认配置文件里的参数是否匹配你的环境。Servlet层的写法也很直白。doPost里先设置request.setCharacterEncoding(UTF-8)否则表单提交的中文在后台取出来就是乱码这一步是Java Web中文问题的高发区后面避坑章节我会专门展开。2.3 前台页面与后台联动JSP渲染与表单提交的完整链路前台页面这块项目里包含登录页、注册页、笔记列表页、笔记编辑页四个主要界面。登录成功之后Session里会存上userId列表页根据这个userId去查当前用户的所有笔记。实际使用中每一页的功能对应关系非常清楚页面核心功能对应Servlet关键参数login.jsp用户登录UserServlet?actionloginusername, passwordregister.jsp用户注册UserServlet?actionregisterusername, passwordnoteList.jsp笔记列表与搜索NoteServlet?actionlistuserId, keywordnoteEdit.jsp新增/修改笔记NoteServlet?actionaddOrUpdatetitle, content, categoryId前端里用了不少JSTL标签比如c:forEach来循环渲染笔记列表这种方式比在Java代码里拼HTML字符串干净得多也是答辩时能加分的设计。我在实拆的时候注意到列表页里的“删除”按钮走的是GET请求直接把id拼在URL里——这在功能演示上没问题但如果要往工程化的方向走应该改成POST或者加一个确认弹窗避免手滑点到删除。这个点也可以作为论文里“不足与改进”章节的素材。3. 从导入到跑通Tomcat部署与数据库初始化的完整步骤3.1 环境准备JDK、Tomcat、MySQL的版本搭配这套项目是标准的Java Web老组合对环境版本有一定要求但不高。我实际用的是JDK 8 Tomcat 8.5 MySQL 5.7的组合这是最稳妥的搭配。MySQL 8虽然也能跑但驱动和时区会有一些额外要处理的问题后面会专门说明。IDEA建议用2020版本以上社区版就行不需要破解旗舰版。下载解压资源包之后先确认zip里有没有自带数据库驱动JAR。很多毕业设计资源会把mysql-connector-java的JAR包放在WEB-INF/lib下面如果有直接复用如果没有去Maven仓库下载对应版本的驱动。判断驱动版本和MySQL版本是否匹配有一个简单规律MySQL 5.7配5.x驱动MySQL 8配8.x驱动混用会出现“Public Key Retrieval is not allowed”之类的玄学报错。3.2 导入源码与数据库初始化最关键的十分钟这个环节是翻车率最高的地方我用一套固定顺序操作每一步都验证通过再走下一步。先把zip解压到一个不带空格的路径比如D:\notebook-project避免Tomcat路径解析出问题。在IDEA里用Open方式选择解压后的文件夹等待Maven或依赖索引构建完成。然后处理数据库初始化——这一步必须用命令行或者Navicat执行SQL脚本不能直接在IDEA里跑。mysql -u root -p db_notebook.sql执行完这个命令之后查一下表是不是真的建出来了。我见过不少人执行完SQL直接去启动Tomcat结果登录时报“Table db_notebook.t_user doesnt exist”回头才发现是SQL文件里有USE语句指向了别的库名。接下来修改数据库连接配置。项目里一般是一个properties文件放在src目录下内容大概是这样的jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/db_notebook?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456改的时候只改密码和库名连接串里的characterEncodingutf8不要动这是中文不乱码的底牌。serverTimezoneAsia/Shanghai是给高版本驱动用的MySQL 5.7用不到但加上也不报错干脆留着。改完配置在IDEA里配置TomcatRun → Edit Configurations → 选择Tomcat Server → LocalDeployment里添加ArtifactApplication Context建议填/notebook访问路径就变成http://localhost:8080/notebook。3.3 验证功能从注册到完成一次完整记事流程启动Tomcat之后不要急着点“登录”按顺序走一遍完整功能验证确认系统是真的通了。打开浏览器访问登录页先注册一个新账号密码设一个简单的就行比如admin/123456——这个流程能验证注册页到数据库这条链路是否通。注册成功后会跳回登录页用刚注册的账号登录进到主界面后点“新增笔记”标题写“测试”正文写几行中文保存。然后回到列表页看这条笔记能不能显示、中文有没有乱码。接着编辑这条笔记改标题保存确认update_time有变化。最后删掉这条测试数据让数据库保持干净。如果上面的流程走通这套项目的基本盘就是好的。我一般会把系统里的所有菜单点一遍尤其是退出登录再重新登录的流程因为Session失效处理是最容易被忽略的环节。4. 部署与二次开发避坑四个高发问题的排查思路4.1 中文乱码表单提交和页面显示全是问号现象注册新用户时输入中文昵称保存后在列表页显示为“???”笔记正文的标点符号也变成了奇怪的字符。原因这个问题通常不是一处坏了而是三个环节至少有两处没配对。浏览器提交表单时如果没有request.setCharacterEncoding(UTF-8)Tomcat默认按ISO-8859-1解码数据库表的字符集不是utf8mb4JSP页面头部的contentType没写charsetUTF-8。三处只要有一处是旧的中文就必然会翻车。解决先把JSP页面头部的% page contentTypetext/html;charsetUTF-8 %确认一遍再在Servlet的doPost方法最前面加上request.setCharacterEncoding(UTF-8)最后确认建表SQL里写了DEFAULT CHARSETutf8mb4。三步做完重启Tomcat再测中文基本不会再出问题。如果还有问题检查IDEA右下角文件编码是不是UTF-8。4.2 MySQL连接报错Access denied for user现象Tomcat启动日志里出现“Access denied for user rootlocalhost (using password: YES)”页面直接500。原因这个报错反复出现的根源有两个一是properties文件里密码和本地MySQL实际密码不一致二是连接串写了useSSLtrue但MySQL服务端没开SSL。第一种情况多发生在资源包里写的是作者本机的密码第二种是驱动版本和MySQL配置的兼容性问题。解决修改jdbc.properties里的密码为本地实际密码连接串改为jdbc:mysql://localhost:3306/db_notebook?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai。useSSLfalse直接关掉SSL校验省去证书配置的麻烦。改完配置文件一定要重启Tomcatproperties文件不像Java代码那样会被热部署自动生效。4.3 启动后404访问页面找不到资源现象Tomcat正常启动日志没有任何报错但浏览器访问项目路径时显示404。原因绝大多数情况是Artifact部署名称不对。IDEA里配置Tomcat时Application Context默认是/项目名_war_exploded这串名字太长还带下划线手一抖敲错一个字母就404。另一个可能是Tomcat的webapps目录和IDEA的部署目录不是同一个导致Servlet注解没被扫描到。解决确认Deployment里的Application Context为/notebook访问http://localhost:8080/notebook/login.jsp试一次。如果IDEA用的是External Tomcat检查CATALINA_BASE环境变量是否指向了实际安装目录。我习惯把Tomcat的配置交给IDEA托管也就是使用Tomcat Home指向安装目录其余按默认这种模式翻车率最低。4.4 时间字段显示不对差了8个小时或者显示为null现象笔记列表页里的创建时间比实际时间少了整整8个小时或者新插入的笔记时间一栏是空的。原因少了8小时是典型的时区问题——驱动把MySQL的UTC时间按本地时区解析了连接串没有指定serverTimezone。显示为null则是因为Java代码里用new Date()赋值给实体类但实体类的time属性类型是java.sql.Date而表结构已经由数据库自动填充了时间Java端又传了一个值进去发生了冲突。解决连接串固定带上serverTimezoneAsia/Shanghai这个参数对MySQL 5.7无害对MySQL 8是必需的。实体类里的createTime字段改成java.util.Date类型同时检查insert语句是不是包含了create_time列——如果数据库表已经设置了DEFAULT CURRENT_TIMESTAMPSQL里就别再自己塞时间值了。5. 进阶技巧给记事本系统扩展按内容搜索与批量导入5.1 把关键字搜索从标题扩展到正文内容原项目的搜索条件通常只查标题字段用LIKE %keyword%匹配。这个够用但实际演示的时候老师很可能问一句“能不能按内容搜”。扩展思路很简单把SQL的WHERE条件从title LIKE改成一个组合条件String sql SELECT * FROM t_note WHERE user_id ? AND (title LIKE ? OR content LIKE ?); PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, userId); ps.setString(2, % keyword %); ps.setString(3, % keyword %);参数说明keyword是前台页面搜索框传来的字符串前后加%实现模糊匹配。把这两个参数分别绑定到title和content上搜索范围就扩展到了全文。这里有一个小坑要注意LIKE匹配的%要写在setString的参数里不能拼在SQL里否则用户输入一个%号会把全表都查出来。如果想做得更好的话可以把查出来的结果按update_time倒序排列——因为用户搜的时候更关心最近改过的笔记SQL最后面加一个ORDER BY update_time DESC就行。5.2 批量导入笔记的辅助方法第二个实用的扩展是批量导入。演示场景可以设计成准备一个CSV文件把多行笔记一次性导入。我一般用Java的原生IO做这件事因为毕业设计系统里没必要引入POI那套重依赖。代码核心逻辑是逐行读取文件按逗号切分标题和正文然后循环调用addNote方法。BufferedReader reader new BufferedReader(new InputStreamReader( new FileInputStream(uploadFile), StandardCharsets.UTF_8)); String line; while ((line reader.readLine()) ! null) { String[] parts line.split(,, 2); if (parts.length 2) continue; Note note new Note(); note.setTitle(parts[0].trim()); note.setContent(parts[1].trim()); note.setUserId(currentUserId); note.setCategoryId(defaultCategoryId); noteService.addNote(note); }参数说明split(,, 2)的第二个参数2很关键它表示只按第一个逗号切一刀剩余的字符串全部归到正文——这样正文里即使还有逗号也不会被错误地切分。uploadFile是前端上传的表单文件currentUserId从Session里取值。注意读取文件流时禁用了平台默认编码而显式指定UTF-8否则在Windows中文环境下读CSV会乱码。循环里每读一行就插入一条建议每100条打印一次日志方便观察导入进度。这套扩展做完之后我一般会做一轮回归测试先用旧数据跑一遍原系统功能确认没改坏再测新增的全文搜索和导入。从那以后我每次拆这类Java Web毕业设计项目都强制走一遍“解压确认表结构→改连接配置→启动→用完整流程验证→再做扩展”的顺序宁可慢十分钟也不因为跳步浪费时间排错。希望帮到你。本文还有配套的精品资源点击获取
返回列表