在Java开发中,从数据库获取行数据是常见的操作,通常通过JDBC(Java Database Connectivity)实现,JDBC是Java语言连接数据库的标准API,提供了执行SQL语句并处理结果集的方法,本文将详细介绍如何使用JDBC获取数据库行数据,包括环境准备、连接数据库、执行查询、处理结果集及资源释放等关键步骤。

环境准备与依赖配置
在开始之前,需确保项目中已添加对应数据库的JDBC驱动依赖,以MySQL为例,若使用Maven构建项目,可在pom.xml文件中添加以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
驱动版本需与数据库版本匹配,例如MySQL 8.0以上版本推荐使用8.0.x系列的驱动,其他数据库如Oracle、PostgreSQL等也需分别添加对应的JDBC驱动。
建立数据库连接
获取行数据的第一步是建立与数据库的连接,通过DriverManager类的getConnection()方法实现,需提供数据库URL、用户名和密码,以下为MySQL连接示例:
String url = "jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC";
String username = "用户名";
String password = "密码";
try {
Connection connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
连接URL中的参数可根据需求调整,如useSSL用于禁用SSL连接(开发环境),serverTimezone用于设置时区,连接成功后,Connection对象代表与数据库的会话,后续所有操作均基于此连接。
创建Statement对象并执行查询
建立连接后,需创建Statement或其子接口PreparedStatement对象来执行SQL查询。Statement用于执行静态SQL语句,而PreparedStatement支持参数化查询,能有效防止SQL注入,推荐优先使用。
String sql = "SELECT id, name, age FROM users WHERE age > ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 18); // 设置参数
ResultSet resultSet = preparedStatement.executeQuery(); // 执行查询
} catch (SQLException e) {
e.printStackTrace();
}
executeQuery()方法用于执行SELECT语句,返回ResultSet对象,该对象包含查询结果集。
处理结果集获取行数据
ResultSet对象提供了遍历查询结果的方法,通过next()移动光标到下一行,初始时光标位于第一行之前,每调用一次next(),光标下移一行,若当前行有效则返回true,否则返回false,以下为遍历结果集并获取数据的示例:

while (resultSet.next()) {
int id = resultSet.getInt("id"); // 通过列名获取整型数据
String name = resultSet.getString("name"); // 通过列名获取字符串数据
int age = resultSet.getInt("age");
// 也可通过列索引获取(从1开始)
// int id = resultSet.getInt(1);
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
根据数据类型选择对应的get方法,如getString()、getInt()、getTimestamp()等,列名不区分大小写,但需与数据库列名完全一致(包括特殊字符和空格),若列可能包含NULL值,需使用wasNull()方法判断,
String email = resultSet.getString("email");
if (resultSet.wasNull()) {
email = "NULL"; // 处理NULL值
}
封装数据对象(可选)
在实际开发中,通常将查询结果封装为Java对象(POJO)以便于业务处理,以User类为例:
public class User {
private int id;
private String name;
private int age;
// 构造方法、getter和setter省略
}
遍历结果集时创建User对象并赋值:
List<User> userList = new ArrayList<>();
while (resultSet.next()) {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setAge(resultSet.getInt("age"));
userList.add(user);
}
封装后的对象列表可直接用于业务逻辑层,提高代码可读性和复用性。
资源释放与异常处理
JDBC操作中,Connection、Statement和ResultSet均为资源对象,使用后需及时关闭以避免内存泄漏,推荐使用try-with-resources语句自动管理资源,确保即使发生异常也能正确释放:
String sql = "SELECT id, name FROM users";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
// 处理结果集
}
} catch (SQLException e) {
e.printStackTrace();
}
try-with-resources会自动调用资源的close()方法,顺序与声明顺序相反(先关闭ResultSet,再关闭Statement,最后关闭Connection)。
高级特性与最佳实践
-
连接池优化:直接使用
DriverManager获取连接性能较低,生产环境推荐使用连接池(如HikariCP、Druid),HikariCP配置示例:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名"); config.setUsername("用户名"); config.setPassword("密码"); HikariDataSource dataSource = new HikariDataSource(config); Connection connection = dataSource.getConnection(); -
批量操作:对于批量查询或更新,可使用
addBatch()和executeBatch()方法提高效率,减少数据库交互次数。 -
事务管理:通过
Connection的setAutoCommit(false)手动开启事务,执行完成后调用commit()提交,异常时调用rollback()回滚:connection.setAutoCommit(false); try { // 执行多个SQL操作 connection.commit(); } catch (SQLException e) { connection.rollback(); } -
ORM框架:对于复杂项目,可考虑使用MyBatis、Hibernate等ORM框架,简化数据库操作,减少重复代码。
通过以上步骤,可高效、安全地从数据库获取行数据,合理使用JDBC特性并结合连接池、事务管理等机制,能显著提升应用的性能和稳定性,在实际开发中,还需根据业务需求选择合适的数据获取方式,并注重异常处理和资源管理,确保程序的健壮性。

















