JDBC(Java Database Connectivity)是 Java 用于訪問數據庫的標準 API,它允許 Java 程序與各種不同類型的數據庫進行交互, 其連接數據庫的過程主要包含以下幾個步驟:
1. 導入 JDBC 驅動依賴
在使用 JDBC 連接數據庫之前,需要導入相應數據庫的 JDBC 驅動。如果是使用 Maven 構建項目,以 MySQL 為例,在pom.xml
文件中添加如下依賴:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version> <!-- 根據實際需求選擇版本 -->
</dependency>
2. 加載 JDBC 驅動
在 Java 代碼中,需要加載數據庫的 JDBC 驅動,讓 Java 程序知道使用哪個驅動來連接數據庫。使用Class.forName()
方法加載驅動類,例如連接 MySQL 數據庫
try {Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {e.printStackTrace();
}
3. 建立數據庫連接
使用DriverManager.getConnection()
方法來建立與數據庫的連接,該方法需要傳入數據庫的 URL、用戶名和密碼。以下是不同數據庫連接 URL 的示例:
- MySQL:
String url = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("數據庫連接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}
jdbc:mysql://
是 MySQL 的 JDBC URL 前綴,localhost
是數據庫主機地址,3306
是端口號,mydatabase
是數據庫名,后面的參數用于配置連接屬性,如關閉 SSL 驗證和設置時區。
- PostgreSQL:
String url = "jdbc:postgresql://localhost:5432/mydatabase";
String username = "postgres";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("數據庫連接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}
jdbc:postgresql://
是 PostgreSQL 的 JDBC URL 前綴,5432
是默認端口號。
- Oracle:
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "tiger";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("數據庫連接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}
jdbc:oracle:thin:
是 Oracle 的 JDBC URL 前綴,1521
是默認端口號,orcl
是數據庫實例名。
4. 創建 Statement 對象
連接建立后,需要創建Statement
、PreparedStatement
或CallableStatement
對象,用于執行 SQL 語句
- Statement:最基本的用于執行 SQL 語句的對象,適用于執行靜態 SQL 語句,例如:
try (java.sql.Statement statement = connection.createStatement()) {// 執行SQL查詢java.sql.ResultSet resultSet = statement.executeQuery("SELECT * FROM users");while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
- PreparedStatement:預編譯 SQL 語句,能有效防止 SQL 注入攻擊,并且性能更好,適用于執行動態 SQL 語句,例如:
String sql = "SELECT * FROM users WHERE username = ?";
try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, "admin");java.sql.ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
- CallableStatement:用于執行數據庫中的存儲過程,例如:
String sql = "{call get_user_count(?)}";
try (java.sql.CallableStatement callableStatement = connection.prepareCall(sql)) {callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);callableStatement.execute();int count = callableStatement.getInt(1);System.out.println("用戶數量: " + count);
} catch (java.sql.SQLException e) {e.printStackTrace();
}
5. 執行 SQL 語句
根據不同的需求,使用上述創建的對象執行 SQL 語句,如executeQuery()
用于執行查詢語句并返回結果集(ResultSet
),executeUpdate()
用于執行增刪改操作并返回受影響的行數,execute()
用于執行任意 SQL 語句并返回一個布爾值表示是否返回結果集。
6. 處理結果集(如果有)
當執行查詢語句后,會得到一個ResultSet
對象,通過調用ResultSet
的方法(如getString()
、getInt()
等)來獲取查詢結果集中的數據,并進行相應的處理。
7. 關閉資源
在完成數據庫操作后,需要按照ResultSet
、Statement
(或PreparedStatement
、CallableStatement
)、Connection
的順序關閉資源,以釋放數據庫連接和其他相關資源,防止資源泄漏。示例代碼如下:
java.sql.ResultSet resultSet = null;
java.sql.PreparedStatement preparedStatement = null;
try {// 執行操作...
} catch (java.sql.SQLException e) {e.printStackTrace();
} finally {if (resultSet != null) {try {resultSet.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
}
或者使用 Java 7 引入的try-with-resources
語句,它會自動關閉實現了AutoCloseable
接口的資源,簡化代碼編寫:
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password);java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql);java.sql.ResultSet resultSet = preparedStatement.executeQuery()) {// 處理結果集...
} catch (java.sql.SQLException e) {e.printStackTrace();
}