JDBC批处理与事务处理

一、JDBC的批处理

JDBC批处理与事务处理_第1张图片    原始数据库信息

--addBatch();向PreparedStatement的对象中添加一组参数
--clearParameters();立即清除当前的参数(interface :PreparedStatementz中的方法)
--clearBatch();清除Statement当前的SQL命令列表(PreparedStatement的实现还是Statement对象)
--executeBatch();将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。数组里面存的都是1

代码演示:

import test.JdbcTools;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;


public class BatchTest  {
    public static void main(String[] args) {
        long start=System.currentTimeMillis();
        CreatBatch();
        long end=System.currentTimeMillis();
        System.out.println("CreatBatch :"+(end-start));
        start=System.currentTimeMillis();
        for(int i=101;i<190;i++){
            Creat(i);
        }
        end=System.currentTimeMillis();
        System.out.println("Creat:"+(end-start));
        CreatBatch();
    }
    private  static void  Creat(int i){
        Connection conn=null;
        PreparedStatement ps=null;
        try{
            conn= JdbcTools.getConn();
            String sql="insert into person(ID,birthday,money)values(?,?,?)";
            ps=conn.prepareStatement(sql);
            ps.setInt(1,(int)i);
            ps.setDate(2,new Date(System.currentTimeMillis()));//要转变
            ps.setFloat(3,88888f);

            ps.executeUpdate();
        }
        catch (SQLException e){
            e.printStackTrace();
        }
        finally {
            JdbcTools.freed(conn,ps);
        }
    }
    private static void CreatBatch(){
        Connection conn=null;
        PreparedStatement ps=null;
        try{
            conn=JdbcTools.getConn();
            String sql="insert into person(ID,birthday,money)values(?,?,?)";
            ps=conn.prepareStatement(sql);
            for(int x=11;x<100;x++){
                ps.setInt(1,x);
                ps.setDate(2,new Date(System.currentTimeMillis()));//要转变
                ps.setFloat(3,999999f);
                
                ps.addBatch();//集合操作

            }
//            ps.clearBatch();

            int s[]=ps.executeBatch();
            System.out.println(s.length);
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally {
            JdbcTools.freed(conn,ps);
        }
    }
}

tips:批处理的速度要比单独处理的速度要快

二、JDBC的事务处理:

在执行数据库更行的时候,都是默认的自动提交数据的,但是有很多时候,我们不能设置默认提交,生活中最常见就是,你给某人转钱,你的钱已经转出去了,但是对方在收款的时候却出现了某些问题,导致对方账户上的钱并没有增加,这个时候,为了防止问题的发生,我们就不能设置数据库默认提交。

 

Connection类:
--setAutoCommit(boolean flag);开启或者禁用自动提交的功能;flag为false时关闭自动提交
--setSavePoint();在当前事务中创建一个未命名的保存点,并返回代表它的新的Savepoint对象。
--rollback(Savepoint point);回滚到设置的回滚点;
--commit();手动提交(如果禁用了默认提交的话,如果不手动commit的话,那么数据库的数据是无法更新的

代码示例:

import test.JdbcTools;

import java.sql.*;
//事务处理
public class SavePointTest {
    public static void main(String[] args)throws SQLException {
        test();

    }
    private static void test() throws SQLException {
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        Savepoint sp=null;
        conn=JdbcTools.getConn();
        conn.setAutoCommit(false);//关闭自动提交

        sp = conn.setSavepoint();//设置回滚点
        String sql="update person set money=money-10 where ID=1";
        ps=conn.prepareStatement(sql);
        ps.executeUpdate();

        String sqlOne="update person set money=money+10 where ID=2";
        ps=conn.prepareStatement(sqlOne);
        ps.executeUpdate();
        String sqlSel="select money from person where ID=2";
        ps=conn.prepareStatement(sqlSel);
        rs=ps.executeQuery();
        float money=0.0f;
        while(rs.next()){
            money=rs.getFloat("money");
            System.out.println(money);
        }
        try {
            if(money>100){
                throw new RuntimeException();
            }else {
                conn.commit();
            }

        }catch (RuntimeException e){
            conn.rollback(sp);//回到设置的回滚点
            conn.commit();

        }finally {
            conn.close();
        }
    }

}


 

你可能感兴趣的:(JDBC)