JDBC系列(八):JDBC利用PreparedStatement实现批处理数据

批处理,成批的处理。

从字面意思我们可以看到,批处理或许能够提高我们的数据操作的效率,毕竟是成批来的嘛!

但是,我们有必要说明一下,批处理的实现细节

批处理实现细节

PreparedStatement实现批处理,是将数据在执行sql语句前集中放置到批处理数组中,放置完毕后,再执行sql语句,一次性批量操作这些数据

例:

现要求我们向数据库test的表【test1】中,添加10000(一万)条数据,数据格式为【编号、姓名1】、【编号、姓名2】、【编号、姓名3】。。。【编号、姓名10000】这种格式。编号是自增的整型数据,姓名是字符串类型。

##实现方案:

方案1: 普通实现方案。直接使用for循环,【给sql语句写一次值,就执行一次sql语句】,把值写入到数据库,计算执行时间,便于比较。

方案2:使用批处理。将数据先通过for循环,写入批处理数组中,再通过批处理执行sql语句,一次性写入数据库,计算执行时间,便于比较。

方案1:

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

public class JDBCpichuli {
    public static void main(String[] srga) throws ClassNotFoundException, SQLException {
        long TimeStart = System.currentTimeMillis();//获取当前时间
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库
        String url = "jdbc:mysql://localhost:3306/test";
        Connection conn = DriverManager.getConnection(url,"root","88888888");
        //3.操作数据库
            //1.循环编写sql
        String sql = "INSERT INTO test1 VALUES(NULL,?)";
        //2.创建PreparedStatement
        PreparedStatement pst = conn.prepareStatement(sql);
        for(int i = 1;i<=1000;i++)
        {
            pst.setString(1,"姓名"+i); //补全sql语句被问号?占位的内容
            pst.executeUpdate(); //当即执行补全的sql语句
        }
        //4.关闭资源
        conn.close();
        pst.close();
        long TimeStop = System.currentTimeMillis();
        System.out.println("总耗时:"+ (TimeStop - TimeStart));
    }
}

总耗时:

JDBC系列(八):JDBC利用PreparedStatement实现批处理数据_第1张图片

方案2:

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

public class JDBCpichuli {
    public static void main(String[] srga) throws ClassNotFoundException, SQLException {
        long TimeStart = System.currentTimeMillis();//获取当前时间
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库
        String url = "jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true";
        Connection conn = DriverManager.getConnection(url,"root","88888888");
        //3.操作数据库
            //1.循环编写sql
        String sql = "INSERT INTO test1 VALUES(NULL,?)";
        //2.创建PreparedStatement
        PreparedStatement pst = conn.prepareStatement(sql);
        for(int i = 1;i<=1000;i++)
        {
            pst.setString(1,"姓名"+i); //补全sql语句被问号?占位的内容
            pst.addBatch();//把补全的sql语句,暂时存放到批处理数组中
        }
        pst.executeBatch();//批处理sql语句(统一执行批处理数组中存放的sql语句)
        //4.关闭资源
        conn.close();
        pst.close();
        long TimeStop = System.currentTimeMillis();
        System.out.println("总耗时:"+ (TimeStop - TimeStart));
    }
}

总耗时:

JDBC系列(八):JDBC利用PreparedStatement实现批处理数据_第2张图片

区别:

  1. 性能上:从上图可见,我们的批处理耗时远远少于普通处理,是同等情况下的优先选择。
  2. 程序上:
    • 批处理再url上多了一个参数,rewriteBatchedStatements=true 。在书写参数时,需要加上?。
    • 批处理使用了addBatch() ,executeBatch().两个方法。
  3. 警告1:在写这行代码时,请务必记得,VALUES,不是VALUE,不要少加了S。
String sql = "INSERT INTO test1 VALUES(NULL,?)";
  1. 警告2:再IDEA环境下,如果出现这种错误,我这是一种假设,你在写的时候,不一定会遇到这种错误。

    图8-3

    解决办法,观察这里:

    图8-4

    如果你的sql语句,图示位置添加了;分号,那么请,把这个分号去掉,去掉以后,如果没有其他意外情况,基本可以正常运行。

    去掉;后:

    JDBC系列(八):JDBC利用PreparedStatement实现批处理数据_第3张图片

    关于这点,后续我可能会写一篇关于java中,使用sql到底要不要添加分号的问题,等我系统总结过后,会出一篇小文。

    假装这里有一条跳转链接,暂定名称为:【关于java操作数据库时sql语句到底要不要带分号“;”问题的总结】

    JDBC系列(八):JDBC利用PreparedStatement实现批处理数据_第4张图片

你可能感兴趣的:(JDBC)