上一篇                     
               
			  Java如何读取数据库?
- 后端开发
- 2025-06-03
- 3056
 使用JDBC连接数据库,加载驱动后建立Connection,通过Statement执行SQL查询,处理ResultSet结果集,最后关闭连接释放资源,常用类包括DriverManager、Connection、Statement和ResultSet。
 
在Java中读取数据库是开发中最常见的任务之一,无论是构建Web应用、企业系统还是数据分析工具,都离不开数据库交互,下面将详细讲解使用JDBC(Java Database Connectivity)技术读取数据库的标准流程,包含完整代码示例、安全注意事项和性能优化建议。
核心步骤:JDBC读取数据库的6个关键环节
以下是Java通过JDBC读取数据库的标准流程:

| 步骤 | 作用 | 关键类/接口 | 
|---|---|---|
| 加载驱动 | 建立与数据库的通信桥梁 | Class.forName() | 
| 建立连接 | 创建与数据库的会话 | DriverManager.getConnection() | 
| 创建Statement | 定义SQL执行对象 | createStatement()/prepareStatement() | 
| 执行查询 | 发送SQL到数据库 | executeQuery() | 
| 处理结果 | 解析返回的数据 | ResultSet | 
| 关闭资源 | 释放连接避免泄漏 | close() | 
完整代码示例(以MySQL为例)
import java.sql.*;
public class ReadDatabaseExample {
    // 数据库配置信息
    private static final String URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String USER = "root";
    private static final String PASSWORD = "yourpassword";
    public static void main(String[] args) {
        // 使用try-with-resources自动关闭资源(Java 7+)
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             Statement stmt = conn.createStatement()) {
            // 1. 加载驱动(JDBC 4.0+ 可省略)
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2. 执行SQL查询
            String sql = "SELECT id, name, email FROM users";
            ResultSet rs = stmt.executeQuery(sql);
            // 3. 遍历结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
            }
        } catch (ClassNotFoundException e) {
            System.err.println("MySQL驱动未找到: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("数据库错误: " + e.getMessage());
        }
    }
} 
关键安全与性能优化
防止SQL注入攻击
永远不要拼接SQL字符串! 使用PreparedStatement:

String sql = "SELECT * FROM users WHERE email = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, "user@example.com"); // 安全设置参数
    ResultSet rs = pstmt.executeQuery();
    // 处理结果...
} 
资源关闭最佳实践
- 使用 try-with-resources(推荐)自动关闭Connection,Statement,ResultSet
- 手动关闭顺序:ResultSet→Statement→Connection
使用连接池提升性能
直接连接数据库开销大,推荐连接池技术:
// 示例:HikariCP连接池配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl(URL);
config.setUsername(USER);
config.setPassword(PASSWORD);
try (HikariDataSource ds = new HikariDataSource(config);
     Connection conn = ds.getConnection()) {
    // 执行数据库操作...
} 
常见问题解决方案
| 问题现象 | 原因 | 解决方案 | 
|---|---|---|
| No suitable driver found | 驱动未加载 | 检查驱动包是否在classpath中 | 
| Connection refused | 数据库服务未启动 | 确认数据库IP/端口是否正确 | 
| 查询结果为空 | SQL语法错误 | 打印SQL并在数据库客户端测试 | 
| 内存泄漏 | 未关闭连接 | 使用try-with-resources或finally块关闭资源 | 
进阶技术选型
- ORM框架:简化操作(推荐MyBatis、Hibernate)
- 异步处理:使用CompletableFuture + 连接池
- 事务管理: conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多个SQL... conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 }
引用说明
- Oracle官方JDBC教程
- MySQL Connector/J文档
- HikariCP性能基准报告
- OWASP SQL注入防护指南
最佳实践提示:生产环境务必配置连接池、使用PreparedStatement,并对敏感数据库信息加密(如通过Jasypt或环境变量管理密码)。
 
 
 
			 
			 
			 
			 
			 
			