Java 和 MySQL - 提交和回滚
完成更改后,如果想要提交更改,则在连接对象上调用 commit() 方法,如下所示 −
conn.commit( );
否则,要回滚使用名为 conn 的连接对数据库进行的更新,请使用以下代码 −
conn.rollback( );
以下示例说明了提交和回滚对象的使用 −
try{
//假设一个有效的连接对象 conn
conn.setAutoCommit(false);
语句 stmt = conn.createStatement();
String SQL = "INSERT INTO Employees " +
"VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(SQL);
//提交一个格式错误的 SQL 语句,该语句会中断
String SQL = "INSERTED IN Employees " +
"VALUES (107, 22, 'Sita', 'Singh')";
stmt.executeUpdate(SQL);
// 如果没有错误。
conn.commit();
}catch(SQLException se){
// 如果有错误。
conn.rollback();
}
在这种情况下,上述 INSERT 语句均不会成功,所有内容都将回滚。
以下是使用 commit 和 rollback 的示例。
此示例代码是根据前面章节中完成的环境和数据库设置编写的。
将以下示例复制并粘贴到 TestApplication.java 中,然后按如下方式编译并运行−
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestApplication {
static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
static final String USER = "guest";
static final String PASS = "guest123";
static final String QUERY = "SELECT id, first, last, age FROM Employees";
static final String INSERT_QUERY = "INSERT INTO Employees (first, last, age) values('Rita', 'Tez', 20)";
static final String INSERT_QUERY_2 = "INSERT INTO Employees (first, last, age) values('Sita', 'Singh', 20)";
public static void printResultSet(ResultSet rs) throws SQLException{
// 确保我们从第一行开始
rs.beforeFirst();
while(rs.next()){
// 显示值
System.out.print("ID: " + rs.getInt("id"));
System.out.print(", Age: " + rs.getInt("age"));
System.out.print(", First: " + rs.getString("first"));
System.out.println(", Last: " + rs.getString("last"));
}
System.out.println();
}
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 打开连接
System.out.println("正在连接到数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 将自动提交设置为false。
conn.setAutoCommit(false);
// 执行查询以创建语句,并传入 RS 示例所需的参数。
System.out.println("正在创建语句...");
stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// 在员工表中插入一行
System.out.println("正在插入一行...");
stmt.executeUpdate(INSERT_QUERY);
// 在员工表中再插入一行
stmt.executeUpdate(INSERT_QUERY_2);
// 在此提交数据。
System.out.println("在此提交数据...");
conn.commit();
// 现在列出所有可用记录。
String sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
System.out.println("列出结果集以供参考....");
printResultSet(rs);
// 清理环境
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
se.printStackTrace();
// 如果有错误则回滚更改。
System.out.println("Rolling back data here....");
try{
if(conn!=null)
conn.rollback();
}catch(SQLException se2){
se2.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}finally{
// finally 块用于关闭资源
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
se2.printStackTrace();
}
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}
}
现在让我们编译上面的例子如下 −
C:\>javac TestApplication.java C:\>
当您运行 TestApplication 时,它会产生以下结果 −
C:\>java TestApplication Connecting to database... Creating statement... Inserting one row.... Commiting data here.... List result set for reference.... ID: 1, Age: 23, First: Zara, Last: Ali ID: 2, Age: 30, First: Mahnaz, Last: Fatma ID: 3, Age: 35, First: Zaid, Last: Khan ID: 4, Age: 33, First: Sumit, Last: Mittal ID: 5, Age: 40, First: John, Last: Paul ID: 6, Age: 20, First: Rita, Last: Tez ID: 7, Age: 20, First: Sita, Last: Singh C:\>

