批处理事物

    xiaoxiao2021-12-14  20

    以上所使用的开发模式是JDBC 1.0提出来的,而现在的JDBC的版本是4.0(没人用),而且从JDBC 2.0开始就已经提出了许多新的特征:可滚动结果集、使用结果集更新数据、批处理,这之中唯一有点用处的就是批处理操作,所谓的批处理指的是一次性向数据库之中发出多条更新指令,在Statement和PreparedStatement接口里面都有对应的方法:

             · Statement接口定义的方法:

                       |- 增加批处理语句:public void addBatch(String sql) throws SQLException;

                       |- 执行批处理:public int[] executeBatch() throws SQLException;

                                |- 返回的是每一条SQL语句影响的数据行数量

             · PreparedStatement接口定义的方法:

                       |- 增加批处理:public void addBatch() throws SQLException。

    范例:利用Statement来观察问题

    package cn.mldn.demo;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.Statement;

    public class TestDemo {

        private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

        private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

        private static final String DBUSER = "scott";

        private static final String PASSWORD = "tiger";

        public static void main(String[] args) throws Exception {

            Connection conn = null; // 每一个Connection对象都表示一个连接

            Statement stmt = null; // 定义数据库操作对象

            Class.forName(DBDRIVER); // 加载数据库驱动程序

            conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库

            stmt = conn.createStatement() ;

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            int result [] = stmt.executeBatch() ;

            for (int x = 0 ; x < result.length ; x ++) {

                System.out.print(result[x] + "、");

            }

            conn.close();

        }

    }

             但是如果说现在有这样一种情况,以上五个要执行SQL语句属于一个完整业务,即:要求所有的SQL一起成功或者是一起失败。但是默认情况下,JDBC中的事务都是自动提交的,所以如果中间出现了错误,那么之前没有错的正常执行,很明显这不符合要求,所以必须手工的进行事务处理,而所有的事务处理命令都在Connection接口中定义:

                       · 提交事务:public void commit() throws SQLException;

                       · 回滚事务:public void rollback() throws SQLException;

                       · 设置自动提交与否:public void setAutoCommit(boolean autoCommit) throws SQLException。

    范例:使用事务处理

    package cn.mldn.demo;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.Statement;

    public class TestDemo {

        private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

        private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

        private static final String DBUSER = "scott";

        private static final String PASSWORD = "tiger";

        public static void main(String[] args) throws Exception {

            Connection conn = null; // 每一个Connection对象都表示一个连接

            Statement stmt = null; // 定义数据库操作对象

            Class.forName(DBDRIVER); // 加载数据库驱动程序

            conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库

            stmt = conn.createStatement() ;

            conn.setAutoCommit(false);// 取消自动提交

            try {

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");

            int result [] = stmt.executeBatch() ;

            for (int x = 0 ; x < result.length ; x ++) {

                System.out.print(result[x] + "、");

            }

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

            } catch (Exception e) {

                e.printStackTrace();

                conn.rollback();

            }

            conn.close();

        }

    }

             因为日后的开发之中,事务都是自动处理的,用户只需要编写代码就行了。

     

    转载请注明原文地址: https://ju.6miu.com/read-964776.html

    最新回复(0)