批处理事物

来源:互联网 发布:excel筛选数据后求和 编辑:程序博客网 时间:2024/05/19 05:34

以上所使用的开发模式是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(DBURLDBUSERPASSWORD); // 连接数据库

        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(DBURLDBUSERPASSWORD); // 连接数据库

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

    }

}

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

 

0 0
原创粉丝点击