JDBC批处理

Posted yikuandyk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC批处理相关的知识,希望对你有一定的参考价值。

批处理:

  当我们需要向数据库中插入大量数据时,批处理会将这些数据打成多个批次addBatch(),统一发送给数据库服务器执行executeBatch(),减少与数据库的交互次数提高程序的执行效率。

实现批处理方法:

  利用statement对象;

  利用PreparedStatement对象;

共同使用的方法

  addBatch();

  executeBatch();

代码:

package cn.yikuan.batch;

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

import org.junit.Test;

import cn.tedu.util.JDBCUtils;

/**
 * 这个类用来测试jdbc的批处理
 * @author Administrator
 *
 */
public class BatchTest {
    //实现方式一:利用statement对象完成
    @Test
    public void StatementBatch(){
        Connection conn = null;
        Statement st = null;
        
        try {
            //1.注册驱动
            //2.获取数据库连接
            conn = JDBCUtils.getConnection();
            long t = System.currentTimeMillis();
            //)))1.关闭jdbc的事务管理,
            conn.setAutoCommit(false);
            //3.获取传输器
            st = conn.createStatement();
            //4.执行sql
            for(int i=0;i<1000000;i++){
                String sql = "insert into dept values(null,‘"+i+"‘)";
                
                //把sql打包成批次
                st.addBatch(sql);
            }
            //统一发送给服务器执行批
            int[] rows = st.executeBatch();
            //)))2.手动提交事务
            conn.commit();
            //5.遍结果集
            System.out.println(rows.length);
            t = System.currentTimeMillis()-t;
            System.out.println(t);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6.释放资源
            JDBCUtils.close(null,st, conn);
        }
    }
    
    @Test
    public void psBatch(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //1.注册驱动
            //2.获取数据库连接
            conn = JDBCUtils.getConnection();
            long t = System.currentTimeMillis();
            //)))1.关闭jdbc的事务管理,
            conn.setAutoCommit(false);
            //3.获取传输器;4.执行sql
            String sql = "insert into dept values(null,?)";
            ps = conn.prepareStatement(sql);
            for (int j = 0; j < 1000000; j++) {
                ps.setString(1,"ps"+j);
                //把sql打成批次
                ps.addBatch();
            }
            //统一发送给数据库服务器
            int[] rows = ps.executeBatch();
            //)))2.手动提交事务
            conn.commit();
            //5.遍历结果集
            System.out.println(rows.length);
            t = System.currentTimeMillis()-t;
            System.out.println(t);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, ps, conn);
        }
    }
    
}

JDBCUtils.java

package cn.yikuan.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
/**
 * 这个类用来提供JDBC的工具类
 * @author Administrator
 *
 */
public class JDBCUtils {
    //1.私有化构造函数,外界无法直接创建对象
    private JDBCUtils(){

    }

    static ResourceBundle rb = null;
    static {
        //读取属性文件
        rb = ResourceBundle.getBundle("jdbc");
    }

    //2.提供公共的,静态的,getConnection方法,用来给外界提供数据库连接
    public static Connection getConnection(){
        try {
            //2.1注册驱动
            Class.forName(rb.getString("driverClass"));
            //2.2获取数据库连接
            String url = rb.getString("jdbcUrl");
            String user = rb.getString("user");
            String password = rb.getString("password");
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;    
    }

    //3.提供公共的,静态的,close方法,用来释放资源
    public static void close(ResultSet rs,Statement st,Connection conn){
        //3.1非空判断,防止空指针异常
        //3.2手动置为空,保证完全释放
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                rs = null;
            }
        }
        if(st != null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                st = null;
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                conn = null;
            }
        }

    }
}

 

以上是关于JDBC批处理的主要内容,如果未能解决你的问题,请参考以下文章

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

JDBC操作数据库之查询数据

如何在片段中填充列表视图?

处理屏幕旋转上的片段重复(带有示例代码)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段