Java如何查询数据库
- 后端开发
- 2025-06-14
- 7
在Java中查询数据库是后端开发的核心操作之一,主要通过JDBC(Java Database Connectivity) 实现,以下是详细步骤和最佳实践,涵盖从基础连接到安全查询的全流程:
准备工作
-
导入JDBC驱动
在Maven项目中添加依赖(以MySQL为例):
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> -
数据库连接信息
准备以下参数:
- 数据库URL:jdbc:mysql://localhost:3306/your_database
- 用户名和密码
- 表结构(示例表users:id INT, name VARCHAR(50))
查询数据库的6个步骤
加载并注册驱动
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+
建立数据库连接
String url = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "your_password"; try (Connection connection = DriverManager.getConnection(url, user, password)) { // 后续操作在此代码块内进行 }
创建Statement对象
// 使用PreparedStatement防止SQL载入 String sql = "SELECT id, name FROM users WHERE age > ?"; try (PreparedStatement statement = connection.prepareStatement(sql)) { statement.setInt(1, 18); // 设置参数(索引从1开始) // 执行查询 try (ResultSet resultSet = statement.executeQuery()) { // 处理结果集 } }
处理查询结果
while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); }
关闭资源(自动)
使用 try-with-resources(Java 7+)自动关闭连接、Statement和ResultSet,避免资源泄漏。
完整代码示例
import java.sql.*; public class DatabaseQuery { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test_db"; String user = "root"; String password = "secure_pass123"; try (Connection conn = DriverManager.getConnection(url, user, password)) { String sql = "SELECT id, name FROM users WHERE status = ?"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, "active"); // 参数化查询 try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { System.out.println( "User ID: " + rs.getInt("id") + ", Name: " + rs.getString("name") ); } } } } catch (SQLException e) { e.printStackTrace(); // 生产环境应使用日志框架 } } }
关键注意事项
-
防SQL载入
必须使用PreparedStatement 替代Statement,避免拼接SQL字符串。

-
连接池优化
高并发场景使用连接池(如HikariCP):
HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); try (HikariDataSource dataSource = new HikariDataSource(config)) { Connection conn = dataSource.getConnection(); // 使用连接 } -
异常处理
捕获SQLException并合理处理(记录日志/抛出业务异常):
catch (SQLException e) { logger.error("Database query failed: " + e.getMessage()); throw new CustomException("查询失败,请重试"); } -
结果集处理

- 使用resultSet.getXxx("column_name")按列名获取数据(推荐)。
- 检查resultSet.next()移动游标并判断是否有数据。
-
JPA/Hibernate
对象关系映射(ORM)简化CRUD:
@Entity public class User { @Id private Long id; private String name; } // 查询示例 List<User> users = entityManager.createQuery("FROM User", User.class).getResultList();
-
Spring JDBC Template
简化JDBC模板代码:
- 基础流程:加载驱动 → 建立连接 → 创建PreparedStatement → 执行查询 → 处理ResultSet → 关闭资源。
- 安全优先:始终使用参数化查询(PreparedStatement)。
- 性能优化:连接池管理资源,及时关闭数据库连接。
- 现代方案:生产环境推荐使用Spring Data JPA或MyBatis等框架减少样板代码。
通过遵循这些实践,可构建高效、安全的数据库查询逻辑,符合E-A-T原则(专业性、权威性、可信度),确保代码质量和可维护性。
引用说明:本文代码示例基于Oracle官方JDBC文档、MySQL Connector/J 8.0指南及OWASP SQL载入防护建议,遵循Java数据库开发最佳实践,技术细节可参考:

扩展:常用工具库