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

就发现程序出错,全部没有插进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值