【JDBC】JDBC API 详解 ② ( Connection 数据库连接对象 | 获取 SQL 执行对象 - 普通、预编译 SQL 语句 | 事务管理 | 开启事物 | 提交事物 | 回滚事物 )

2023-03-25 11:44:13 浏览数 (1)

一、Connection 数据库连接对象


Connection 数据库连接对象 代表了 Java 应用 与 指定的数据库 的连接会话 , 通过该会话 , 可以执行 SQL 语句 , 并返回 SQL 语句的增删查改的结果 ;

Connection 数据库连接对象 有两个作用 :

  • 获取 SQL 执行对象
  • 管理事物

1、获取 SQL 执行对象

Connection 数据库连接对象 可以 获取 SQL 执行对象 , SQL 执行对象有以下 3 种 :

  • 普通 SQL 执行对象 :
代码语言:javascript复制
    Statement createStatement() throws SQLException;
  • 预编译 SQL 语句的 SQL 执行对象 : 这种方式执行 SQL 语句 , 可以 防止被 SQL 注入 ;
代码语言:javascript复制
    PreparedStatement prepareStatement(String sql)
        throws SQLException;
  • 执行存储过程对象 ( 不常用 ) :
代码语言:javascript复制
    CallableStatement prepareCall(String sql) throws SQLException;

2、事务管理

Connection 数据库连接对象 事务管理 :

  • 开启事物 : autoCommit 参数为 true 自动提交事物 , false 手动提交事物 ;
代码语言:javascript复制
	void setAutoCommit(boolean autoCommit) throws SQLException;
  • 提交事物 :
代码语言:javascript复制
    void commit() throws SQLException;
  • 回滚事物 :
代码语言:javascript复制
    void rollback() throws SQLException;

3、事务管理代码示例

在下面的代码中 ,

首先 , 先 获取 Connection 数据库连接对象 ;

代码语言:javascript复制
conn = DriverManager.getConnection(url, username, password);

然后 , 设置手动提交事物 ;

代码语言:javascript复制
conn.setAutoCommit(false); // 设置手动提交事务

再后 , 获取 预编译 SQL 语句的 SQL 执行对象 , 设置预编译的 SQL 语句 ;

代码语言:javascript复制
pstmt = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE user_id = ?");

最后 , 提交事物 ;

代码语言:javascript复制
conn.commit(); // 提交事务

此外 , 如果执行事物过程出现异常 , 则回滚事物 ;

代码语言:javascript复制
conn.rollback(); // 回滚事务

完整代码示例 :

代码语言:javascript复制
Connection conn = null;
PreparedStatement pstmt = null;
try {
    conn = DriverManager.getConnection(url, username, password);
    conn.setAutoCommit(false); // 设置手动提交事务
    pstmt = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE user_id = ?");
    pstmt.setInt(1, 1);
    pstmt.executeUpdate();
    pstmt.setInt(1, 2);
    pstmt.executeUpdate();
    conn.commit(); // 提交事务
} catch (SQLException e) {
    if (conn != null) {
        try {
            conn.rollback(); // 回滚事务
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    e.printStackTrace();
} finally {
    if (pstmt != null) {
        try {
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

0 人点赞