已经封装好的通用的批处理语句:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * 是一个工具类:
 *  作用:用于封装通用的获取连接、通用的增删改、通用的查询
 *  版本:v0.0.0.1
 *  方法:getConn();
 *       close();
 *  问题:
 *      OCP:对扩展开放,对修改的关闭;
 *      现在数据库myjdbc,该库名,修改代码;用户 名 密码要改,也需要修改代码.
 *  升级:
 *      需要读取到db.properties的文件的内容;
 *      需要的技术:io
 *                Properties集合类;
 */
public class JDBCUtilTwo {
    //成员变量;
    static Properties prop=new Properties();
    static String className=null;
    static String url=null;
    static String uname=null;
    static String pwd=null;
    //1.静态代码块,加载数据库的驱动,此处是mysql驱动;
    static {
        try {
            FileReader reader=new FileReader("db.properties");
            prop.load(reader);
            //getProperty():获取的从文件读取的key;
            className=prop.getProperty("className");
            url=prop.getProperty("url");
            uname=prop.getProperty("uname");
            pwd=prop.getProperty("pwd");

            Class.forName(className);
        } catch (ClassNotFoundException | FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //2.获取链接;获取一个连接对象;
    public static Connection getConn(){
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, uname, pwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    //3.关闭对象,结果集对象、语句对象、链接对象;
    public static void close(ResultSet rs, Statement st, Connection conn){
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null)
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        if(conn!=null)
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
}

普通插入方式,耗时比较长:

/**
     * 执行时间:23 9786毫秒
     * @throws SQLException
     */
    @Test
    public void test021() throws SQLException {
        Connection conn = JDBCUtilTwo.getConn();
        //常规语句对象+普通方式
        Statement st = conn.createStatement();
        //1万条数据;
        long startTime=System.currentTimeMillis();
        for (int i = 5; i < 10005; i++) {
            String sql="insert t_user(username,passworld)values('tom','tom')";
            st.executeUpdate(sql);
        }

        st.close();
        conn.close();
        long endTime=System.currentTimeMillis();

        System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
    }

Statement方式添加批处理,时间还比较慢。

/**
     * 使用批处理来进行操作;
     * 执行时间:21 4194毫秒           2468毫秒
     * @throws SQLException
     */
    @Test
    public void test022() throws SQLException {
        Connection conn = JDBCUtilTwo.getConn();
        //设置链接,自动提交事务为false。
        conn.setAutoCommit(false);
        //常规语句对象+普通方式
        Statement st = conn.createStatement();
        //1万条数据;
        String sql="insert t_user(username,passworld)values('tom','tom')";

        long startTime=System.currentTimeMillis();
        for (int i = 1; i <10010 ; i++) {
            //将sql语句,添加到批处理里面;
            st.addBatch(sql);
            //在某个时间节点,执行一次批处理;
            if(i%2000==0) {
                st.executeBatch();      //执行批处理
                st.clearBatch();        //清空一下批处理;
            }
        }
        st.executeBatch();      //执行批处理
        st.clearBatch();        //清空一下批处理;

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

        JDBCUtilTwo.close(null,st,conn);

        long endTime=System.currentTimeMillis();
        System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
    }

时间还比较慢:可以在配置文件,修改mysql批处理为true。

className=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc?rewriteBatchedStatements=true
uname=root
pwd=root

再修改事务自动提交为false,会大幅度提交效率。

预编译语句方式,批处理:

/**
     * 执行时间:22 0170毫秒           1711毫秒
     * @throws SQLException
     */
    @Test
    public void  test023() throws SQLException {
        Connection conn = JDBCUtilTwo.getConn();
        String sql="insert t_user(username,passworld)values(?,?)";
        PreparedStatement pst = conn.prepareStatement(sql);

        long startTime=System.currentTimeMillis();

        for (int i = 2; i < 10002; i++) {
            pst.setString(1,"u"+i);
            pst.setString(2,"p"+i);
            //添加到批处理里面;
            pst.addBatch();
            if(i%2000==0){
                pst.executeBatch();
                pst.clearBatch();
            }
        }
        pst.executeBatch();
        pst.clearBatch();

        JDBCUtilTwo.close(null,pst,conn);
        long endTime=System.currentTimeMillis();
        System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
    }