• 售前

  • 售后

热门帖子
入门百科

jdbc使用PreparedStatement批量插入数据的方法

[复制链接]
六月清晨搅 显示全部楼层 发表于 2021-8-14 14:29:21 |阅读模式 打印 上一主题 下一主题
目次


  • 批量插入

    • 1. 批量实行SQL语句
    • 2. 高效的批量插入


批量插入



1. 批量实行SQL语句


当必要成批插入大概更新记录时,可以接纳Java的批量更新机制,这一机制答应多条语句一次性提交给数据库批量处理处罚。通常环境下比单独提交处理处罚更有用率
JDBC的批量处理处罚语句包罗下面三个方法:
       
  • addBatch(String):添加必要批量处理处罚的SQL语句或是参数;   
  • executeBatch():实行批量处理处罚语句;   
  • clearBatch():清空缓存的数据
通常我们会遇到两种批量实行SQL语句的环境:
       
  • 多条SQL语句的批量处理处罚;   
  • 一个SQL语句的批量传参;

2. 高效的批量插入


举例:向数据表中插入20000条数据
数据库中提供一个goods表。创建如下:
  1. CREATE TABLE goods(
  2. id INT PRIMARY KEY AUTO_INCREMENT,
  3. NAME VARCHAR(20)
  4. );
复制代码
实现层次一:使用Statement
  1. Connection conn = JDBCUtils.getConnection();
  2. Statement st = conn.createStatement();
  3. for(int i = 1;i <= 20000;i++){
  4. String sql = "insert into goods(name) values('name_' + "+ i +")";
  5. st.executeUpdate(sql);
  6. }
复制代码
实现层次二:使用PreparedStatement
  1. long start = System.currentTimeMillis();
  2.   
  3. Connection conn = JDBCUtils.getConnection();
  4.   
  5. String sql = "insert into goods(name)values(?)";
  6. PreparedStatement ps = conn.prepareStatement(sql);
  7. for(int i = 1;i <= 20000;i++){
  8. ps.setString(1, "name_" + i);
  9. ps.executeUpdate();
  10. }
  11.   
  12. long end = System.currentTimeMillis();
  13. System.out.println("花费的时间为:" + (end - start));//82340
  14. JDBCUtils.closeResource(conn, ps);
复制代码
实现层次三
  1. /*
  2. * 修改1: 使用 addBatch() / executeBatch() / clearBatch()
  3. * 修改2:mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
  4. *    ?rewriteBatchedStatements=true 写在配置文件的url后面
  5. * 修改3:使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
  6. *
  7. */
  8. @Test
  9. public void testInsert1() throws Exception{
  10. long start = System.currentTimeMillis();
  11.   
  12. Connection conn = JDBCUtils.getConnection();
  13.   
  14. String sql = "insert into goods(name)values(?)";
  15. PreparedStatement ps = conn.prepareStatement(sql);
  16.   
  17. for(int i = 1;i <= 1000000;i++){
  18.   ps.setString(1, "name_" + i);
  19.    
  20.   //1.“攒”sql
  21.   ps.addBatch();
  22.   if(i % 500 == 0){
  23.    //2.执行
  24.    ps.executeBatch();
  25.    //3.清空
  26.    ps.clearBatch();
  27.   }
  28. }
  29.   
  30. long end = System.currentTimeMillis();
  31. System.out.println("花费的时间为:" + (end - start));//20000条:625                                                                         //1000000条:14733  
  32.   
  33. JDBCUtils.closeResource(conn, ps);
  34. }
复制代码
实现层次四
  1. /*
  2. * 层次四:在层次三的基础上操作
  3. * 使用Connection 的 setAutoCommit(false)  /  commit()
  4. */
  5. @Test
  6. public void testInsert2() throws Exception{
  7. long start = System.currentTimeMillis();
  8.   
  9. Connection conn = JDBCUtils.getConnection();
  10.   
  11. //1.设置为不自动提交数据
  12. conn.setAutoCommit(false);
  13.   
  14. String sql = "insert into goods(name)values(?)";
  15. PreparedStatement ps = conn.prepareStatement(sql);
  16.   
  17. for(int i = 1;i <= 1000000;i++){
  18.   ps.setString(1, "name_" + i);
  19.    
  20.   //1.“攒”sql
  21.   ps.addBatch();
  22.    
  23.   if(i % 500 == 0){
  24.    //2.执行
  25.    ps.executeBatch();
  26.    //3.清空
  27.    ps.clearBatch();
  28.   }
  29. }
  30.   
  31. //2.提交数据
  32. conn.commit();
  33.   
  34. long end = System.currentTimeMillis();
  35. System.out.println("花费的时间为:" + (end - start));//1000000条:4978
  36.   
  37. JDBCUtils.closeResource(conn, ps);
  38. }
复制代码
到此这篇关于jdbc使用PreparedStatement批量插入数据的文章就介绍到这了,更多相干jdbc使用PreparedStatement批量插入数据内容请搜索脚本之家以前的文章或继续浏览下面的相干文章盼望各人以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作