引言
这篇文章讲述了如何使用JDBC
JDBC
JDBC(Java Database Connectivity)是 Java 用于操作数据库的标准 API,以下将详细介绍 JDBC 操作数据库的基本步骤,以及在事务处理时的特殊步骤。
1.获取数据库驱动
在使用 JDBC 操作数据库之前,需要先加载相应的数据库驱动程序。不同的数据库有不同的驱动类,例如 MySQL 的驱动类是 com.mysql.cj.jdbc.Driver
。
java
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
使用 DriverManager.getConnection()
方法建立与数据库的连接,需要提供数据库的 URL、用户名和密码。
java
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);
// 后续操作
} catch (SQLException e) {
e.printStackTrace();
}
3. 创建执行 SQL 语句的对象
根据需求可以创建 Statement
或 PreparedStatement
对象。
Statement
:用于执行静态 SQL 语句。
java
Statement statement = connection.createStatement();
PreparedStatement
:用于执行预编译的 SQL 语句,可防止 SQL 注入攻击。
java
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
4. 执行 SQL 语句
根据 SQL 语句的类型,使用不同的方法执行。
查询语句(
SELECT
):使用executeQuery()
方法,返回ResultSet
对象。
java
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
更新语句(
INSERT
、UPDATE
、DELETE
):使用executeUpdate()
方法,返回受影响的行数。
java
int rowsAffected = statement.executeUpdate("INSERT INTO users (name) VALUES ('John')");
System.out.println("Rows affected: " + rowsAffected);
5. 处理结果集(仅针对查询语句)
如果执行的是查询语句,需要对返回的 ResultSet
进行处理,获取所需的数据。
6. 关闭资源
为了避免资源泄漏,需要关闭 ResultSet
、Statement
和 Connection
对象。
java
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
事务处理步骤
在数据库操作中,事务是一组不可分割的操作序列,要么全部执行成功,要么全部失败。以下是在 JDBC 中进行事务处理的特殊步骤:
1. 关闭自动提交模式
默认情况下,JDBC 连接是自动提交模式,即每条 SQL 语句都会立即提交到数据库。在进行事务处理时,需要将自动提交模式关闭。
java
connection.setAutoCommit(false);
2. 执行一系列 SQL 语句
在关闭自动提交模式后,可以执行一系列相关的 SQL 语句。
java
try {
// 执行 SQL 语句
statement.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");
statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// 更多 SQL 语句...
// 提交事务
connection.commit();
System.out.println("Transaction committed successfully.");
} catch (SQLException e) {
// 回滚事务
try {
connection.rollback();
System.out.println("Transaction rolled back due to an error.");
} catch (SQLException rollbackException) {
rollbackException.printStackTrace();
}
e.printStackTrace();
}
3. 提交或回滚事务
提交事务:如果所有 SQL 语句都执行成功,调用
connection.commit()
方法将事务提交到数据库。回滚事务:如果在执行过程中出现异常,调用
connection.rollback()
方法将事务回滚,撤销之前执行的所有 SQL 语句。
4. 恢复自动提交模式(可选)
在事务处理完成后,可以根据需要恢复自动提交模式。
java
connection.setAutoCommit(true);
完整示例代码
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTransactionExample {
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);
try (Statement statement = connection.createStatement()) {
// 执行 SQL 语句
statement.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");
statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// 提交事务
connection.commit();
System.out.println("Transaction committed successfully.");
} catch (SQLException e) {
// 回滚事务
try {
connection.rollback();
System.out.println("Transaction rolled back due to an error.");
} catch (SQLException rollbackException) {
rollbackException.printStackTrace();
}
e.printStackTrace();
} finally {
// 恢复自动提交模式
connection.setAutoCommit(true);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}