文章目录

  • 一、Connection 数据库连接对象
  • 1、获取 SQL 执行对象
  • 2、事务管理
  • 3、事务管理代码示例






一、Connection 数据库连接对象



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



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

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


1、获取 SQL 执行对象



Connection 数据库连接对象 可以 获取 SQL 执行对象

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



2、事务管理



Connection 数据库连接对象

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



3、事务管理代码示例



在下面的代码中 ,

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

conn = DriverManager.getConnection(url, username, password);

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

conn.setAutoCommit(false); // 设置手动提交事务

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

pstmt = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE user_id = ?");

最后 , 提交事物 ;

conn.commit(); // 提交事务

此外 ,则回滚事物 ;

conn.rollback(); // 回滚事务



完整代码示例 :

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