美文网首页Java
JDBC 批量插入数据

JDBC 批量插入数据

作者: 一亩三分甜 | 来源:发表于2019-12-15 12:24 被阅读0次

使用PreparedStatement实现批量数据的操作

/**
 * @program: HelloWorld
 * @description: 使用PreparedStatement实现批量数据的操作
 * @author: fish
 * @create: 2019-12-15 10:57
 **/
/*
* update、delete本身就具有批量操作的效果。
* 此时的批量操作,只要指的是批量插入。使用PreparedStatement如何实现更高效的批量插入?
* 题目:向goods表中插入20000条数据
* create table goods(
* id int primary key auto_increment,
* name varchar(25)
* );
*
* 方式一:使用Statement
* Connection conn = JDBCUtils.getConnection();
* Statement st = conn.createStatement();
* for(int i=0;i <= 20000; i++){
* String sql = "insert into goods(name)values('name_"+ i + "')";
* st.execute(sql);
* }
*/
public class InsertTest {
    //批量插入的方式二:使用PreparedStatement
    @Test
    public void testInsert1(){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for (int i = 1;i<= 20000;i++){
                ps.setObject(1,"name_" + i);
                ps.execute();
            }
            long end = System.currentTimeMillis();
            System.out.print("花费的时间为:" + (end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }
    }
}
//输出
花费的时间为:231183

DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下载,那么下次调用时只要是相通的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。

在Statement语句中,即使是相通操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义,事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译(语法检查,语义检查,翻译成二进制命令,缓存)一次。

PreparedStatement可以防止SQL注入。

批量插入的方式三:

//批量插入的方式三:
    /*
    * 1.addBatch()、executeBatch()、clearBatch()
    * 2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
    * ?rewriteBatchStatements=true 写在配置文件的url后面
    * 3.使用更新的mysql驱动:mysql-connector-java-5.1.37-bin.jar
    */
    @Test
    public void testInsert2(){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for (int i = 1;i<= 20000;i++){
                ps.setObject(1,"name_" + i);
                //1."攒"sql
                ps.addBatch();
                if (i % 500 == 0){
                    //2.执行batch
                    ps.executeBatch();
                    //3.清空batch
                    ps.clearBatch();
                }
            }
            long end = System.currentTimeMillis();
            System.out.print("花费的时间为:" + (end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }
    }
//输出
花费的时间为:1012

批量插入的方式四:设置连接不允许自动提交数据

//批量插入的方式四:设置连接不允许自动提交数据
    @Test
    public void insert3(){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            //设置不允许自动提交数据
            conn.setAutoCommit(false);
            String sql = "insert into goods(name)values(?)";
            ps = conn.prepareStatement(sql);
            for (int i = 1;i<= 20000;i++){
                ps.setObject(1,"name_" + i);
                //1."攒"sql
                ps.addBatch();
                if (i % 500 == 0){
                    //2.执行batch
                    ps.executeBatch();
                    //3.清空batch
                    ps.clearBatch();
                }
            }
            //提交数据
            conn.commit();
            long end = System.currentTimeMillis();
            System.out.print("花费的时间为:" + (end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,ps);
        }
    }
//输出
花费的时间为:582    
20000 ----- 582
1000000 ----- 5051

相关文章

网友评论

    本文标题:JDBC 批量插入数据

    本文链接:https://www.haomeiwen.com/subject/ecvknctx.html