目的:注册数据库驱动类,使 JDBC 能识别特定数据库(如 MySQL、Oracle)。
代码示例:
// JDBC 4.0+ 后无需显式加载驱动(SPI 自动发现),但部分旧项目仍需手动加载
Class.forName("com.mysql.cj.jdbc.Driver");
目的:通过 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
:设置时区(避免时区错误)。
目的:通过 Connection
创建 Statement
或 PreparedStatement
,用于执行 SQL。
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 时复用编译结果。
目的:执行 SQL 并处理返回的 ResultSet
(查询)或影响行数(更新)。
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
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);
目的:释放数据库连接、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();
}
目的:捕获 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();
}
}
}
使用连接池(如 HikariCP、Druid):避免频繁创建/关闭连接,提升性能。
批量操作:通过 addBatch()
和 executeBatch()
提升批量插入/更新效率。
事务管理:通过 connection.setAutoCommit(false)
手动控制事务提交与回滚。