如何实现从属性文件读取dbURL、用户名及密码的JDBC程序?
JDBC从属性文件读取数据库连接信息的代码解析与完善
我来帮你把这段JDBC代码完善好,并且一步步解析清楚怎么从属性文件读取数据库连接信息,让代码更灵活易维护~
第一步:先准备属性文件
首先我们需要创建一个db.properties文件,把数据库连接的敏感信息都放在这里,和代码分离。文件内容如下:
# MySQL 5.x驱动类 driverClass=com.mysql.jdbc.Driver # MySQL 8.x驱动类请改成:com.mysql.cj.jdbc.Driver dbURL=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC user=root password=your_database_password
第二步:完善后的完整Java代码
下面是调整后的完整代码,解决了从属性文件读取参数的问题,同时优化了资源管理:
package com.j2ee.jdbc.firstProgram; import java.io.FileReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBC_Properties { public static void main(String[] args) { Connection con = null; Statement stmt = null; ResultSet rs = null; Properties props = new Properties(); try { // 加载外部属性文件 props.load(new FileReader("db.properties")); // 加载JDBC驱动类(从属性文件读取,适配不同版本MySQL) Class.forName(props.getProperty("driverClass")); // 从属性文件提取连接参数 String dbURL = props.getProperty("dbURL"); String user = props.getProperty("user"); String password = props.getProperty("password"); // 建立数据库连接 con = DriverManager.getConnection(dbURL, user, password); System.out.println("✅ 数据库连接成功!"); // 创建Statement执行SQL查询 stmt = con.createStatement(); String sql = "SELECT * FROM your_table_name"; // 替换成你的表名 rs = stmt.executeQuery(sql); // 遍历结果集并输出数据 while (rs.next()) { // 这里根据你的表结构调整字段获取方式,示例取ID和名称 int id = rs.getInt("id"); String name = rs.getString("name"); System.out.printf("ID: %d, 名称: %s%n", id, name); } } catch (Exception e) { // 捕获异常并打印栈信息,方便排查问题 e.printStackTrace(); } finally { // 必须在finally块关闭资源,避免资源泄漏,关闭顺序要从下到上 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
关键代码部分解析
- 属性文件加载:用
Properties类的load()方法读取外部配置文件,这样修改数据库信息不用动代码,直接改配置文件就行,非常方便维护,还能避免把敏感密码硬编码在代码里。 - 驱动加载优化:把驱动类名也放到属性文件中,这样切换MySQL 5.x和8.x版本时,只需要改配置文件里的
driverClass值就行,不用修改代码。 - 资源管理:在
finally块中按ResultSet → Statement → Connection的顺序关闭资源,不管代码有没有抛出异常,都能确保数据库连接等资源被释放,防止资源泄漏。 - 结果集处理:用字段名(比如
rs.getInt("id"))代替索引获取数据,比用索引更直观,也避免表结构调整后索引失效的问题。
额外注意事项
- 确保
db.properties文件的路径正确,如果是Maven项目,建议把它放在src/main/resources目录下,读取时路径写成src/main/resources/db.properties或者用类加载器读取更稳妥。 - MySQL 8.x版本必须添加
serverTimezone=UTC时区参数,否则会抛出时区相关的异常。 - 实际开发中推荐使用
PreparedStatement代替Statement,它可以防止SQL注入,安全性更高,还能预编译SQL提升性能。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

