上一篇
Java如何查询数据库
- 后端开发
- 2025-06-14
- 4219
在Java中查询数据库通常使用JDBC API:加载驱动、建立连接、创建Statement对象执行SQL查询语句,通过ResultSet处理返回数据,最后关闭连接释放资源。
在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)
)
- 数据库URL:
查询数据库的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模板代码:jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")) );
- 基础流程:加载驱动 → 建立连接 → 创建PreparedStatement → 执行查询 → 处理ResultSet → 关闭资源。
- 安全优先:始终使用参数化查询(PreparedStatement)。
- 性能优化:连接池管理资源,及时关闭数据库连接。
- 现代方案:生产环境推荐使用Spring Data JPA或MyBatis等框架减少样板代码。
通过遵循这些实践,可构建高效、安全的数据库查询逻辑,符合E-A-T原则(专业性、权威性、可信度),确保代码质量和可维护性。
引用说明:本文代码示例基于Oracle官方JDBC文档、MySQL Connector/J 8.0指南及OWASP SQL注入防护建议,遵循Java数据库开发最佳实践,技术细节可参考:
- Oracle JDBC Tutorial
- MySQL Connector/J Documentation
- HikariCP GitHub