JDBC(Java Database Connectivity)是 Java 編程語言中用于連接和執(zhí)行數(shù)據(jù)庫操作的一套 API。JDBC 提供了一種基于標準的方法來建立數(shù)據(jù)庫連接、執(zhí)行 SQL 語句、處理結(jié)果集等。以下是 JDBC 的一些主要接口:
1. DriverManager
用途: DriverManager 類是 JDBC 的管理層,用于管理 JDBC 驅(qū)動程序的加載和建立數(shù)據(jù)庫連接。
關(guān)鍵方法:
- getConnection(String url, String user, String password): 連接到數(shù)據(jù)庫。
2. Connection
用途: Connection 接口代表數(shù)據(jù)庫連接。它用于執(zhí)行 SQL 語句和管理事務(wù)。
關(guān)鍵方法:
- createStatement(), prepareStatement(String sql), prepareCall(String sql): 創(chuàng)建用于執(zhí)行 SQL 的 Statement、PreparedStatement 和 CallableStatement 對象。
- setAutoCommit(boolean autoCommit), commit(), rollback(): 管理事務(wù)。
- close(): 關(guān)閉連接。
3. Statement
用途: Statement 接口用于執(zhí)行靜態(tài) SQL 語句并返回它所生成的結(jié)果。
關(guān)鍵方法:
- executeQuery(String sql): 執(zhí)行返回單個 ResultSet 對象的 SQL 語句(如 SELECT)。
- executeUpdate(String sql): 執(zhí)行 SQL DML(數(shù)據(jù)操作語言)語句,如 INSERT、UPDATE 或 DELETE。
close(): 關(guān)閉 Statement 對象。
4. PreparedStatement
用途: PreparedStatement 接口擴展了 Statement 接口,允許使用預(yù)編譯的 SQL 語句。這提高了性能并提供了一種防止 SQL 注入的方法。
關(guān)鍵方法:
- setInt(int parameterIndex, int value), setString(int parameterIndex, String value), 等: 設(shè)置參數(shù)值。
- executeQuery(), executeUpdate(): 執(zhí)行 SQL 語句。
5. CallableStatement
用途: CallableStatement 接口用于執(zhí)行數(shù)據(jù)庫存儲過程。
關(guān)鍵方法:
- registerOutParameter(int parameterIndex, int sqlType): 注冊輸出參數(shù)。
- setInt(int parameterIndex, int value), setString(int parameterIndex, String value), 等: 設(shè)置輸入?yún)?shù)。
- execute(): 執(zhí)行存儲過程。
6. ResultSet
用途: ResultSet 接口表示數(shù)據(jù)庫查詢結(jié)果。它用于讀取和遍歷數(shù)據(jù)。
關(guān)鍵方法:
- next(): 移動到結(jié)果集的下一行。
- getInt(String columnLabel), getString(String columnLabel), 等: 獲取當前行的列值。
- close(): 關(guān)閉結(jié)果集。
7. DataSource
用途: DataSource 接口是一個替代 DriverManager 的方式,用于建立數(shù)據(jù)庫連接。它通常與連接池一起使用。
關(guān)鍵方法:
- getConnection(): 獲取數(shù)據(jù)庫連接。
這些接口組成了 JDBC 的核心,通過它們可以實現(xiàn) Java 應(yīng)用程序與多種數(shù)據(jù)庫之間的交互。使用 JDBC,開發(fā)者可以編寫?yīng)毩⒂诘讓訑?shù)據(jù)庫的代碼,從而提高應(yīng)用程序的可移植性。
執(zhí)行一個事務(wù)的流程
DataSource ds = // 獲取 DataSource
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ds.getConnection();
conn.setAutoCommit(false);
String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
pstmt = conn.prepareStatement(sql);
// 設(shè)置參數(shù)
pstmt.setString(1, "value1");
pstmt.setInt(2, 123);
// 執(zhí)行更新
pstmt.executeUpdate();
// 可以添加更多的 SQL 操作
conn.commit(); // 提交事務(wù)
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback(); // 回滾事務(wù)
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
// 關(guān)閉資源
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
DataSource通常是我們使用的連接池,比如Springboot默認使用的HikariCP連接池:
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/yourdb");
ds.setUsername("username");
ds.setPassword("password");
// 其他配置...