JDBC(Java Database Connectivity)是 Java 提供的一组用于连接和操作数据库的 API。JDBC 提供了一种标准的接口来访问数据库,从而使得 Java 应用程序能够与数据库进行交互。以下是 JDBC 的知识点详解,包括常用的 JDBC 操作、相关类和接口的详细解释。
1. JDBC 核心概念
JDBC 主要包含以下几个核心概念:
- 连接(Connection):用来与数据库建立连接。
- 语句(Statement):用来执行 SQL 查询。
- 结果集(ResultSet):用于存储从数据库查询出来的数据。
- 异常(SQLException):用于捕获 SQL 执行中的异常。
2. JDBC 的架构
JDBC 采用了两层架构:客户端和数据库。它通过数据库驱动(JDBC Driver)与数据库进行交互。JDBC 驱动有四种类型:
- JDBC-ODBC 桥接驱动:通过 ODBC 连接数据库(不推荐使用)。
- 本地协议驱动:通过数据库的原生协议与数据库连接(如 MySQL 驱动)。
- 网络协议驱动:通过一个中间件与数据库通信。
- 直接连接驱动:直接通过数据库的原生 API 与数据库进行通信。
3. JDBC 连接步骤
3.1 加载 JDBC 驱动
首先,必须加载数据库的 JDBC 驱动。大多数数据库的 JDBC 驱动都提供了 Class.forName()
方法来动态加载。
Class.forName("com.mysql.cj.jdbc.Driver");
对于 Java 6 及以上版本,使用 DriverManager
会自动加载驱动,不需要显式调用 Class.forName()
。
3.2 获取数据库连接
使用 DriverManager
或数据源(DataSource)来获取数据库连接。
// 获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "username", "password");
jdbc:mysql://localhost:3306/database_name
:数据库的 URL。"username"
和"password"
:数据库的用户名和密码。
3.3 创建 SQL 语句对象(Statement)
有三种类型的 Statement
可供选择:
Statement
:适用于静态 SQL 查询。PreparedStatement
:适用于动态 SQL 查询(参数化查询,防止 SQL 注入)。CallableStatement
:用于调用存储过程。
Statement stmt = conn.createStatement();
3.4 执行 SQL 查询
执行 SQL 语句并获取结果,常用的执行方法有:
executeQuery(String sql)
:用于执行 SELECT 查询,返回ResultSet
对象。executeUpdate(String sql)
:用于执行 INSERT、UPDATE、DELETE 等 DML 操作,返回受影响的行数。execute(String sql)
:执行任何 SQL 语句,返回一个布尔值,指示查询是否返回了结果集。
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
3.5 处理结果集(ResultSet)
从 ResultSet
中提取数据,常用的方法:
next()
:移动光标到下一个行。getString(String columnLabel)
:获取指定列的字符串值。getInt(String columnLabel)
:获取指定列的整数值。getDate(String columnLabel)
:获取指定列的日期值。
while (rs.next()) {
String username = rs.getString("username");
int age = rs.getInt("age");
System.out.println("Username: " + username + ", Age: " + age);
}
3.6 关闭资源
完成数据库操作后,必须关闭数据库连接、语句和结果集以释放资源。
rs.close();
stmt.close();
conn.close();
4. 常见的 JDBC 接口与类
- Connection:表示与数据库的连接。
createStatement()
:创建一个 Statement 对象。prepareStatement(String sql)
:创建一个 PreparedStatement 对象。prepareCall(String sql)
:创建一个 CallableStatement 对象。close()
:关闭连接。setAutoCommit(boolean autoCommit)
:设置事务的自动提交模式。
- Statement:用于执行 SQL 语句。
executeQuery(String sql)
:执行查询语句,返回 ResultSet。executeUpdate(String sql)
:执行更新语句(INSERT、UPDATE、DELETE),返回影响的行数。
- PreparedStatement:用于执行预编译的 SQL 语句。
setInt(int parameterIndex, int x)
:设置指定位置的参数。setString(int parameterIndex, String x)
:设置指定位置的字符串参数。
- ResultSet:用于存储查询的结果。
next()
:指向结果集的下一行。getString(String columnLabel)
:获取指定列的字符串值。getInt(String columnLabel)
:获取指定列的整数值。
- SQLException:用于处理 JDBC 中的异常。
5. JDBC 事务管理
事务是数据库中的一个重要概念,它由一系列的操作组成,要么全部成功,要么全部失败。JDBC 提供了管理事务的方法。
- 自动提交模式(Auto Commit):默认情况下,JDBC 使用自动提交模式,即每个 SQL 语句都会作为一个单独的事务执行。
conn.setAutoCommit(false); // 禁用自动提交
- 提交事务(commit):
conn.commit(); // 提交事务
- 回滚事务(rollback):
conn.rollback(); // 回滚事务
6. PreparedStatement(预编译语句)
PreparedStatement
是 Statement
的一种扩展,用于执行参数化的 SQL 查询,具有以下优点:
- 可以防止 SQL 注入攻击。
- 提高性能,因为 SQL 语句只需要编译一次。
示例:
String sql = "SELECT * FROM users WHERE username = ? AND age = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "john");
pstmt.setInt(2, 30);
ResultSet rs = pstmt.executeQuery();
7. JDBC 连接池
JDBC 连接池是为了提高性能而设计的,它可以避免每次数据库操作时都重新建立连接。常见的连接池框架有:
- HikariCP
- C3P0
- DBCP
8. 批量处理(Batch Processing)
批量处理可以一次性提交多个 SQL 语句,提高性能。
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "root", "password");
conn.setAutoCommit(false); // 禁用自动提交
String sql = "INSERT INTO users (username, age) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
pstmt.setString(1, "user" + i);
pstmt.setInt(2, 20 + i);
pstmt.addBatch(); // 将语句添加到批处理
}
int[] updateCounts = pstmt.executeBatch(); // 执行批量操作
conn.commit(); // 提交事务
9. 常见 JDBC 异常处理
SQLException
是 JDBC 操作过程中抛出的主要异常,可以通过捕获 SQLException
来处理错误。
try {
// JDBC 操作
} catch (SQLException e) {
System.out.println("SQL 错误代码: " + e.getErrorCode());
System.out.println("SQL 错误信息: " + e.getMessage());
e.printStackTrace();
}
总结
JDBC 是 Java 中与数据库交互的基础,涵盖了从连接数据库、执行 SQL 查询到处理结果集等一系列操作。理解 JDBC 的核心概念和常用操作,对于开发数据库驱动的 Java 应用至关重要。通过使用 Connection
、Statement
、ResultSet
等类,我们可以实现高效、灵活的数据库操作。
如果你有更多关于 JDBC 的问题,或者需要进一步了解某一部分的细节,请随时提问!