JDBC批处理---(java 对数据库的回滚) .
1先看一下程序:
package com.redking.jdbc.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo07 {
public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
public static final String DBURL = "jdbc:odbc:testDB" ;
public static void main(String[] args) {
Connection conn = null ;
Statement pstmt = null ;
try {
// 向JAVA容器中加载驱动
Class.forName(DBDRIVER) ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DBURL) ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt = conn.createStatement() ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;
} catch (SQLException e) {
e.printStackTrace();
}
//现在执行数据库的更新操作
try {
pstmt.executeBatch() ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果发现:程序报错,原因是第四条数据有问题,前面三条插进去了。
现在所有的代码确实都加入到批处理中了,但是却有点不妥当,因为在出错之前的语句都正确执行了,而出错之后的代码没有执行。应该是如果有一个出错了,则全部应该停止执行。
也就是说我们现在的程序缺少了一个事务的处理。
事务处理之前必须进行取消自动提交,在默认情况下,所有的数据都是被默认提交上去的,就是说只要一执行更新就提交。
取消自动提交之后,如果最后程序的代码(批处理代码)没有出错,则可以进行人为的手工提交。最后如果程序出现了错误,则应该进行回滚。
完善代码:
package com.redking.jdbc.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo07 {
public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
public static final String DBURL = "jdbc:odbc:testDB" ;
public static void main(String[] args) {
Connection conn = null ;
Statement pstmt = null ;
try {
// 向JAVA容器中加载驱动
Class.forName(DBDRIVER) ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DBURL) ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt = conn.createStatement() ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;
} catch (SQLException e) {
e.printStackTrace();
}
//取消自动提交
try {
conn.setAutoCommit(false);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//现在执行数据库的更新操作
try {
pstmt.executeBatch() ;
//如果没有错误,则表示可以向下执行
//手工提交
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
//如果出错了,则应该把数据回滚
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
try {
pstmt.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
就发现程序出错,全部没有插进去。