在使用 Java 操作數(shù)據(jù)庫前,首先要確保開發(fā)環(huán)境已正確配置。你需要安裝 JDK(Java Development Kit),同時根據(jù)不同的數(shù)據(jù)庫類型,引入對應的 JDBC(Java Database Connectivity)驅(qū)動。例如,連接 MySQL 數(shù)據(jù)庫,需要下載并導入 MySQL Connector/J 驅(qū)動;連接 Oracle 數(shù)據(jù)庫,則要獲取 Oracle JDBC 驅(qū)動。將下載好的驅(qū)動 jar 包添加到項目的依賴中,Maven 項目可在pom.xml文件中添加依賴坐標,Gradle 項目則在build.gradle文件中配置。
以 MySQL 驅(qū)動為例,Maven 項目的pom.xml配置如下:
TypeScript取消自動換行復制
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>二、建立數(shù)據(jù)庫連接
Java 中通過DriverManager類和Connection接口來建立與數(shù)據(jù)庫的連接。以下是連接 MySQL 數(shù)據(jù)庫的示例代碼:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
if (connection != null) {
System.out.println("成功連接到數(shù)據(jù)庫!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代碼中,url指定了數(shù)據(jù)庫的地址、端口和數(shù)據(jù)庫名稱;username和password分別為數(shù)據(jù)庫的登錄用戶名和密碼。DriverManager.getConnection()方法用于嘗試建立連接,使用try-with-resources語句可以確保連接在使用完畢后自動關(guān)閉,避免資源泄漏。
執(zhí)行 SQL 語句:增刪改查操作
3.1 查詢操作(SELECT)
使用Statement或PreparedStatement接口執(zhí)行查詢語句。PreparedStatement相較于Statement,具有更好的安全性,能有效防止 SQL 注入攻擊。以下是使用PreparedStatement執(zhí)行查詢的示例:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DatabaseQuery {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "SELECT * FROM your_table_name WHERE id = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 1); // 設置參數(shù)值,假設id為整數(shù)類型
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代碼中,?為占位符,通過setInt()等方法設置參數(shù)值,executeQuery()方法執(zhí)行查詢并返回ResultSet對象,通過ResultSet的相關(guān)方法獲取查詢結(jié)果。
3.2 插入操作(insert)
使用PreparedStatement執(zhí)行插入語句,示例如下:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseInsert {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "insert INTO your_table_name (name, age) VALUES (?, ?)";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, "John");
preparedStatement.setInt(2, 30);
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("數(shù)據(jù)插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}executeUpdate()方法用于執(zhí)行增刪改操作,返回受影響的行數(shù)。
3.3 更新操作(UPDATE)
更新數(shù)據(jù)的示例代碼如下:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseUpdate {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "UPDATE your_table_name SET age = ? WHERE name = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 31);
preparedStatement.setString(2, "John");
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("數(shù)據(jù)更新成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}3.4 刪除操作(delete)
刪除數(shù)據(jù)的代碼示例:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseDelete {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "delete FROM your_table_name WHERE id = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 1);
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("數(shù)據(jù)刪除成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
數(shù)據(jù)庫事務處理
數(shù)據(jù)庫事務具有原子性、一致性、隔離性和持久性(ACID)特性。在 Java 中,通過Connection接口的相關(guān)方法來控制事務。示例代碼如下:
TypeScript取消自動換行復制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseTransaction {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
connection.setAutoCommit(false); // 關(guān)閉自動提交,開啟事務
String sql1 = "UPDATE account SET balance = balance - 100 WHERE id = 1";
String sql2 = "UPDATE account SET balance = balance + 100 WHERE id = 2";
try (PreparedStatement statement1 = connection.prepareStatement(sql1);
PreparedStatement statement2 = connection.prepareStatement(sql2)) {
statement1.executeUpdate();
statement2.executeUpdate();
connection.commit(); // 提交事務
System.out.println("事務處理成功!");
} catch (SQLException e) {
connection.rollback(); // 回滾事務
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代碼中,通過setAutoCommit(false)關(guān)閉自動提交開啟事務,commit()方法提交事務,rollback()方法回滾事務,確保數(shù)據(jù)的一致性和完整性。
資源釋放與異常處理
在 Java 數(shù)據(jù)庫編程中,及時釋放數(shù)據(jù)庫連接、語句對象(Statement或PreparedStatement)和結(jié)果集對象(ResultSet)至關(guān)重要。使用try-with-resources語句可以方便地實現(xiàn)資源的自動關(guān)閉。對于異常處理,捕獲SQLException并進行適當處理,例如記錄日志或向用戶返回友好的錯誤提示,有助于提高程序的健壯性和可維護性。