• <JDBC> 批量插入 的四种实现方式:你真的get到了吗?


    在这里插入图片描述
    🛒本文收录与专栏《JDBC》专栏
    📢专栏目的是解释JDBC的关键点,与各位一路同行,会持续输出,欢迎免费订阅!!

    ✨总有人间一两风,填我十万八千梦✨

    在这里插入图片描述


    一、批量插入

    批量插入就是批量执行SQL语句

    当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

    JDBC的批量处理语句包括下面三个方法
    addBatch(String):添加需要批量处理的SQL语句或是参数
    executeBatch():执行批量处理语句
    clearBatch():清空缓存的数据

    通常情况下我们会遇到两种批量执行SQL语句的情况:

    1. 多条SQL语句的批量处理
    2. 一个SQL语句的批量传参

    二、举例

    举例:向数据表中插入20000条数据

    数据库中提供一个goods表:创建如下:

        CREATE TABLE goods(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20)
        );
    
    • 1
    • 2
    • 3
    • 4

    🔥实现方式一

    使用Statement

        Connection conn = JDBCUtils.getConnection();
        Statement st = conn.createStatement();
        for(int i = 1;i <= 20000;i++){
        	String sql = "insert into goods(name) values('name_' + "+ i +")";
        	st.executeUpdate(sql);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    🔥实现方式二

    使用PreparedStatement

        long start = System.currentTimeMillis();
        		
        Connection conn = JDBCUtils.getConnection();
        		
        String sql = "insert into goods(name)values(?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        for(int i = 1;i <= 20000;i++){
        	ps.setString(1, "name_" + i);
        	ps.executeUpdate();
        }
        		
        long end = System.currentTimeMillis();
        System.out.println("花费的时间为:" + (end - start));//82340
        		
        		
        JDBCUtils.closeResource(conn, ps);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🔥实现方式三

    1. 使用 addBatch() / executeBatch() / clearBatch()
    2. mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持
      ?rewriteBatchedStatements=true 写在配置文件的url后面
    3. 使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
        @Test
        public void testInsert3() throws Exception{
        	long start = System.currentTimeMillis();
        		
        	Connection conn = JDBCUtils.getConnection();
        		
        	String sql = "insert into goods(name)values(?)";
        	PreparedStatement ps = conn.prepareStatement(sql);
        		
        	for(int i = 1;i <= 1000000;i++){
        		ps.setString(1, "name_" + i);
        			
        		//1.“攒”sql
        		ps.addBatch();
        		if(i % 500 == 0){
        			//2.执行
        			ps.executeBatch();
        			//3.清空
        			ps.clearBatch();
        		}
        	}
        		
        	long end = System.currentTimeMillis();
        	System.out.println("花费的时间为:" + (end - start));//20000条:625                                                                         //1000000条:14733  
        		
        	JDBCUtils.closeResource(conn, ps);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    🔥实现方式四

    在方式三的基础上操作
    使用Connection 的 setAutoCommit(false) / commit()

        @Test
        public void testInsert4() throws Exception{
        	long start = System.currentTimeMillis();
        		
        	Connection conn = JDBCUtils.getConnection();
        		
        	//1.设置为不自动提交数据
        	conn.setAutoCommit(false);
        		
        	String sql = "insert into goods(name)values(?)";
        	PreparedStatement ps = conn.prepareStatement(sql);
        		
        	for(int i = 1;i <= 1000000;i++){
        		ps.setString(1, "name_" + i);
        			
        		//1.“攒”sql
        		ps.addBatch();
        			
        		if(i % 500 == 0){
        			//2.执行
        			ps.executeBatch();
        			//3.清空
        			ps.clearBatch();
        		}
        	}
        		
        	//2.提交数据
        	conn.commit();
        		
        	long end = System.currentTimeMillis();
        	System.out.println("花费的时间为:" + (end - start));//1000000条:4978 
        		
        	JDBCUtils.closeResource(conn, ps);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    这四种实现方式总是忘,浅浅总结下,希望会有用~

  • 相关阅读:
    抄写Linux源码(Day16:内存管理)
    5G在油气田智慧勘探井场建设中的应用探讨
    Python:Excel自动化实践入门篇 乙【送图书活动继续】
    锅总浅析Prometheus 设计
    基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型
    删除的通话记录也能找回!如何iPhone很早以前的通话记录
    在VSCode中移除不必要的扩展
    Flume配置3——拦截器过滤
    构造TopRecord结构问题解法
    2.2_3&2.2_4调度器和闲逛进程、调度算法的评价指标
  • 原文地址:https://blog.csdn.net/m0_64996150/article/details/124786169