
简介这份资源是面向高校Java与大数据课程期末实践的银行管理系统完整项目基于Eclipse开发、MySQL作为后台数据库适合正在准备课程设计或需要巩固Java控制台编程与JDBC数据库操作的学生参考。项目通过控制台交互实现管理员与顾客两类角色管理员可完成登录、添加与删除顾客、统计存储金额、查看富豪排行榜等操作顾客则支持登录、存款、取款、转账、修改密码等功能覆盖了面向对象设计、集合处理与数据库连接等核心知识点。压缩包共14个文件约2.25MB包含java源码、编译后的class文件、Eclipse工程配置project、classpath、prefs以及MySQL连接驱动jar包结构完整导入后即可运行调试。目前已有418人学习下载可作为期末大作业的参考方案帮助读者快速理解银行管理系统的功能划分与实现思路并在此基础上进行二次开发与功能扩展。1. 从一份 Eclipse 银行管理系统源码说起它到底能跑通什么很多同学做 Java 课程设计时最头疼的不是写不出增删改查而是环境搭不起来、数据库连不上、导入 Eclipse 后一堆红叉。这份「银行管理系统」压缩包恰好是一个能直接落地的参考样本Eclipse 工程结构完整带lib/mysql-connector-j-8.3.0.jar驱动用 MySQL 做后台数据控制台交互实现管理员和顾客两套角色。管理员能登录、添加顾客、删除顾客、计算存储金额、看富豪排行榜顾客能登录、存款、取款、转账、改密码。它适合正在做 Java 期末大作业、想找一个能跑通的控制台项目对照学习的同学也适合刚接触 JDBC 和 Eclipse 工程配置、需要一份真实工程目录来理解.classpath、.project、module-info.java这些文件到底干什么用的开发者。下面我按「拿到压缩包之后怎么一步步跑起来」的顺序拆顺带把几个容易翻车的地方讲透。2. 工程结构与运行环境先看清 Eclipse 工程里有什么2.1 压缩包解压后的目录到底长什么样把银行管理系统.rar解压后你会看到一个典型的 Eclipse Java 工程目录。核心文件包括.classpath、.project、.settings/下的org.eclipse.jdt.core.prefs和org.eclipse.core.resources.prefs源码放在src/下编译输出在bin/依赖 jar 放在lib/。module-info.java说明这是一个带模块描述的工程hello包下是主逻辑类。路径作用能不能删.classpath声明源码目录、输出目录、依赖 jar不能删删了 Eclipse 不认工程.project工程名称与构建器配置不能删.settings/编译器版本、编码等偏好不能删编码错乱多半在这lib/mysql-connector-j-8.3.0.jarMySQL JDBC 驱动不能删删了连不上库src/module-info.java模块声明requires java.sql视 JDK 版本决定留不留bin/编译后的 class 文件可删重新编译会生成这里有个细节值得注意mysql-connector-j-8.3.0.jar是 MySQL 官方 8.x 系列的驱动类名是com.mysql.cj.jdbc.Driver和老的com.mysql.jdbc.Driver不是一回事。如果你照着网上一些老教程写Class.forName(com.mysql.jdbc.Driver)在 8.x 驱动下会直接抛ClassNotFoundException。这是第一个要记住的点。2.2 JDK 与 Eclipse 版本怎么选才不折腾工程里带了module-info.java说明源码是按 Java 9 以上的模块化方式组织的。实际跑的时候我一般建议用 JDK 17 或 JDK 8 这两个长期支持版本二选一。选 JDK 17 的好处是跟 8.3.0 驱动兼容性最好选 JDK 8 的好处是很多学校机房环境就是 8省得来回切。Eclipse 这边2021-094.21.0之后的版本都能直接导入。导入步骤打开 Eclipse菜单File→Import。选General→Existing Projects into Workspace。Select root directory指向解压后的工程根目录不要指向src。勾选工程点Finish。导入后如果工程名带红叉先别慌八成是 JDK 版本对不上。右键工程 →Properties→Java Build Path→Libraries看 JRE 是不是显示unbound。如果是点Edit换成你本机装好的 JDK。提示如果module-info.java报错说找不到java.sql检查Java Build Path里 JDK 是不是被识别成了 JRE。模块化工程必须用 JDK不能用独立的 JRE。2.3 数据库连接配置URL、用户名、密码三处必须改源码里连接数据库的代码通常长这样你需要把库名、用户名、密码换成自己本机的// 数据库连接工具类示例实际类名以源码为准 public class DBUtil { // 8.x 驱动类名别写成 com.mysql.jdbc.Driver private static final String DRIVER com.mysql.cj.jdbc.Driver; // useSSLfalse 关掉 SSL 警告serverTimezone 必须设否则时间字段会差 8 小时 private static final String URL jdbc:mysql://localhost:3306/bank_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 你的密码; public static Connection getConnection() throws Exception { Class.forName(DRIVER); return DriverManager.getConnection(URL, USER, PASSWORD); } }参数逐个说清楚bank_db是你自己在 MySQL 里建的库名源码 SQL 里如果写死了别的名字要么改代码要么改库名useSSLfalse是为了避免控制台刷一堆 SSL 警告本地学习环境关掉没问题serverTimezoneAsia/Shanghai不设的话存进去的时间可能莫名其妙差几个小时这是 MySQL 8.x 驱动最常见的坑之一characterEncodingutf8保证中文不乱码。建库和建表的 SQL 一般在源码注释里或者单独的.sql文件里。如果压缩包里没带你需要根据实体类字段自己补。常见做法是看hello包下的实体类字段名基本就是列名。3. 管理员与顾客双角色功能从登录到排行榜的代码逻辑3.1 管理员功能链登录、增删顾客、金额统计、排行榜管理员这条线是整个系统的骨架。登录成功后进入管理员菜单核心操作对应几张表顾客表存账号、密码、余额、交易记录表存每笔存取转。添加顾客就是一条INSERT删除顾客是DELETE计算存储金额是SELECT SUM(balance)富豪排行榜是SELECT * FROM customer ORDER BY balance DESC LIMIT N。// 富豪排行榜按余额倒序取前 10 public ListCustomer getRichList() { ListCustomer list new ArrayList(); String sql SELECT id, name, balance FROM customer ORDER BY balance DESC LIMIT 10; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { Customer c new Customer(); c.setId(rs.getInt(id)); c.setName(rs.getString(name)); c.setBalance(rs.getBigDecimal(balance)); list.add(c); } } catch (Exception e) { e.printStackTrace(); } return list; }这段代码有两个值得说的点。第一用PreparedStatement而不是Statement拼接字符串能防 SQL 注入这也是课程设计里老师常看的加分项。第二balance字段用BigDecimal而不是double金额计算用浮点数会出现0.1 0.2 ! 0.3的玄学问题排行榜排序时可能因此错位。计算存储金额那条 SQL 更简单SELECT SUM(balance) FROM customer但要注意如果表里一条数据都没有SUM返回的是NULL而不是 0代码里得判空否则控制台打印出来是null看着像 bug。3.2 顾客功能链存款、取款、转账、改密码顾客这条线的难点在转账因为它涉及两个账户的余额变动必须放在同一个事务里。存款和取款相对简单各是一条UPDATE但取款要先查余额够不够。// 转账扣款和入账必须在同一事务要么都成功要么都回滚 public boolean transfer(int fromId, int toId, BigDecimal amount) { String outSql UPDATE customer SET balance balance - ? WHERE id ? AND balance ?; String inSql UPDATE customer SET balance balance ? WHERE id ?; Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 关闭自动提交开启事务 try (PreparedStatement out conn.prepareStatement(outSql)) { out.setBigDecimal(1, amount); out.setInt(2, fromId); out.setBigDecimal(3, amount); // 余额不足时影响行数为 0 if (out.executeUpdate() 0) { conn.rollback(); return false; } } try (PreparedStatement in conn.prepareStatement(inSql)) { in.setBigDecimal(1, amount); in.setInt(2, toId); in.executeUpdate(); } conn.commit(); return true; } catch (Exception e) { if (conn ! null) { try { conn.rollback(); } catch (Exception ex) { ex.printStackTrace(); } } e.printStackTrace(); return false; } finally { if (conn ! null) { try { conn.setAutoCommit(true); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } } } }关键在WHERE id ? AND balance ?这个条件。把余额判断写进 SQL 的WHERE里靠数据库的行锁保证并发下不会扣成负数比先查再改更稳。setAutoCommit(false)到commit()之间就是事务边界任何一步抛异常都走rollback()。改密码就是一条UPDATE customer SET password ? WHERE id ?没什么花头但记得改完让用户重新登录别在当前会话里直接放行。3.3 控制台菜单与输入校验别让用户输个字母就崩控制台项目最容易被忽略的是输入校验。用户在主菜单输入abcScanner.nextInt()直接抛InputMismatchException整个程序挂掉。常见做法是用Scanner.nextLine()读字符串再手动try-catch转数字或者用hasNextInt()先判断。Scanner sc new Scanner(System.in); int choice -1; while (true) { System.out.print(请选择操作); String line sc.nextLine().trim(); try { choice Integer.parseInt(line); break; } catch (NumberFormatException e) { System.out.println(请输入数字别输字母); } }金额输入同理用BigDecimal的构造函数接收字符串别用double中转。这些细节不影响功能跑通但答辩演示时输错一次就崩场面会很尴尬。4. 避坑与排查导入、连接、编码、模块四个高频翻车点4.1 导入后满屏红叉提示 cannot resolve type现象工程导入 Eclipse 后源码里Connection、PreparedStatement全部标红提示无法解析类型。原因JDK 没配好或者module-info.java里的requires java.sql没生效。Eclipse 把工程当成了非模块工程或者 JRE 被识别成了普通 JRE 而不是 JDK。解决右键工程 →Properties→Java Build Path→Libraries确认 JRE 是 JDK 且版本匹配再进Java Compiler确认Compiler compliance level和 JDK 版本一致。如果还是红把module-info.java临时删掉再编译一次能过说明是模块声明的问题检查requires语句有没有拼错。4.2 连数据库报 Access denied 或 Public Key Retrieval is not allowed现象运行后抛java.sql.SQLException: Access denied for user rootlocalhost或者Public Key Retrieval is not allowed。原因前者是用户名密码不对或者 MySQL 里没给这个用户授权后者是 MySQL 8.x 默认的caching_sha2_password认证插件驱动需要显式允许公钥检索。解决密码错就改密码公钥问题在 URL 后面加allowPublicKeyRetrievaltrue。完整 URL 变成jdbc:mysql://localhost:3306/bank_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltruecharacterEncodingutf8。另外确认 MySQL 服务真的在跑端口 3306 没被占用。4.3 中文乱码控制台和数据库两头都要管现象存进去的顾客姓名变成???或者控制台打印出来是乱码。原因两头编码不一致。Eclipse 工程默认编码可能是 GBKMySQL 库和表的字符集可能是latin1JDBC URL 又没指定编码。解决三处统一成 UTF-8。Eclipse 里右键工程 →Properties→Resource→Text file encoding选 UTF-8建库时用CREATE DATABASE bank_db DEFAULT CHARACTER SET utf8mb4JDBC URL 带上characterEncodingutf8。三处都对了中文才不会翻车。4.4 找不到或无法加载主类现象点运行按钮Eclipse 弹窗提示找不到或无法加载主类。原因bin目录里的 class 文件没生成或者主类没写main方法或者Run Configurations里指定的主类名和实际包名对不上。解决先Project→Clean重新编译再确认主类有public static void main(String[] args)最后检查Run Configurations→Main class里填的是全限定名比如hello.Main不是光写Main。如果工程带了module-info.java主类所在的包必须被exports或者本身在模块根下。5. 进阶玩法把控制台项目改成能演示的加分项跑通只是及格线想让这份课程设计在答辩时多拿几分有几个成本不高但效果明显的改法。第一个是给金额字段加DECIMAL(10,2)类型别用FLOAT或DOUBLE从建表阶段就杜绝精度问题。第二个是把数据库连接信息抽到db.properties文件里用Properties类加载这样换电脑演示不用改代码只改配置文件。// 从 db.properties 读连接参数换环境只改配置文件 Properties props new Properties(); try (InputStream in DBUtil.class.getClassLoader().getResourceAsStream(db.properties)) { props.load(in); } String url props.getProperty(jdbc.url); String user props.getProperty(jdbc.user); String password props.getProperty(jdbc.password);对应的db.properties放在src根目录下jdbc.urljdbc:mysql://localhost:3306/bank_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltruecharacterEncodingutf8 jdbc.userroot jdbc.password你的密码第三个加分项是给关键操作加日志不用上 Log4j 那么重直接在转账、删除顾客这些敏感操作后往一张operation_log表插一条记录答辩时演示「谁在什么时候转了多少钱」一目了然。第四个是富豪排行榜加个LIMIT参数让管理员能选看前 5 还是前 10交互上显得更完整。验证改法有没有生效最简单的办法是造两条边界数据一条余额刚好等于转账金额看能不能转成功一条余额差一分钱看会不会被拦下来。再故意把db.properties里的密码改错确认程序给出的是友好提示而不是一堆堆栈。这几个动作走一遍基本就能确定工程是稳的。从那以后我每次拿到别人的 Java 工程压缩包都强制先做三件事确认 JDK 版本、确认驱动 jar 在不在lib下、确认数据库连接参数是不是写死在代码里。这三步走完后面能省掉一大半排查时间。希望帮到你。本文还有配套的精品资源点击获取