批处理sql语句的学习笔记

本文介绍两种批量执行SQL的方法:使用Statement和PreparedStatement进行批处理。通过示例展示了如何提高数据库操作效率,尤其是在面对大量数据插入时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 转载请注明出处。 https://blog.youkuaiyun.com/Mr_wang__/article/details/52504520
  2. Connection conn = null;  
  3. Statement stmt = null;  
  4. ResultSet rs = null;  
  5. try {  
  6.     conn = JdbcUtils.getConnection();//自己写的工具类不要误解  
  7.     String sql1 = "insert into person values (1,'aaa')";  
  8.     String sql2 = "insert into person values (2,'bbb')";  
  9.     String sql3 = "delete from person where id = 2";  
  10.     stmt = conn.createStatement();//这种方式,如果sql语句有上百条以上,那就要有很多次addBatch。很麻烦  
  11.     stmt.addBatch(sql1);  
  12.     stmt.addBatch(sql2);  
  13.     stmt.addBatch(sql3);  
  14.     int[] i = stmt.executeBatch();// 获得三条语句每条执行后影响的行数。形成一个数组  
  15.     for (int j : i) {  
  16.         System.out.println(j);// 结果是三个1  
  17.     }  
  18. catch (Exception e) {  
  19.     e.printStackTrace();  
  20. finally {  
  21.     JdbcUtils.release(rs, stmt, conn);//工具类,释放连接  
  22. }  


 

方式二:用PreparedStatment批处理,只能处理sql语句相同,而参数不同。

[java]  view plain  copy
  1. Connection conn = null;  
  2. PreparedStatement stmt = null;  
  3. ResultSet rs = null;  
  4. try {  
  5.     conn = JdbcUtils.getConnection();  
  6.     String sql = "insert into person values (?,?)";  
  7.     stmt = conn.prepareStatement(sql);  
  8.     for(int i=0;i<100;i++){  
  9.          stmt.setInt(1, i+1);  
  10.          stmt.setString(2"aaa");//参数数据,实际应用时,可以通过别的方式进行赋值。  
  11.          stmt.addBatch();  
  12.     }  
  13.     stmt.executeBatch();  
  14.   
  15. catch (Exception e) {  
  16.     e.printStackTrace();  
  17. finally {  
  18.     JdbcUtils.release(rs, stmt, conn);  
  19. }  

注意:对mysql进行存储,如果批处理有1000万条,需要40分钟左右!而且此时方式二要注意,prepareStatement在缓存sql时的溢出。

[java]  view plain  copy
  1. Connection conn = null;  
  2. PreparedStatement stmt = null;  
  3. ResultSet rs = null;  
  4. try {  
  5.     conn = JdbcUtils.getConnection();  
  6.     String sql = "insert into person values (?,?)";  
  7.     stmt = conn.prepareStatement(sql);  
  8.     for(int i=0;i<1000000;i++){//mysql一般需要40分钟才会存完  
  9.          stmt.setInt(1, i+1);  
  10.          stmt.setString(2"aaa");  
  11. <span style="white-space:pre">    </span>     stmt.addBatch();  
  12.          if((i+1)%1000==0){  
  13.         stmt.executeBatch();//每执行一次<span style="font-family: Arial, Helvetica, sans-serif;">就清一次sql缓存。</span>  
  14.         stmt.clearBatch();  //否则每一次是执行1000,2000,3000...条sql语句而不是每一次执行1000条  
  15.          }  
  16.     }  
  17.     stmt.executeBatch();//最后少于1000条sql语句也要执行。  
  18.   
  19. catch (Exception e) {  
  20.     e.printStackTrace();  
  21. finally {  
  22.     JdbcUtils.release(rs, stmt, conn);  
  23. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值