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 进阶优化
-
使用连接池(如 HikariCP、Druid):避免频繁创建/关闭连接,提升性能。
-
批量操作:通过
addBatch()
和executeBatch()
提升批量插入/更新效率。 -
事务管理:通过
connection.setAutoCommit(false)
手动控制事务提交与回滚。