JDBC基本操作

JDBC基本操作

引言

这篇文章讲述了如何使用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 语句的对象


根据需求可以创建 StatementPreparedStatement 对象。


  • 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);
}


  • 更新语句(INSERTUPDATEDELETE:使用 executeUpdate() 方法,返回受影响的行数。


java

int rowsAffected = statement.executeUpdate("INSERT INTO users (name) VALUES ('John')");
System.out.println("Rows affected: " + rowsAffected);

5. 处理结果集(仅针对查询语句)


如果执行的是查询语句,需要对返回的 ResultSet 进行处理,获取所需的数据。

6. 关闭资源


为了避免资源泄漏,需要关闭 ResultSetStatementConnection 对象。


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();
        }
    }
}


LICENSED UNDER CC BY-NC-SA 4.0