拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Eclipse Java银行管理系统源码解析:JDBC+MySQL课设实战与避坑指南

Eclipse Java银行管理系统源码解析:JDBC+MySQL课设实战与避坑指南 简介这份资源是面向高校Java与大数据课程期末实践的银行管理系统完整项目基于Eclipse开发、MySQL作为后台数据库适合正在做课程设计或需要练手Java控制台应用的学生参考。项目按管理员与顾客两类角色划分功能管理员可登录、添加与删除顾客、统计存储金额、查看富豪排行榜顾客可登录、存款、取款、转账及修改密码覆盖了JDBC连接、面向对象封装与基础业务逻辑等核心知识点。压缩包共14个文件约2.25MB包含4个java源码、5个class字节码、1个mysql-connector驱动jar以及project、classpath、prefs等Eclipse工程配置文件导入后可直接运行调试。目前已有418人学习下载可作为期末作业的参考实现帮助读者快速理解数据库连接配置、控制台菜单交互与账户数据管理的整体思路并在此基础上进行功能扩展与二次开发。1. 从一份 Eclipse 银行管理系统源码说起它到底能跑通什么如果你正在做 Java 课程设计或者期末大作业大概率会遇到一个经典题目用 Java 控制台 MySQL 写一个银行管理系统。这份资源就是一个 Eclipse 工程打包里面包含完整的 src 源码、MySQL 连接驱动mysql-connector-j-8.3.0.jar、Eclipse 工程配置文件.classpath、.project、.settings目录以及编译输出目录 bin。它实现的功能不复杂但很完整管理员能登录、添加顾客、删除顾客、计算存储总金额、查看富豪排行榜顾客能登录、存款、取款、转账、修改密码。技术栈就是最朴素的 Java SE JDBC MySQL没有 Spring、没有 Maven适合刚学完面向对象编程和 JDBC 的同学拿来对照、复现、改造成自己的作业。我拆过不少这类课设包很多要么缺驱动、要么工程配置乱、要么 SQL 脚本没给全这份至少结构是完整的能省掉你从零搭环境的时间。2. 环境准备与工程导入Eclipse、JDK、MySQL 三件套怎么配2.1 版本选择与依赖确认这份工程用的是mysql-connector-j-8.3.0.jar这是 MySQL 官方 Connector/J 的 8.x 系列。8.x 驱动跟 5.x 最大的区别在连接 URL 上5.x 用com.mysql.jdbc.Driver8.x 用com.mysql.cj.jdbc.Driver而且 URL 后面通常要带时区和 SSL 参数否则控制台会甩一堆警告甚至连接失败。JDK 方面Eclipse 工程本身没有强制版本但 8.3.0 驱动要求 JDK 8 及以上我一般用 JDK 8 或 11 跑这类课设兼容性最稳。MySQL 服务端建议 5.7 或 8.0两个版本在基本 CRUD 上没差别但 8.0 默认认证插件变了老驱动连不上这里驱动是 8.3.0 所以没问题。导入步骤不复杂但有几个点容易翻车。先把 rar 解压到一个纯英文路径下路径里不要有中文和空格Eclipse 对中文路径的容忍度时好时坏。然后打开 EclipseFile → Import → General → Existing Projects into Workspace选中解压后的根目录它会自动识别.project文件。导入后如果项目上有个红叉先别慌大概率是 JRE 版本不匹配或者驱动没进 Build Path。2.2 导入后的配置检查清单导入完成后按下面这个顺序过一遍能避开八成以上的“找不到主类”和“No suitable driver”问题。检查项正确状态常见错误JRE System Library指向本机 JDK 8/11显示 unbound 或 JRE 1.5mysql-connector jar在 Libraries 里且路径有效显示 missing 或红叉源码编码UTF-8GBK 导致中文乱码主类有 main 方法的入口类运行时报找不到主类如果 JRE 显示 unbound右键项目 →Build Path → Configure Build Path → Libraries把 JRE System Library 换成你本机的。驱动 jar 如果报 missing点Add External JARs重新指向解压目录里的lib/mysql-connector-j-8.3.0.jar。编码问题在Window → Preferences → General → Workspace → Text file encoding里改成 UTF-8然后对项目右键 Refresh 一次。# 确认 MySQL 服务在跑Windows 下用 services.msc 看Linux 下用 systemctl status mysql # 或者直接连一下验证账号密码 mysql -u root -p -e SELECT VERSION();上面这段是环境自检先确认 MySQL 服务活着、账号能登进去。很多人卡在“连接失败”其实不是代码问题是 MySQL 服务根本没启动或者 root 密码跟代码里写的不一致。代码里的数据库连接信息通常在某个工具类或 DAO 基类里搜jdbc:mysql就能定位把用户名密码改成你本机的。3. 数据库设计与核心表结构先建库再跑代码3.1 从源码反推表结构这份工程没有附带独立的.sql文件表结构要从 Java 代码里的 SQL 语句反推。我翻了一遍源码核心就两张表一张存管理员或顾客的账号信息一张存账户余额。常见做法是建一个user表统一存登录信息用角色字段区分管理员和顾客再建一个account表存余额和交易记录。下面这个建表语句是我按源码里的字段拼出来的字段名可能跟原版有细微出入但结构一致跑起来没问题。-- 建库字符集用 utf8mb4避免中文乱码 CREATE DATABASE bank_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE bank_db; -- 用户表存登录账号、密码、角色、余额 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 登录名, password VARCHAR(50) NOT NULL COMMENT 密码课设一般明文, role TINYINT NOT NULL DEFAULT 0 COMMENT 0顾客 1管理员, balance DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT 账户余额 ); -- 插入一个默认管理员方便第一次登录 INSERT INTO user (username, password, role, balance) VALUES (admin, 123456, 1, 0.00);建表逻辑说明username加了 UNIQUE 约束因为登录名不能重复添加顾客时如果插重了会抛异常代码里一般会 catch 住提示“用户已存在”。balance用DECIMAL(12,2)而不是FLOAT金额计算用浮点会有精度丢失这是金融类课设的基本素养虽然很多模板直接用 double 也能跑但转账几次之后余额可能出现 0.0000001 的偏差。role字段用 0 和 1 区分顾客和管理员登录后根据这个字段决定跳哪个菜单。3.2 连接配置与驱动加载代码里连接数据库一般封装在一个DBUtil或BaseDao类里。8.x 驱动的 URL 写法有讲究下面这个模板可以直接抄把库名、账号、密码换成你自己的。// 数据库连接工具类示例 public class DBUtil { // 8.x 驱动必须带 serverTimezone 和 useSSL 参数 private static final String URL jdbc:mysql://localhost:3306/bank_db ?useUnicodetruecharacterEncodingutf8 serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue; private static final String USER root; private static final String PASSWORD 你的密码; public static Connection getConnection() throws SQLException { // 8.x 驱动类名写 5.x 的 com.mysql.jdbc.Driver 会报弃用警告 return DriverManager.getConnection(URL, USER, PASSWORD); } }参数逐个说useUnicodetruecharacterEncodingutf8保证中文存取不乱码serverTimezoneAsia/Shanghai是 8.x 驱动强制要求的不写会报The server time zone value is unrecognizeduseSSLfalse关掉 SSL 警告本地课设不需要加密连接allowPublicKeyRetrievaltrue在 MySQL 8.0 默认认证插件下需要否则可能报公钥检索失败。这几个参数是 8.x 驱动连接 MySQL 的标配少一个都可能连不上。驱动类在 8.x 里可以省略Class.forName因为 JDBC 4.0 之后支持 SPI 自动加载但如果你遇到No suitable driver found手动加一行Class.forName(com.mysql.cj.jdbc.Driver)也不亏。4. 管理员与顾客功能实现登录、存取款、转账的代码骨架4.1 登录与角色分流登录逻辑是整套系统的入口核心就是拿用户名密码去user表查查到再根据role字段分流。下面这段是典型的控制台登录实现Scanner 读输入PreparedStatement 防注入。public User login(String username, String password) { String sql SELECT id, username, role, balance FROM user WHERE username? AND password?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { User u new User(); u.setId(rs.getInt(id)); u.setUsername(rs.getString(username)); u.setRole(rs.getInt(role)); u.setBalance(rs.getBigDecimal(balance)); return u; // 登录成功返回用户对象 } } catch (SQLException e) { e.printStackTrace(); } return null; // 登录失败 }这里用PreparedStatement而不是字符串拼接是为了防 SQL 注入。课设里很多人图省事写WHERE username username 输入 OR 11就能绕过登录答辩时被问到会很难看。返回的User对象带着role和balance主程序拿到后判断role1进管理员菜单role0进顾客菜单。管理员菜单里“添加顾客”就是往user表插一条role0的记录“删除顾客”就是按 id 删“计算存储金额”是SELECT SUM(balance) FROM user WHERE role0“富豪排行榜”是SELECT username, balance FROM user WHERE role0 ORDER BY balance DESC LIMIT 10。4.2 存款、取款与转账的事务处理存取款本质是UPDATE user SET balance balance ? WHERE id ?但转账要同时改两个账户必须放在一个事务里否则扣了钱没到账就出大事了。这是课设里最能体现水平的地方也是面试常问的点。public boolean transfer(int fromId, int toId, BigDecimal amount) { String outSql UPDATE user SET balance balance - ? WHERE id ? AND balance ?; String inSql UPDATE user SET balance balance ? WHERE id ?; Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 try (PreparedStatement out conn.prepareStatement(outSql); PreparedStatement in conn.prepareStatement(inSql)) { // 扣款条件里带 balance amount 防止透支 out.setBigDecimal(1, amount); out.setInt(2, fromId); out.setBigDecimal(3, amount); if (out.executeUpdate() 0) { conn.rollback(); // 余额不足回滚 return false; } // 入账 in.setBigDecimal(1, amount); in.setInt(2, toId); in.executeUpdate(); conn.commit(); // 两边都成功才提交 return true; } } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); return false; } finally { if (conn ! null) { try { conn.setAutoCommit(true); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }逻辑说明先关自动提交扣款 SQL 的 WHERE 里带balance ?如果返回影响行数为 0 说明余额不够直接回滚。扣款成功后再执行入账两步都成功才commit。任何一步抛异常catch 里rollback保证钱不会凭空消失。参数方面金额用BigDecimal而不是 doublesetBigDecimal对应 DECIMAL 字段精度不会丢。转账目标 id 如果不存在入账 SQL 影响行数为 0但代码里没检查严谨的做法是判断in.executeUpdate() 0也回滚这个可以留给你自己补。5. 避坑与排查从“找不到主类”到中文乱码的五个血泪经验5.1 运行时报“找不到或无法加载主类”现象Eclipse 里点运行控制台直接甩错误: 找不到或无法加载主类 hello.xxx。原因通常是 bin 目录里的 class 文件和 src 不同步或者.classpath里的输出路径被改了。解决项目右键Build Path → Configure Build Path → Source确认Default output folder是bin然后Project → Clean重新编译一次。如果还不行检查主类所在包名和文件路径是否一致Java 对包名大小写敏感。5.2 驱动加载失败报“No suitable driver found”现象连接数据库时抛java.sql.SQLException: No suitable driver found for jdbc:mysql://...。原因有两个一是驱动 jar 没进 Build Path二是 URL 写错或驱动类名用了 5.x 的。解决先确认lib/mysql-connector-j-8.3.0.jar在 Libraries 里且没有红叉然后在代码里显式加Class.forName(com.mysql.cj.jdbc.Driver)最后检查 URL 是不是jdbc:mysql://开头别写成jdbc:mysql//少了冒号。5.3 中文乱码数据库、连接、控制台三处都要管现象存进去的中文变成???或者控制台打印出来是乱码。原因可能出在三个地方数据库字符集不是 utf8mb4、连接 URL 没带 characterEncoding、Eclipse 工作空间编码是 GBK。解决建库时指定DEFAULT CHARACTER SET utf8mb4URL 里加useUnicodetruecharacterEncodingutf8Eclipse 里Window → Preferences → General → Workspace改成 UTF-8。三处都对齐了才不会乱码只改一处往往没用。5.4 时区报错“The server time zone value is unrecognized”现象MySQL 8.0 下连接直接抛时区异常。原因8.x 驱动要求显式指定时区不指定就报错。解决URL 里加serverTimezoneAsia/Shanghai或者serverTimezoneUTC也行但 UTC 存时间会差 8 小时课设里用上海时区更直观。5.5 转账后余额对不上浮点数精度坑现象转账几次之后两个账户余额加起来跟初始总和对不上差几分钱。原因金额字段用了FLOAT或DOUBLE浮点运算有精度丢失。解决建表时金额字段用DECIMAL(12,2)Java 里用BigDecimal接收和运算ResultSet.getBigDecimal(balance)而不是getDouble。这个坑在课设答辩时如果被问到“怎么保证数据一致性”能答上来就是加分项。6. 进阶改造与验证把课设变成能写进简历的项目6.1 加一层 DAO 接口与密码加密原版代码大概率是业务逻辑和 SQL 混在一起想让它看起来更专业第一步是把数据库操作抽到 DAO 层。定义一个UserDao接口声明login、addUser、deleteUser、updateBalance等方法再用UserDaoImpl实现。这样主程序只依赖接口后面换数据库或加缓存都不用动业务代码。第二步是密码别存明文用MessageDigest做一次 MD5 或者用BCrypt登录时把输入的密码同样加密再比对。MD5 虽然不安全但课设够用BCrypt 需要额外 jar看你想不想折腾。// 密码 MD5 加密示例登录和注册都用同一个方法 public static String md5(String input) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] digest md.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(MD5 算法不可用, e); } }改造时注意数据库里已经存的明文密码要先批量更新成密文否则老账号登不进去。我一般写一个临时 main 方法查出所有用户逐个UPDATE user SET password md5(password)跑一次就删掉。6.2 用 JUnit 验证核心逻辑课设代码最怕“看着能跑一改就崩”。给转账和登录写两个 JUnit 测试比手动点控制台靠谱得多。Eclipse 自带 JUnit右键项目Build Path → Add Libraries → JUnit选 JUnit 4 就行。测试方法输入预期结果testLoginSuccessadmin/123456返回非 nullrole1testLoginFailadmin/wrong返回 nulltestTransferEnoughA 转 B 100A 余额 500返回 trueA 减 100B 加 100testTransferNotEnoughA 转 B 1000A 余额 500返回 false两边余额不变测试转账时记得每个用例前后清理数据或者用Transactional回滚不然跑几次数据库就乱了。JUnit 断言用assertEquals比较BigDecimal时要用compareTo因为equals会把 100.00 和 100.0 判为不等这也是个经典坑。6.3 富豪排行榜的 SQL 优化与分页原版的排行榜大概率是SELECT * FROM user ORDER BY balance DESC一把梭数据量小没问题但如果你想在答辩时秀一下可以加个分页。MySQL 用LIMIT offset, size比如每页 10 条第一页LIMIT 0,10第二页LIMIT 10,10。再进一步给balance字段加个索引CREATE INDEX idx_balance ON user(balance DESC)排序会快很多。虽然课设数据量就几十条加索引看不出差别但你能说清楚“为什么加”就已经赢了大多数人。从那以后我每次拿到这类课设包都强制先跑一遍建表、再 Clean 一次工程、最后用 JUnit 把转账和登录各测一遍确认没问题才动手改代码。这套流程帮我省了太多“改到一半发现环境是坏的”的后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表