JDBC 使用流程详解

1. 加载数据库驱动

目的:注册数据库驱动类,使 JDBC 能识别特定数据库(如 MySQL、Oracle)。
代码示例

// JDBC 4.0+ 后无需显式加载驱动(SPI 自动发现),但部分旧项目仍需手动加载
Class.forName("com.mysql.cj.jdbc.Driver");

2. 建立数据库连接

目的:通过 DriverManager 获取数据库连接对象 Connection
代码示例

String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);

参数说明

  • URL 格式jdbc:数据库类型://主机:端口/数据库名?参数键值对

  • 常见参数

    • useSSL=false:禁用 SSL(测试环境)。

    • serverTimezone=UTC:设置时区(避免时区错误)。


3. 创建 Statement 对象

目的:通过 Connection 创建 Statement 或 PreparedStatement,用于执行 SQL。

(1) Statement(普通语句)
Statement statement = connection.createStatement();

(2) PreparedStatement(预编译语句,推荐) 

String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1001); // 参数索引从 1 开始

优势

  • 防 SQL 注入:通过占位符(?)预编译 SQL。

  • 性能优化:重复执行相同 SQL 时复用编译结果。


4. 执行 SQL 并处理结果

目的:执行 SQL 并处理返回的 ResultSet(查询)或影响行数(更新)。

(1) 查询操作(SELECT)
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}
(2) 更新操作(INSERT/UPDATE/DELETE)
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "张三");
pstmt.setInt(2, 25);
int affectedRows = pstmt.executeUpdate();
System.out.println("影响行数: " + affectedRows);

5. 关闭资源

目的:释放数据库连接、Statement、ResultSet 等资源,避免内存泄漏。
代码示例

// 在 finally 块或 try-with-resources 中关闭资源
try {
    if (resultSet != null) resultSet.close();
    if (preparedStatement != null) preparedStatement.close();
    if (connection != null) connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

优化方案:使用 try-with-resources(Java 7+)自动关闭资源:

try (
    Connection conn = DriverManager.getConnection(url, user, password);
    PreparedStatement pstmt = conn.prepareStatement(sql);
    ResultSet rs = pstmt.executeQuery();
) {
    while (rs.next()) {
        // 处理结果
    }
} catch (SQLException e) {
    e.printStackTrace();
}

6. 异常处理

目的:捕获 SQLException,处理数据库操作中的错误。
代码示例

try {
    // JDBC 操作
} catch (SQLException e) {
    System.err.println("数据库错误: " + e.getMessage());
    e.printStackTrace();
} finally {
    // 关闭资源
}

完整代码示例

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "123456";
        String sql = "SELECT * FROM user WHERE age > ?";

        try (
            Connection conn = DriverManager.getConnection(url, user, password);
            PreparedStatement pstmt = conn.prepareStatement(sql);
        ) {
            pstmt.setInt(1, 18);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.printf("ID: %d, Name: %s, Age: %d\n", id, name, age);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

JDBC 进阶优化

  1. 使用连接池(如 HikariCP、Druid):避免频繁创建/关闭连接,提升性能。

  2. 批量操作:通过 addBatch() 和 executeBatch() 提升批量插入/更新效率。

  3. 事务管理:通过 connection.setAutoCommit(false) 手动控制事务提交与回滚。


你可能感兴趣的:(java程序员成长之路,数据库,jdbc)