Java从数据库获取数据的完整流程
Java作为企业级开发的主流语言,与数据库的交互是其核心能力之一,从数据库获取数据通常涉及JDBC(Java Database Connectivity)技术,本文将系统介绍实现这一过程的步骤、关键组件及最佳实践。

JDBC基础概念与准备工作
JDBC是Java提供的数据库访问API,它定义了一组标准接口和类,使得Java程序能够与各种数据库进行交互,在使用JDBC之前,需要完成以下准备工作:
- 加载驱动:根据数据库类型(如MySQL、Oracle、PostgreSQL等)下载对应的JDBC驱动jar包,并将其添加到项目的类路径中。
- 获取连接:通过
DriverManager类的getConnection()方法建立与数据库的连接,该方法需提供数据库URL、用户名和密码。
以MySQL为例,数据库URL的格式通常为:jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC。
建立数据库连接
建立连接是操作数据库的第一步,以下是核心代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
private static final String URL = "jdbc:mysql://localhost:3306/mydb";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // 加载驱动(JDBC 4.0后可省略)
connection = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return connection;
}
}
注意事项:

- 建议使用连接池(如HikariCP、Druid)管理连接,避免频繁创建和销毁连接带来的性能损耗。
- 生产环境中需对敏感信息(如密码)进行加密或通过配置文件管理。
创建Statement对象并执行查询
连接建立后,需通过Statement或其子类(如PreparedStatement)执行SQL查询。
使用Statement执行静态SQL
Statement statement = null;
ResultSet resultSet = null;
try {
statement = connection.createStatement();
String sql = "SELECT id, name, age FROM users";
resultSet = statement.executeQuery(sql); // 执行查询,返回ResultSet结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源(按ResultSet、Statement、Connection顺序)
if (resultSet != null) try { resultSet.close(); } catch (SQLException e) {}
if (statement != null) try { statement.close(); } catch (SQLException e) {}
if (connection != null) try { connection.close(); } catch (SQLException e) {}
}
使用PreparedStatement防止SQL注入
PreparedStatement是预编译语句,适用于动态SQL,能有效防止SQL注入攻击:
String sql = "SELECT * FROM users WHERE name = ? AND age > ?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "张三"); // 设置第一个参数 preparedStatement.setInt(2, 20); // 设置第二个参数 resultSet = preparedStatement.executeQuery();
处理ResultSet结果集
ResultSet对象包含查询返回的数据,通过以下方法操作:
next():将游标移动到下一行,初始位置在第一行之前。getXxx(列名或索引):获取指定列的值,Xxx为数据类型(如getString、getInt)。close():关闭结果集,释放资源。
优化建议:

- 避免在循环中频繁调用
next(),可将数据封装为Java对象(如List - 对于大数据量,考虑使用
ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_READ_ONLY提升性能。
事务管理
事务确保数据库操作的原子性,通过Connection对象控制:
try {
connection.setAutoCommit(false); // 关闭自动提交
// 执行多个SQL操作
statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
statement.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
connection.commit(); // 提交事务
} catch (SQLException e) {
connection.rollback(); // 回滚事务
e.printStackTrace();
} finally {
connection.setAutoCommit(true); // 恢复自动提交模式
}
关闭资源与异常处理
数据库资源(连接、语句、结果集)是有限的,必须显式关闭以避免泄漏,推荐使用try-with-resources语句(Java 7+)自动关闭资源:
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery()) {
// 处理结果集
} catch (SQLException e) {
e.printStackTrace();
}
高级实践:ORM框架与连接池
- ORM框架:如Hibernate、MyBatis,通过对象关系映射简化数据库操作,减少JDBC代码量。
- 连接池:HikariCP是目前性能最高的连接池之一,配置示例:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); config.setUsername("root"); config.setPassword("password"); HikariDataSource dataSource = new HikariDataSource(config); Connection connection = dataSource.getConnection();
Java从数据库获取数据的核心步骤包括:加载驱动、建立连接、创建执行对象、处理结果集、管理事务及关闭资源,合理使用PreparedStatement、连接池和ORM框架,能够显著提升代码的安全性和可维护性,在实际开发中,需根据项目需求选择合适的技术方案,并注重异常处理和资源释放的规范性。
















