Java JDBC 事务管理示例

本教程解释了 JDBC 事务类型、数据类型、事务管理方法,以及如何在 Java 程序中使用它们:

JDBC 教程系列的JDBC ResultSet教程中,我们学习了使用 JDBC ResultSet 来检索数据。

在本教程中,我们将讨论 JDBC 中的事务类型。我们已经在之前的教程中看到了对事务类型的简要介绍。在这里,我们将详细了解。我们还将介绍 JDBC 中的数据类型以及如何在 Java 程序中使用它。

数据库将具有不同的数据类型,Java 将具有不同的数据类型。JDBC 将管理这种差异化。让我们准备好了解 JDBC 中的重要主题。

JDBC 事务管理

操作序列(SQL 语句)被视为称为事务的单个单元。事务管理对于面向 RDBMS 的应用程序保持数据完整性和一致性很重要。

在执行事务时,我们将使用 getXXX 和 setXXX 方法来检索和设置 ResultSet 对象中的数据。XXX 代表列的数据类型。我们将在本教程中讨论 JDBC 的事务和数据类型。

交易类型

在 JDBC 中,每个 SQL 查询都将被视为一个事务。当我们在 JDBC 中创建数据库连接时,它将以自动提交模式运行(自动提交值为 TRUE)。SQL 语句执行后,会自动提交。

有时,我们可能希望在执行更多 SQL 语句后提交事务。这时,我们需要将自动提交值设置为 False。因此在执行所有查询之前不会提交数据。如果我们在事务中遇到异常,我们可以回滚()更改并使其像以前一样。事务管理可以很好地解释——使用 ACID 属性。

酸是什么意思

  • A–原子性 ->如果所有查询都成功执行,数据将被提交,否则不会。
  • C–Consistency -> DB 在任何事务之后必须处于一致状态。
  • I– Isolation ->事务与其他事务隔离。
  • D-Durability ->如果事务提交一次,它将保持始终提交。

事务管理中有三个最重要的功能。 他们是:

  • 提交: 在执行 SQL 语句后,我们希望将更改永久保存在数据库中。我们应该调用 commit() 方法。通常,提交意味着它将在数据库中永久进行更改。我们无法撤消/撤销更改。但是我们可以更改数据库中的数据。
  • 回滚: 回滚撤消更改,直到最后一次提交或提到的保存点。有时我们可能想要撤消更改。比如我们有一个嵌套查询,一部分已经执行成功,另一部分抛出了一些异常。那时,我们要撤消第一部分所做的更改,如果发生异常,我们应该调用 Rollback() 方法来执行此操作。
  • 保存点: 保存点有助于在事务中创建检查点,并允许回滚到该特定保存点。为事务创建的任何保存点都将在事务提交或回滚后自动销毁并失效。

到目前为止,我们已经了解了什么是提交、回滚和保存点及其操作。下面,我们将看到它的方法以及如何在程序中使用它。

事务管理方法

连接接口提供了 5 种事务管理方法。它们如下:

#1) setAutoCommit() 方法

默认情况下,AutoCommit 值的值为 TRUE。SQL 语句执行后,会自动提交。通过使用 setAutoCommit() 方法,我们可以将值设置为 AutoCommit。

#2) Commit() 方法

commit 方法用于提交数据。SQL语句执行完毕后,我们可以调用commit()。它将提交由 SQL 语句所做的更改。

语法: conn.commit();

#3) Rollback() 方法

回滚方法用于撤消更改,直到最后一次提交发生。如果我们在 SQL 语句的执行流程中遇到任何问题或异常,我们可能会回滚事务。

语法: conn.rollback();

#4) setSavepoint() 方法

Savepoint 为您提供了对事务的额外控制。当您在事务(一组 SQL 语句)中设置保存点时,您可以使用 rollback() 方法撤消直到保存点或保存点()之后的所有更改。setSavepoint() 方法用于创建新的保存点。

#5) releaseSavepoint() 方法

它用于删除创建的保存点。

在下面的程序中,您将更多地了解这些方法,还将学习如何在 Java 程序中使用它。

在本教程中,所有程序都是用 Java 编写的。我们使用了 Java 8 版本和 Oracle DB。

>> 点击这里下载 Oracle 软件。

>> 点击这里下载 Java 版本 8。

它有一步一步的Java安装过程。

事务示例程序

package com.STH.JDBC;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
     
public class Transaction_Management {
 
    public static void main(String[] args) throws ClassNotFoundException {
        // TODO Auto-generated method stub
        //Select Query to get the Data from employee_details table
        String QUERY = "select * from employee_details where empNum = 2001";
        String QUERY1 = "select * from employee_details where empNum = 2002";
        Boolean autoCommit;
        String update_query = "update employee_details set salary = 41000 where empNum = 2001";
        String update_query1 = "update employee_details set salary = 42000 where empNum = 2002";
         
        //Update query to set the email id for the employee whose empNUM is 1001
        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"))
        {
                Statement statemnt1 = conn.createStatement();
                ResultSet rs1 =null;
                //Checking whether the SELECT query is executed successfully or not
                rs1 = statemnt1.executeQuery(QUERY);
             
                //Executed the SELECT Query
                System.out.println("Getting the data from employee_details table");
                displayData(rs1);
                //Set the autoCommit value of the connection to FALSE
                System.out.println("Setting the AutoCommit value as FALSE");
                conn.setAutoCommit(false);
                autoCommit = conn.getAutoCommit();
                System.out.println("AutoCommit value of the Connection = "+ autoCommit);
                //Creating Statement to execute the update query
                statemnt1 = conn.createStatement();
                System.out.println("Executing Update query to update salary of EMPNUM = 2001");
                System.out.println("Update Query is " + update_query);
                int return_rows = statemnt1.executeUpdate(update_query);
                System.out.println("Updated the data but didn't commit");
                //Getting data after Updation
                Connection conn1 = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE");
                System.out.println("Opening new connection");
                System.out.println("EMPNUM = 2001 data");
                Statement statement2 = conn1.createStatement();
                ResultSet rs;
                rs = statement2.executeQuery(QUERY);
                displayData(rs);
                System.out.println("Commit has been done");
                conn.commit();
                Savepoint s1 = conn.setSavepoint();
                System.out.println("SavePoint has been created");
                System.out.println("Displaying data of EMPNUM = 2001");
                System.out.println("Using The Second Connection");
                rs = statement2.executeQuery(QUERY);
                displayData(rs);
                rs = statemnt1.executeQuery(QUERY);
                //Rollback the transaction
                System.out.println("Data of EMPNUM = 2002");
                rs1 = statemnt1.executeQuery(QUERY1);
                displayData(rs1);
                System.out.println("Updating the salary of EMPNUM = 2002");
                System.out.println("Update Query is " + update_query1);
                statemnt1.executeUpdate(update_query1);
                System.out.println("Data of EMPNUM = 2002 but didn't commit");
                rs1 = statemnt1.executeQuery(QUERY1);
                displayData(rs1);
                System.out.println("Rollback is done... so updated data won't be reflected");
                 
                conn.rollback(s1);
                System.out.println("Data of EMPNUM = 2002 after Rollback till the last savepoint");
                rs1 = statemnt1.executeQuery(QUERY1);
                displayData(rs1);
                     
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
     public static void displayData(ResultSet rs1) throws SQLException
     {
 
            while(rs1.next())
            {
                int empNum = rs1.getInt("empNum");
                String lastName = rs1.getString("lastName");
                String firstName = rs1.getString("firstName");
                String email = rs1.getString("email");
                String deptNum = rs1.getString("deptNum");
                String salary = rs1.getString("salary");
                System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +","+deptNum +"," +salary);
            }
         
     }
     }

输出:

解释:

我们在上述事务管理程序中所做的是更新 EMPLOYEE_DETAILS 表中给定员工的值并提交数据。如果发生任何错误或异常,那么我们已经完成了 rollback() 操作。现在我们将看到该程序的完整说明。

#1)根据 2 名员工的 EMPID 创建 2 选择查询

以下是 2 个选择查询。

String QUERY = "select * from employee_details where empNum = 2001";
String QUERY1 = "select * from employee_details where empNum = 2002";

#2)根据 2 名员工的 EMPID 创建了两个更新查询

两个更新的查询:

String update_query = "update employee_details set salary = 41000 where empNum = 2001";
String update_query1 = "update employee_details set salary = 42000 where empNum = 2002";

#3)打开Connection,执行select查询,显示EMPNUM = 2001的数据。

#4)使用 setAutoCommit() 方法,将 autoCommit 的值设置为 false。

#5)执行 EMPNUM = 2001 的更新查询并为同一个数据库创建另一个连接并选择 EMPNUM =2001 的值。

#6) EMPNUM = 2001 的Employee的结果数据不是更新的数据。因为我们还没有完成 commit() 操作。如果您在更新时使用了相同的连接,它会向您显示更新后的数据。现在提交数据。数据已反映在表中。

#7)在提交操作后创建一个保存点。

#8)使用选择查询显示 EMPNUM = 2002 的数据。使用更新查询更改了该员工的工资。之后显示 EMPNUM = 2002 的数据,使用相同的连接。它应该显示更新的数据。

#9)使用回滚方法完成回滚直到最后一个保存点。现在,当我们使用相同的连接显示该员工的数据时,它具有旧数据,因为如果我们在最后一次提交中提及保存点,则回滚会撤消直到最后一个保存点的更改。

#10)我们创建了一种显示数据的方法,因为我们在这里多次显示数据。

JDBC 数据类型

数据库具有 SQL 数据类型,Java 具有 Java 数据类型。Java 应用程序和数据库之间应该有一种读写数据的机制。不同的数据库支持 SQL 类型,但名称有所不同。

例如,大多数数据库都支持大二进制值,Oracle 将其称为 LONG RAW,Sybase 将其称为 IMAGE,Informix 将其称为 BYTE,DB2 将其称为 LONG VARCHAR FOR BIT DATA。

在编写 JDBC 程序时,我们不必担心目标数据库使用的 SQL 数据类型。JDBC 在 java.sql.Types 类中有一组通用 SQL 类型标识符。这些类型旨在支持大多数通用 SQL 数据类型。在编写 JDBC 程序时,我们将只使用 JDBC 数据类型。

JDBC 驱动程序将 Java 数据类型来回转换为数据库数据类型。您可以使用 java.sql.DatabaseMetaData.getTypeInfo 方法检查给定数据库实际支持哪些 SQL 类型,然后编写程序。JDBC 对大多数数据类型使用默认映射。

例如, Java 字符串将被转换为 SQL VARCHAR 类型。

我们将在下表中的preparedStatement或CallableStatement或ResultSet接口的setXXX、getXXX和updateXXX方法中看到映射是如何完成的:

SQL 类型JAVA/ JDBC 类型设置XXX得到XXX更新XXX
字符java.lang.String设置字符串获取字符串更新字符串
VARCHARjava.lang.String设置字符串获取字符串更新字符串
LONGVARCHARjava.lang.String设置字符串获取字符串更新字符串
少量布尔值设置布尔值getBoolean更新布尔值
数字java.math.BigDecimalsetBigDecimalgetBigDecimal更新BigDecimal
小灵通短的设置短得到短更新短
整数整数集合有色更新整数
大整数long设置长得到长更新长
真实的漂浮setFloatgetFloat更新浮动
漂浮漂浮setFloatgetFloat更新浮动
双倍的双倍的设置双得到双更新双
二进制字节[]设置字节获取字节更新字节
日期java.sql.Date设置日期获取日期更新日期
时间java.sql.Time设置时间获取时间更新时间
时间戳java.sql.时间戳设置时间戳获取时间戳更新时间戳
CLOBjava.sql.ClobsetClob获取Clob更新Clob
斑点java.sql.BlobsetBlob获取Blob更新Blob
大批大批集合数组获取数组更新数组
XMLxml设置SQLXML获取SQLXML更新SQLXML
结构化类型目的设置对象获取对象更新对象

在之前的教程中,我们已经为基本数据类型提供了 setXXX、getXXX 和 updateXXX 方法。你可以参考那个。

在这里,我们在以下示例中解释了 clob 和 blob 类型。

BLOB 示例程序

package com.STH.JDBC;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
     
public class Blob_Example {
 
    @SuppressWarnings("resource")
    public static void main(String[] args) throws ClassNotFoundException, IOException {
        // TODO Auto-generated method stub
 
        String QUERY = "Create table Blob_Sample_Example ( PicName varchar2(30), picture BLOB)"; //Select Query to get the Data from employee_details table
         
        //Update query to set the email id for the employee whose empNUM is 1001
        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        System.out.println("Establishing Connection");
        try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"))
        {
                Statement statemnt1 = conn.createStatement();
                //Executing the Create Query
                statemnt1.execute(QUERY);
                System.out.println("Table has been created for BLOB type");
                System.out.println("Inserting data into Blob_Sample_Example table");
                String insert_query = " insert into Blob_Sample_Example values(?,?)";
                //Passing the values for preparedStatement
                PreparedStatement pstmnt = conn.prepareStatement(insert_query);
                pstmnt.setString(1, "Sotware Testing Help");
                //Mention Image path to store the image in DB
                FileInputStream inputStream = new FileInputStream("D:\\Bhakiya\\Bhakiya\\JDBC\\Software Testing Pic.png");
                pstmnt.setBlob(2, inputStream);
                //Executing the preparedStatement to insert the data
                pstmnt.execute();
                System.out.println("Retrieving data");
                 ResultSet rs = statemnt1.executeQuery("select * from Blob_Sample_Example");
                 while(rs.next())
                 {
                    //Getting Picture Name
                     System.out.println("Picture Name:" + rs.getString(1));
                     Blob blob1 = rs.getBlob(2);
                    //using blob retrieving the Image
                     byte byteArray[] = blob1.getBytes(1,(int)blob1.length());
                     FileOutputStream outPutStream = new FileOutputStream("D:\\Bhakiya\\Bhakiya\\JDBC\\Software Testing Pic output.png");
                     outPutStream.write(byteArray);
                     System.out.println(" Go to the following path: D:\\Bhakiya\\Bhakiya\\JDBC\\Software Testing Pic output.png");
                    
                 }
         
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
}

输出:

文件已成功保存在给定路径中。

解释:

在上面的程序中,我们所做的是首先我们在文件夹“D:\\Bhakiya\\Bhakiya\\JDBC”中创建/保存了一张图像。这个位置只是一个例子。您可以在系统中创建自己的文件路径。该文件的名称是软件测试图片。然后我们创建了一个 Java 程序来将该图像存储在 DB 表中,并从表中检索图像并将其存储在本地系统中。

到目前为止,我们已经讨论了任务的概述。现在我们将看看我们是如何在程序中实现它的。

#1)在数据库中创建一张表来存储图像。

句法:

String QUERY = "创建表 Blob_Sample_Example (PicName varchar2(30), 图片 BLOB)";

在上面的查询中,我们有 2 列。

  1. PicName – varchar2 -> 用来存放图片的名字
  2. 图片 - BLOB -> 用于将图片存储在表中。

BLOB 数据类型用于将图片/图像存储在 DB 表中。

#2)已创建连接和语句并调用执行方法来执行创建查询。

statemnt1.execute(QUERY);

#3)接下来,我们创建了插入查询并使用 PreparedStatement 执行它。

PreparedStatement 语法:

PreparedStatement pstmnt = conn.prepareStatement(insert_query);

#4)使用 setString() – 设置图片的名称。

#5)要设置图片,请使用 FileInputStream 类传递图片位置。

句法:

FileInputStream inputStream = new FileInputStream("图片全路径");

然后,使用 setBlob() 方法,我们可以在 PreparedStatement 对象中设置图片。之后,调用 PreparedStatement 的执行方法。这将在表中插入给定的数据。

执行插入查询后,通过使用 ResultSet 对象,我们从 Table 中检索数据(使用 Select Query)。

#6)通过使用getString方法,我们可以得到PicName Column的值。

#7) 要获取图片,请按照以下步骤操作:

  • 创建 Blob 对象并分配 ResultSet 对象的 getBlob 方法的返回值。
    • 语法为:Blob blob1 = rs.getBlob(<ColumnIndex>);
  • 创建一个字节数组对象并以字节形式获取 Blob 对象的值。
  • 创建对象 FileOutputStream 对象并传递完整路径以将图片存储在该路径中。调用 FileOutputStream 对象的 write() 方法——这将存储图片。
  • 之后程序已成功执行。

#8)到Output图片所在的位置,检查输入输出是否一致。

CLOB 示例程序

package com.STH.JDBC;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class Clob_Example {
    public static void main(String[] args) throws ClassNotFoundException, IOException {
        // TODO Auto-generated method stub
        String QUERY = "Create table Clob_Sample_Example ( FileName varchar2(30), StoreFile CLOB)";
        //Create Query to create new table for CLOB example
        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        //Creating Connection
        System.out.println("Establishing Connection");
        try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"))
        {
                Statement statemnt1 = conn.createStatement();
                //Executing create query
                statemnt1.execute(QUERY);
                System.out.println("Table has been created for CLOB type");
                System.out.println("Inserting data into Clob_Sample_Example table");
                //Insert Query
                String insert_query = " insert into Clob_Sample_Example values(?,?)";
                //Passing Parameters for PreparedStatement
                PreparedStatement pstmnt = conn.prepareStatement(insert_query);
                pstmnt.setString(1, "File1");
                 
                FileReader fileRead = new FileReader("D:\\Bhakiya\\Bhakiya\\JDBC\\file1.txt");
                pstmnt.setClob(2, fileRead);
                //Executing the PreparedStatement
                pstmnt.execute();
                System.out.println("Retrieving data");
                 ResultSet rs = statemnt1.executeQuery("select * from Clob_Sample_Example");
                 while(rs.next())
                 {
                     System.out.println("File Name:" + rs.getString(1));
                    //Getting file data
                     Clob clob1 = rs.getClob(2);
                    Reader r = clob1.getCharacterStream();
                    //Using Reader - read the data and Writer - Write the data in file in the given location
                     FileWriter fileWrite = new FileWriter("D:\\Bhakiya\\Bhakiya\\JDBC\\file1 output.txt");
                     int i;
                     while((i=r.read())!=-1)
                     fileWrite.write(i);
                     fileWrite.close();
                     System.out.println(" Go to the following path: D:\\Bhakiya\\Bhakiya\\JDBC\\file1 output.txt");
                    
                 }
         
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

输出:

输入文件:

文件已成功保存在给定路径中。

输出文件:

解释:

在上面的程序中,我们首先在“D:\\Bhakiya\\Bhakiya\\JDBC”文件夹中创建/保存了一个文本文件“file1.txt”。这个位置只是一个例子。您可以在系统中创建自己的文件路径。然后我们创建了一个 Java 程序来将该文件存储在 DB 表中,并从表中检索该文件并将其存储在本地系统中。

到目前为止,我们已经讨论了任务的概述。现在我们将看看我们是如何在程序中实现它的。

#1)在数据库中创建一张表来存储图像。

下面是 CREATE TABLE 查询的语法:

String QUERY = "创建表 Clob_Sample_Example (FileName varchar2(30), StoreFile CLOB)";

在上面的查询中,我们有 2 列。

  1. FileName - varchar2 -> 用来存放图片的名字。
  2. StoreFile - CLOB -> 用于将文件存储在 Table 中。

CLOB数据类型用于存储DB Table中二进制数据的Character类型

#2)已创建连接和语句并调用执行方法来执行创建查询。

statemnt1.execute(QUERY);

#3)接下来,我们创建了插入查询并使用 PreparedStatement 执行它。

PreparedStatement 语法:

PreparedStatement pstmnt = conn.prepareStatement(insert_query);

#4)使用 setString() – 设置 FileName 的名称。

#5)要设置/存储文件,请使用 FileReader 类传递带有填充位置的文件。

句法:

FileReader fileRead = new FileReader("D:\\Bhakiya\\Bhakiya\\JDBC\\file1.txt");

然后使用 setClob() 方法,我们可以在 PreparedStatement 对象中设置文件。之后调用 PreparedStatement 的执行方法。这将在表中插入给定的数据。

执行插入查询后,我们使用 ResultSet 对象从表中检索数据(使用选择查询)。

选择查询:

“从 Clob_Sample_Example 中选择 *”

#6)使用 getString 方法我们可以获得 FileName Column 的值。

#7)要获取文件,我们遵循以下步骤:

  • 创建 Clob 对象并分配 ResultSet 对象的 getClob 方法的返回值。
    • 语法是:Clob clob1 = rs.getClob(<ColumnIndex>);
  • 创建 Reader 对象并获取 Clob 对象的值为 Character。
  • 创建对象 FileWriter 对象并传递完整路径以将文件存储在该路径中。调用 FileWrite 对象的 write() 方法——这会将数据写入文件中的位置。
  • 之后程序已成功执行。

#8)到Output文件所在位置,检查输入输出文件是否相同。

要记住的要点:

  • ACID Properties 解释了数据库中的事务管理。
  • Commit()、rollback() 和 savepoint 是 Transaction Management 中最重要的操作。
  • 提交将在数据库中永久进行更改,回滚将撤消更改,直到最后一次提交或提到的保存点,保存点有助于创建检查点。
  • 数据库维护 SQL 数据类型,Java 维护 Java 数据类型。JDBC 驱动程序用于处理这种转换。
  • JDBC驱动本身有一些SQL类型的标识符,所以程序员不用担心数据类型。

经常问的问题

Q #1) 什么是 JDBC 数据类型?

答: Java 有它的数据类型,数据库也有它的数据类型。JDBC 驱动程序将 Java 数据类型转换为数据库接受的适当 SQL 数据类型。ResultSet 对象还提供可用于适当数据类型的 setXXX() 方法和 getXXX() 方法。

Q #2) Java 中日期的数据类型是什么?

答: Java 中的日期不仅是一种数据类型,而且是一个类。Java 中的 Date 具有日期、时间、年份、日期名称、星期几和时区。Date 类具有适当的方法来检索相关数据。

Q #3) java.util.Date 和 java.sql.Date 有什么区别?

答:主要区别在于 java.util.Date 也包含有关日期和时间的信息。但 java.sql.Date 仅包含有关日期的信息。这是我们不能将 java.util.Date 直接映射到 java.sql.Date 的主要区别。

Q #4) 我们在 Java 中有一个类来表示 SQL 的 TIME 和 TIMESTAMP 类型吗?

答:是的,我们有一个用于 SQL 的 TIME 和 TIMESTAMP 类型的类。java.sql.Time 类表示与 TIME 相关的信息。java.sql.timestamp 类表示 TIMESTAMP 相关信息。

Q #5) 如何在 JDBC 中启动事务?

答: JDBC 连接以启用自动提交模式开始,其中每条 SQL 语句都被视为一个事务。JDBC 中没有启动事务的特定过程。当您创建连接并开始执行 SQL 语句时,事务就开始了。

Q #6) Java 中的 commit() 方法是什么?

答: Java 中的 Commit() 方法用于保存自上次 commit() 以来所做的更改。Commit() 方法在 Connection 接口中可用。使用连接对象,我们可以调用 commit()。

Q #7) Java 中的回滚方法是什么?

回答:在最后一次commit()之后,如果出现任何问题,我们可以调用rollback()方法来恢复所有所做的更改,直到最后一次commit.rollback()方法在Connection接口中可用。使用连接对象,我们可以调用 rollback() 方法。

结论

在这里,我们介绍了 Java 和 DB 中的数据类型以及 JDBC 驱动程序如何处理它。我们已经讨论了 ACID 的特性。这对于银行业来说是最重要的。这对你的职业生涯会有很大帮助。在事务管理部分,我们讨论了提交和回滚方法,例如 commit()、rollback()、setAutoCommit()、setSavepoint() 和 releaseSavepoint()。

<<上一篇教程下一篇教程>>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBCJava Database Connectivity)是Java语言访问数据库的一种标准规范,它提供了一套用于操作关系型数据库的API,包括连接数据库、执行SQL语句、处理结果集等。 事务是指一组操作,它们被视为一个整体,要么全部执行成功,要么全部失败回滚。在JDBC中,可以使用Transaction来管理事务。 JDBC中的事务处理包括以下几个步骤: 1. 获取数据库连接对象Connection。 2. 关闭自动提交,设置事务的隔离级别和超时时间。 3. 开始事务,使用Connection对象的beginTransaction()方法。 4. 执行SQL语句,使用Statement或PreparedStatement对象。 5. 如果执行过程中发生异常,使用Connection对象的rollback()方法回滚事务,否则使用commit()方法提交事务。 6. 关闭Statement或PreparedStatement对象。 7. 关闭Connection对象。 下面是一个简单的示例代码: ```java import java.sql.*; public class JdbcTransactionExample { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { // 获取数据库连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); // 关闭自动提交 conn.setAutoCommit(false); // 设置事务的隔离级别和超时时间 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); conn.setTransactionTimeout(10); // 开始事务 conn.beginTransaction(); // 执行SQL语句 pstmt = conn.prepareStatement("UPDATE users SET balance=balance-100 WHERE id=?"); pstmt.setInt(1, 1); pstmt.executeUpdate(); pstmt = conn.prepareStatement("UPDATE users SET balance=balance+100 WHERE id=?"); pstmt.setInt(1, 2); pstmt.executeUpdate(); // 提交事务 conn.commit(); } catch (SQLException e) { // 回滚事务 try { if (conn != null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { // 关闭PreparedStatement和Connection对象 try { if (pstmt != null) { pstmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 在上面的示例中,我们使用了PreparedStatement对象来执行SQL语句,并使用Connection对象的beginTransaction()、commit()和rollback()方法来管理事务。注意,如果在执行SQL语句的过程中发生异常,需要使用conn.rollback()方法回滚事务。最后,需要关闭PreparedStatement和Connection对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值