ARTICLE DETAIL

资讯详情

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

Java家庭理财系统源码实战:JDBC连接、业务改造与避坑全指南

Java家庭理财系统源码实战:JDBC连接、业务改造与避坑全指南 简介这是一份基于Java的家庭理财系统完整源码面向具备一定Java基础、希望学习前后端分离项目实战或进行二次开发的开发者。系统采用B/S结构整合微服务组件、Redis缓存、RabbitMQ消息队列与Nginx静态服务器前端基于React与Ant Design Pro覆盖收支情况本日、本月、本年统计、支出类型分析图、股票与基金市场走势展示、已买股票与基金管理、外债借出借入、固定资产及房贷车贷以及月末/年末报表等模块。压缩包共246个文件约4.48MB主要包括57个Java接口与业务类、60余个JavaScript/JSX前端页面组件、9个YAML配置、1个SQL数据库脚本以及样式文件、图表配置和说明文档目录结构清晰。已有537人学习适合对照学习微服务架构下前后端数据交互、ECharts图表可视化以及理财场景中完整业务逻辑的实现过程。1. 拿到“Java家庭理财系统源码.zip”之后先想清楚这三件事“Java家庭理财系统源码.zip”在高校课程设计和后端开发面试作品里出现频率不低解压开后大多是一套 Swing 界面 JDBC MySQL 的组合覆盖登录、记账、分类、月度统计和预算提醒。它很适合刚学完 Java 基础但没做过完整项目的人代码量不大却能一次看到界面层、业务层、持久层怎么配合。我拿到这种包从不会直接双击运行而是先确认 JDK 版本对得上对不对得上、数据库初始化脚本什么时候执行、哪几个文件承担了核心逻辑。这三件事想清楚项目能少踩一半坑后面无论是做课设演示还是改造成面试项目心里都有底。2. 拆解源码包家庭理财系统的代码结构、依赖与主流程不少 Java 初学者拿到源码包后的第一个动作是解压、点开 IDEA、直接运行然后被一排报错劝退。扎实的做法是先把这个 zip 包当黑匣子拆一层搞清它依赖哪些 jar、入口类在哪、数据从哪里读。这个环节不产生任何界面但决定了后面所有操作能不能顺利走完。2.1 一个典型 Java 家庭理财源码包的目录长什么样先说普遍事实课程设计作品里的 Java 家庭理财系统十有八九不是 Maven/Gradle 工程而是 IDEA 或 Eclipse 里直接依赖 lib 目录的普通 Java 工程。zip 包根部常见的内容包括项目说明文档readme.txt 或课设报告、src 源码目录、lib 依赖目录、db 数据库脚本目录偶尔还带 out 编译输出和 run.bat 启动脚本。我用一张表按查看顺序列出来照着走能少走很多弯路。路径典型命名内容什么时候看readme.txt / 课设报告.docx环境要求、默认账号、操作步骤解压后最先看libmysql-connector-java.jar 等第三方依赖导入项目时加入 classpathsrc/.../view登录窗口、主窗口、各功能面板改界面时看src/.../dao数据库访问层每个表对应一个 DAO排查 SQL 和业务逻辑时看db/init.sql 或 database.sql建库建表和初始数据第一次运行前必须导入run.bat / dist打包后的运行入口只在部分包里存在验证环境用我多年拆这类课设 zip 包的习惯是先看 readme再找 lib再看 db。readme 里通常会写默认账号密码比如 admin / 123456db 目录决定你是连 MySQL 还是 SQLite两者的连接串完全不同。如果你解压发现什么都齐但 run.bat 双击闪退绝大多数原因是 lib 下的 jar 没有写进 classpath跟代码本身没有关系。为什么特别在意“是否 Maven 工程”因为普通 Java 工程和 Maven 工程的运行方式差异很大。Maven 工程的 pom.xml 在根目录依赖会自动下载普通 Java 工程必须手动把 lib 目录挂到项目依赖里。不少源码包实际上是 Eclipse 工程里面带 .classpath 和 .project用 IDEA 直接打开可能识别不全正确做法是在 IDEA 里用 Open 选择项目根目录再在 Project Structure 里把 lib 目录加进去。这一步做对了classpath 问题就少了一半。很多网盘文件习惯命名为“源码笔记”笔记其实就是课设报告里面往往有表结构说明和流程图对理解系统非常有用。2.2 从登录到记账核心模块的调用链代码结构理清后要找系统的主流程。常见家庭理财系统的功能切成用户登录、收支录入、分类管理、账单查询、月度统计、预算提醒。它们之间的调用关系是一条纵向链路用户操作发生在 view 包里的 JFrame 或 JPanelview 把事件交给业务方法业务方法调用 dao 包里的数据访问类dao 通过 JDBC 操作 MySQL 表。拿“新增一笔支出”举例。用户在“记一笔”窗口里填金额、选分类、点保存。点击后代码先取出 JTextField 和 JComboBox 的值组装成一个实体对象如 Expense 或 Bill再调用 ExpenseDao.insert(expense) 方法insert 里执行一条 INSERT SQL。数据写入成功后主界面的表格通过查询方法刷新。这条链路里最常见的断点是“取出界面值”和“执行 SQL”之间比如 JComboBox 存的是分类 id取出时却用 getSelectedItem().toString() 拿到分类名字去写库数据库立刻报 Data too long 或字段不匹配。这套链路对新手最大的价值是顺带复习 Java 基础里的集合与排序。分类下拉框要按名称排序可以用 Collections.sort(list, Comparator.comparing(Category::getName))统计数据要按金额排序SQL 里写 ORDER BY amount DESC 更省事。这些都是 java 开发工程师面试题里高频出现的场景。真正手写冒泡排序的机会不多但理解 Comparable 和 Comparator 的区别在这个项目里体会一次比背十遍定义更牢。2.3 工具类与数据库连接层先看这三个文件打开源码后先找三个文件它们决定了系统能不能连上数据库数据库工具类常见叫 DBUtil.java 或 JdbcUtil.java、配置文件jdbc.properties 或 db.properties、字符串工具类StringUtil.java。先看 DBUtil你立刻能判断这套代码用的是“注册驱动 DriverManager.getConnection”的传统写法还是用了连接池。课设源码绝大多数是前者代码一般长这样import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/family_finance ?useUnicodetruecharacterEncodingutf8useSSLfalse; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); // 注册 JDBC 驱动驱动类在第一次加载时执行 } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码说明几件事。Class.forName 是在加载驱动类“com.mysql.jdbc.Driver”是 MySQL 5.x 连接器的旧驱动名如果 zip 包里的 lib 换成了 mysql-connector-java 8.x驱动名要改成 com.mysql.cj.jdbc.Driver否则报 ClassNotFoundException。URL 里的 useUnicode 和 characterEncoding 控制中文字符集useSSLfalse 是为了避免 MySQL 8 在无证书时打印大量告警。USER 和 PASSWORD 是数据库账号改成自己本机的密码后系统才能连上。StringUtil 这个类看起来不起眼实际上所有界面的空值校验都依赖它。常见方法包括 isNotEmpty(String str) 和 getRandomNum()前者拦截空输入后者生成账单编号。有的源码还会在 util 包里放 DateUtil负责把 java.util.Date 和界面上的字符串互相转换。这三个工具类不是核心业务但先看懂它们能省下排查空指针和日期格式错误的大把时间。连接层搞定后下一步就是把它真正跑通。3. 在本地跑通家庭理财系统JDK、MySQL、数据库初始化三步跑通是硬指标。源码解压后你能不能看到登录窗口取决于三个环境变量是否对齐JDK、MySQL、数据库脚本。我按操作顺序写不是按源码包结构写。3.1 环境准备JDK 版本和 MySQL 版本怎么匹配Java 家庭理财系统源码大多是几年前写的常见目标环境是 JDK 8 配 MySQL 5.7。别着急装最新的 JDK 21Java 8 对 Swing 和 JDBC 的兼容最稳。如果源码里用了 lambda 和 stream至少也要 JDK 8只有出现 var 关键字或 record 时才需要 JDK 17 以上。判断方法很简单打开任意一个源码文件看有没有明显的新语法再看 readme 里有没有注明编译环境。没有注明的话直接装 JDK 8 大概率没错。java -version javac -version mysql --version这三条命令依次检查运行环境、编译环境和数据库版本。java 和 javac 的版本必须一致否则会出现“编译用高版本、运行用低版本”导致的 UnsupportedClassVersionError这个报错在课设指导里见过太多次。mysql --version 提示 command not found说明 MySQL 不在 PATH 里先装 MySQL 或者用绝对路径执行。MySQL 版本要额外留意如果源码 lib 目录带的是 mysql-connector-java-5.1.xx而本机装的是 MySQL 8.0默认认证插件是 caching_sha2_password5.1 驱动会连不上报错是 Access denied 或 Auth failed。解决方式有三种换 8.x 连接器、把 MySQL 账号改回 mysql_native_password、在连接串里加 allowPublicKeyRetrievaltrue。我一般建议直接换 8.x 驱动既保留 MySQL 8 特性也不用降低账号安全性。3.2 导入项目前的三个配置点JDBC 连接串、驱动、字符集环境一致以后看配置文件。多数非 Maven 源码的数据库参数写在 src 下的 jdbc.properties 或 db.properties 里也有写死在 DBUtil.java 里的。改配置时重点盯三个点连接串、驱动类名、字符集参数。我的配置模板是这样jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/family_finance?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码参数说明driver 如果用 MySQL 8.x 驱动必须写 com.mysql.cj.jdbc.Driver老写法 com.mysql.jdbc.Driver 在新驱动里虽然还能跑但控制台会打 Deprecation 警告。url 中的 serverTimezone 在 MySQL 8 下必须给否则报 Server returns invalid timezone亚洲地区填 Asia/Shanghai 最直接。useUnicode 和 characterEncoding 一起出现是为了告诉驱动JDBC 层收到和发出去的都是 UTF-8 字符串。如果漏掉 characterEncoding界面输入中文保存后数据库里看到的是问号。这里有个很多人翻车的细节properties 文件里的 符号不需要转义但同样的连接串如果出现在 XML 配置里比如 Spring 的 applicationContext.xml 或 MyBatis 的配置必须把 写成 。密码里有特殊字符时properties 文件里也要小心冒号和等号。如果只是跑课设源码最简单的方式是像上面这样单独建一个 db.properties在 DBUtil 里用 ResourceBundle 读取不要硬编码在 Java 类里免得以后改密码还要重新编译。导入项目时还有一步高频操作把 lib 目录加入依赖。在 IDEA 里按 CtrlAltShiftS 打开 Project Structure选 Modules - Dependencies点加号选 JARs or directories选中 lib 目录。如果没有这一步运行时会一直报 NoClassDefFoundError: com/mysql/jdbc/Driver。有些源码包自带 .classpath但 IDEA 未必认手动加依赖是最稳的做法。3.3 初始化数据库执行 SQL 脚本后先验证两张表配置改完先别急着运行把数据库脚本导进去。源码包一般在 db 目录下提供 init.sql 或 family_finance.sql。我习惯先在 MySQL 客户端里执行一遍不用任何图形工具在终端里输入mysql -uroot -p db/init.sql这个命令把 init.sql 里的 CREATE DATABASE、CREATE TABLE 和 INSERT 数据全部执行。如果脚本里已经包含 CREATE DATABASE IF NOT EXISTS family_finance 和 USE family_finance直接导入即可如果没有这两行执行会报 No database selected这时要先登录 MySQL 手动建库再指定库名导入mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS family_finance DEFAULT CHARSET utf8mb4; mysql -uroot -p family_finance db/init.sql导入结束后验证两步看表是否存在看基础分类是否插入成功。第一眼就看这两块能区分后面是代码问题还是数据问题。SHOW TABLES; SELECT id, name, type, parent_id FROM category ORDER BY parent_id, id;SHOW TABLES 至少能看到 user、category、bill或 expense这三张核心表。category 是收支分类表SELECT 的结果里如果有“餐饮”“工资”“交通”这类初始数据说明自带的分类种子已经写入。后面记账页面的下拉框就是从这张表读数据的。如果查询结果为空回头看 init.sql 里的 INSERT 语句是不是没执行成功再看数据库字符集是不是 utf8mb4这些是下一章避坑部分的主角。4. 动手改这三处业务逻辑收支分类、报表统计、预算提醒源码跑通只是开始大多数人下载这个包是为了改造成自己的课设或面试项目。我建议不要漫无目的地改样式优先改三处业务逻辑分类体系、报表统计、预算提醒。这三处最能体现对业务的理解也是 Java 面试题里项目经验最容易深入追问的地方。4.1 收支分类加一笔“意外支出”要动几张表分类模块的核心表一般叫 category字段常见的有 id、name、type、parent_id。type 用 0/1 或 income/expense 标记收支方向parent_id 用来支持二级分类比如“餐饮”下面挂“早餐”“外卖”。加一个新分类“意外支出”本质上只在 category 表 INSERT 一行但要保证前端下拉框和统计报表都跟着走。public int addCategory(Category c) throws SQLException { String sql INSERT INTO category (name, type, parent_id) VALUES (?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, c.getName()); ps.setInt(2, c.getType()); ps.setInt(3, c.getParentId()); return ps.executeUpdate(); } }这段代码有两个要点。一是用 PreparedStatement 而不是 Statement它用占位符 ? 接收参数既避免拼接 SQL 带来的注入风险也不需要操心字符串里的单引号。二是 try-with-resources 写法Connection 和 PreparedStatement 用完后会自动关闭不会把数据库连接泄漏。老源码里更常见的是在 finally 块里挨个 close功能一样但啰嗦。改代码时如果发现原作者的 DAO 还在用字符串拼 SQL一定顺手改成 PreparedStatement这是面试官最爱问的“预编译与防注入”。新分类要真正用起来还需要在加载分类下拉框的方法里调用查询接口而不是在记一笔的页面写死 JComboBox 的选项。很多课设源码的分类下拉框是在 initUI() 里硬编码 addItem 添加的数据库加了分类也不会出现在界面。正确做法是提供一个 loadAllCategories() 方法每次打开记账窗口或点刷新时重新查 category 表再 setModel 给下拉框。这样“意外支出”入库后记账界面立刻就能看到不用重启程序。4.2 月度报表SQL 语句怎么聚合收支报表功能是家庭理财系统区别于简单记账本的标志。核心需求就是一句话这个月收入多少、支出多少、各项分类各占多少。实现上不推荐把所有账单加载到内存里用 Java 慢慢累加那是报表页越用越卡的主要根源。直接在 MySQL 端聚合返回少量汇总行Java 端只负责展示。一个通用的月度统计 SQL 如下SELECT DATE_FORMAT(create_time, %Y-%m) AS month, b.type, c.name AS category_name, SUM(b.amount) AS total FROM bill b LEFT JOIN category c ON b.category_id c.id WHERE b.create_time 2025-01-01 AND b.create_time 2025-02-01 GROUP BY month, b.type, c.name ORDER BY total DESC;参数说明DATE_FORMAT 把时间字段格式化成年月字符串这一步能在 SQL 层完成就在 SQL 层完成Java 端不用解析 Timestamp。WHERE 条件里的区间是左闭右开避免漏掉 2025-01-31 23:59:59 当天最后一秒的数据。GROUP BY 后面除了 month 还要带上 type 和 category_name因为 SELECT 里的非聚合列必须参与分组否则 MySQL 开启 ONLY_FULL_GROUP_BY 时直接报错。ORDER BY total DESC 让金额最高的分类排在最前这比在 Java 里用 Collections.sort 再排一遍更省事也把 java 排序知识放到了正确的场景里。如果你想按季度统计把 WHERE 条件换成 create_time BETWEEN 2025-01-01 AND 2025-03-31DATE_FORMAT 改成 %Y-%Q 或按季度聚合。按年统计则用 YEAR(create_time)。很多源码里的报表只有一个简单的总收入和总支出你要做的不是另写新功能而是把 WHERE、GROUP BY、ORDER BY 三个子句改成可复用的参数。我在改这类系统时通常把月份作为 JComboBox 的选项SQL 用 PreparedStatement 绑定“月份前缀”比如 WHERE DATE_FORMAT(create_time, %Y-%m) ?这样界面怎么选账SQL 都不用改。4.3 预算提醒用 Timer 还是启动时扫描预算提醒是另一个体现系统完整度的功能。常见源码实现有两类一类是每次启动时扫描当月支出超预算就弹窗另一类是程序运行期间用定时器周期检查。对于 Swing 课设系统我建议用 javax.swing.Timer因为它在事件调度线程上触发回调可以直接弹 JOptionPane不会出现那种后台线程更新界面导致的卡顿或闪烁。Timer timer new Timer(60_000, e - checkBudget()); timer.setInitialDelay(0); timer.start(); private void checkBudget() { double monthSpend billDao.getMonthSum( LocalDate.now().getYear(), LocalDate.now().getMonthValue()); double budget budgetDao.getMonthlyBudget(); if (monthSpend budget) { JOptionPane.showMessageDialog(mainFrame, 本月已支出 monthSpend 元超出预算 budget 元); } }参数说明构造器的第一个参数是触发周期单位毫秒60_000 表示每分钟检查一次setInitialDelay(0) 让窗口打开后立即先查一次不用干等。checkBudget 里先从 DAO 查出当月支出和预算再比较。重点说下为什么不要用 java.util.Timer 或 new Thread 完成这件事它们跑在非 UI 线程如果直接在这里弹 JOptionPane虽然多数时候能显示但在事件分发线程外操作 Swing 组件属于未定义行为快速连续触发时可能弹多个对话框或者界面不刷新。用 javax.swing.Timer 把回调留在事件分发线程里既简单又安全。预算功能的扩展点也很明确按分类设预算支出统计不再算总金额而是算某个分类的合计预算周期可选月/周超预算时不仅弹窗还生成一条提醒记录出现在首页。做完这三个扩展系统业务逻辑的完整度已经超过大部分课程设计面试被问到时也能讲清“用 Timer 的原因”“预算表与流水表的关系”“分类统计的 SQL 写法”。5. 避坑清单Java 家庭理财系统编译运行时的 5 个典型问题能打开窗口、能录入第一笔账不代表系统没问题。我盘点这些年帮人诊断源码时遇到频率最高的 5 个现象每个都按现象、原因、解决三步写。这些都是血泪经验建议先收藏再对照。5.1 “找不到主类 / 运行不了 jar”不是 JDK 问题是 classpath 问题现象点击运行后 IDEA 提示 Cannot find main class或者命令行运行 jar 报 Error: Could not find or load main class。 原因大部分家庭理财源码是 Eclipse 工程IDEA 导入后没有正确标记 source root或者 lib 目录没加进依赖导致编译产物不完整。主类名被写死在 .classpath 里的情况也存在项目目录移动后相对路径失效。 解决在 IDEA 中右键 src 目录选择 Mark Directory as - Sources Root再按 CtrlAltShiftS 打开 Modules检查 src 是否标记为 SourcesOutput 目录里有没有 class 文件最后确认 Main 类里有 public static void main(String[] args)。如果源码包带 run.bat打开看它写的类名手动执行 java -cp lib/*;out 主类名 来验证能跑通说明是 IDE 识别问题跟 JDK 无关。5.2 数据库连接失败Connection refused 与 Access denied 的区别现象程序刚启动弹出数据库异常控制台有一段红色堆栈。 原因Connection refused 表示网络层通了但 MySQL 没在监听通常是 MySQL 服务没启动或者端口不是 3306Access denied 表示网络、端口、数据库名都对但账号或密码不对也可能是 MySQL 8 的认证插件不被老驱动支持。 解决先看异常关键字。CommunicationsException / Connection refused在 Windows 服务里启动 MySQL或检查 URL 端口是否和 my.ini 一致。Access denied先用命令行 mysql -uroot -p 实测密码再核对 DBUtil 里 password 是否多了空格如果账号密码没错但 MySQL 是 8.0按第 3 章描述换新驱动或改 mysql_native_password。分开诊断能节省大量反复试错的时间。5.3 中文乱码控制台、IDE、数据库三层字符集排查法现象界面显示中文变成问号或者录入中文后数据库里是问号又或者报表日期显示成 2025-01-01 00:00:00 而不是“2025年1月”。 原因乱码常常不是单一问题发生在三层IDE 的编译/运行文件编码不是 UTF-8JDBC URL 少了 characterEncodingMySQL 表默认字符集不是 utf8mb4。三层只要有一层不对中文就会在某个环节变成问号。 解决按顺序排查。IDEA 里打开 Settings - Editor - File Encodings把三处全设为 UTF-8执行 SHOW CREATE TABLE bill 看 DEFAULT CHARSET 是否为 utf8mb4最后确认 DBUtil 的 URL 带 useUnicodetruecharacterEncodingutf8。改完三处后重启程序重新插入一条中文再 SELECT 出来验证。这套流程基本覆盖 90% 的乱码问题比在代码里反复 new String(str.getBytes(...)) 靠谱得多。5.4 金额计算为什么能用 BigDecimal 就别用 double现象统计报表出现 0.999999 或 199.999单笔明细却是 200.00预算判断在临界点出错。 原因float 和 double 是二进制浮点数0.1 在二进制里是无限循环小数累加多次必然产生误差。财务管理尤其是金额字段用 double 属于新手常见错误。 解决数据库字段用 DECIMAL(10,2)Java 实体类用 BigDecimalDAO 查询时用 getBigDecimal 而不是 getDouble计算统一走 BigDecimal.add。如果源码里到处是 double改起来工作量大至少优先在新增、统计、预算判断三个关键点改成 BigDecimal。比较两个 BigDecimal 不要用 equals用 compareTo因为 equals 会比较精度舍入用 setScale(2, RoundingMode.HALF_UP)。这一点在 java 面试题里出现频率也很高值得主动写进项目说明里。5.5 SQL 脚本导入报错MySQL 版本与分隔符问题现象执行 init.sql 时报错在某个 INSERT 或 CREATE 语句附近语法明明没问题MySQL 却提示 syntax error。 原因脚本里包含存储过程、触发器或自定义函数时MySQL 默认把分号当作语句结束符过程体里的分号会把语句提前拆开造成语法混乱。另一个常见原因是脚本用 MySQL 5.7 编写包含旧语法或严格模式下不认的类型写法。 解决导入前用文本编辑器打开脚本看开头有没有 DELIMITER $$ 或 DELIMITER //如果有结尾一般有 DELIMITER ; 恢复。用命令行导入通常能正确处理用 IDEA 自带的 Database 面板执行时有些版本不处理 DELIMITER这时改用命令行或图形客户端的“运行 SQL 文件”功能。版本语法问题则在 MySQL 8 里先执行 SET SESSION sql_mode STRICT_TRANS_TABLES; 试导导完再恢复原值。6. 把课程设计源码改造成面试作品先验证再重构源码能跑、坑也踩过之后最后一步是让它变成你真正聊得起来的项目。先做验证再做重构最后才谈得上写进简历。验证方法很简单准备三组数据。第一组是空账本只建库不录入任何账单系统不能崩报表应显示 0 支出第二组是跨月数据分别录 1 月底和 2 月初的账单确认月报表不会串月第三组是金额带角分的账比如 19.99 和 0.10 各存一笔统计结果必须精确等于 20.09。这三组数据跑完系统边界就基本清楚了。重构方面第一优先级是把 lib 手动导入的老工程改成 Maven 工程在 pom.xml 里声明 mysql-connector-java 依赖和 JDK 编译版本。这一步看似工程化实际上把 classpath 问题彻底根治。第二优先级是给 DAO 层加日志输出用 java.util.logging 或 slf4j 打印执行过的 SQL 和参数以后出问题不靠猜直接看日志。第三优先级是给 budget 和 bill 两个核心方法写单元测试测试数据不要连数据库可以使用内存版 H2 或直接 mock DAO体现你具备测试意识。简历和面试时少写“实现了登录注册”这类一句话描述专注讲三个点JDBC 预编译如何防注入、DATE_FORMAT 加 GROUP BY 怎么做月度聚合、Swing Timer 为什么能安全弹窗。准备 java 开发工程师面试题时把这三个点延伸出来的 PreparedStatement 缓存、SQL 执行计划、Swing 事件分发线程一起整理项目深度立刻就不一样了。我早年也犯过拿源码改个标题就投递的错电话面一问分类统计的 JOIN 就接不上话后来老老实实把这个项目的金额和字符集坑都踩了一遍面试反而有的聊。希望帮到你。本文还有配套的精品资源点击获取
返回列表