谨记:字符串拼接的时候一定要用引号引起来。

技巧:当jdbc处理sql语句时提示错误,可以将执行的sql语句打印出来,然后再在数据库中执行,从而解决错误。

一、JDBC的批量插入

JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。
    我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试
    方法一,使用PreparedStatement加批量的方法
    Java代码     
  try {   
      Class.forName("com.mysql.jdbc.Driver");   
      conn = DriverManager.getConnection(o_url, userName, password);   
      conn.setAutoCommit(false);   
      String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";   
      PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);   
      for(int x = 0; x < size; x++){   
         prest.setString(1, "192.168.1.1");   
         prest.setString(2, "localhost");   
         prest.setString(3, "20081009");   
         prest.setInt(4, 8);   
         prest.setString(5, "11111111");   
         prest.addBatch();   
      }   
      prest.executeBatch();   
      conn.commit();   
      conn.close();   
} catch (SQLException ex) {   
   Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);   
} catch (ClassNotFoundException ex) {   
     Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);   
}   
 
说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

方法二 使用Statement加批量的方法
Java代码
    
 conn.setAutoCommit(false);   
 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);   
 for(int x = 0; x < size; x++){   
   stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");   
 }   
stmt.executeBatch();   
conn.commit();

方法三:直接使用Statement
Java代码
conn.setAutoCommit(false);   
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
                                    ResultSet.CONCUR_READ_ONLY);   
for(int x = 0; x < size; x++){   
   stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");   
}   
conn.commit();  
使用上述方法分别插入10万条数据的平均测试时间为:
方法一:17.844s
方法二:18.421s
方法三:16.359s

可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。附件中是我测试代码,可以用来在自己电脑上跑一下。

在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。

Java代码
conn.setAutoCommit(false)  
二、JDBC的批量更新

于阿堂在原来的老项目中,用jdbc操作时,用到了jdbc的批量操作,加上前段时间看《疯狂java讲义》时,也看到李刚作者的相关介绍。考虑还是会有人要用到jdbc的操作的,所以,阿堂还是把它整一下,就成了下面的文字了。用JDBC的DML语句时(insert,delete,update),我们可能可能需要同时某几个表都要进行DML操作,比如,当我们对A表插入的时候,同时也要对B表插入相关的记录,还要同时更新C表的关联记录,这样就会涉及到三条DML的sql语句,如果不用批量更新功能的话,我们就得单独去处理,效率相对就要低些了。。使用批量更新时,多条sql语句将会被作为一批操作被同时收集,并同时提交。值得注意的是,批量更新必须得到底层数据库的支持,可能通过DatabaseMetaData的supportBatchUpdates方法来查看底层数据库是否支持批量更新
//conn是Connection的类型
  DatabaseMetaData dbmd=conn.getMetaData();
//若a为true则意味着该数据是支持批量更新的
boolean a=dbmd.supportsBatchUpdates();

为了保证批量更新的操作可以正确处理错务,必须把批量更新的操作视为单个事务,如果批理更新在执行过程中失败,则让事务回滚到操作开始之前的状态。为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式
 具体如下代码片断所示
 try
 {
  //保存当前自动提交模式
  boolean autoCommit=conn.getAutoCommit();
  //关闭自动提交
  conn.setAutoCommit(false);
  //使用Statement同时收集多条sql语句
  stmt.addBatch(insert_sql1);
  stmt.addBatch(insert_sql2);
  stmt.addBatch(update_sql3);
  ..
  //同时提交所有的sql语句
  stmt.executeBatch();
  //提交修改
  conn.commit();
  conn.setAutoCommit(autoCommit);
 }
 catch(Exception e)
 {
     e.printStackTrace()
     conn.rollback(); 
 }

附:需要说明的一点是,如果是addBatch()方法中加了select查询语句,程序将直接出现错务的

这个又是一种方法批量进行更新。但是我认为上面那个方法不错

tx=session.beginTransaction();
Connection con = session.connection();
PreparedStatement stmt = con.prepareStatement(
     "update CUSTOMERS set AGE=AGE+1 where AGE>0");
stmt.excuteUpdate();
tx.commit();

三、JDBC批量删除

String sql="delete from table where id in(0"; 
String id[]=要删除的ID数组; 
for(int i=0;i <id.length;i++) 

  sql+=","+id[i]; 

sql+=")"; 
PreparedStatement ps=conn.prepareStatement(sql); 
ps.execute();

  1. public void deleteBat(Integer[] catNo){
  2. try {
  3. Connection con=DBUtil.getInstance().getCon();
  4. String sql="delete from cat where catno=?";
  5. con.setAutoCommit(false);
  6. PreparedStatement ps=con.prepareStatement(sql);
  7. for (Integer in : catNo) {
  8. ps.setInt(1, in);
  9. ps.addBatch();
  10. }
  11. int[] result=ps.executeBatch();
  12. con.commit();
  13. for (int i : result) {
  14. System.out.println(i);
  15. }
  16. catch (ClassNotFoundException e) {
  17. e.printStackTrace();
  18. catch (SQLException e) {
  19. e.printStackTrace();
  20. }

jdbc批量插入、批量删除、批量更新相关推荐

  1. mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新

    批量处理:一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不确定JDBC驱动程序是否支持此功能.应该使用DatabaseMetaData.supportsBatchUpdates( ...

  2. batchupdate写法_mybatis执行批量插入insert和批量更新update

    Mybatis批量插入和批量更新数据的资料相信大家从网上能查找到很多资料,本文重点总结一下mybatis执行批量插入insert和批量更新update数据.在mysql数据库中批量插入,如:inser ...

  3. oracle批量查询更新,Oracle批量查询、删除、更新使用BULK COLLECT提高效率

    BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记. 例1: 批量查询项目资金账户号为 & ...

  4. SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

    原文:SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入) 临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:4 ...

  5. mybatis批量插入(insert)和批量更新(update)

    文章目录 一.Mybatis批量插入 二.批量更新 前言:这两天在做mybatis批量插入和更新的时候,对这块不是很清楚,所以今天写篇文章,巩固加深印象. 一.Mybatis批量插入 批量插入的sql ...

  6. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

    主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...

  7. jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

    主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一 ...

  8. 判断触发器正在处理的是插入,删除还是更新触发

    平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器. 但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作 ...

  9. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

    风过无痕 原文  arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...

  10. QTabelWidget表格的插入、删除、更新、动态滑动条以及配合QFile进行表格内容的长期存储

    QTabelWidget表格的插入.删除.更新以及配合QFile进行表格内容的长期存储 [1]QTabelWidget界面初始化 [2]QTabelWidget效果图 [3]QTabelWidget初 ...

最新文章

  1. Scrum立会报告+燃尽图(十月三十日总第二十一次)
  2. 师兄送福利:蓝牙调试工具使用教程
  3. SDL介绍和简单实用
  4. 有感于任正非老爷子的发言
  5. oracle中的null 字段,Oracle下的NULL字段
  6. 如何用Python批量修改文件名?
  7. 零基础学Python(第十一章 字符串处理)
  8. 最喜欢的博客书签和站内短信系统
  9. CentOS 7.2.1511 x64下载地址
  10. 判断进程是否正在运行
  11. 【数据库】第五章 数据库的完整性(2020.4.15)联系第三章
  12. Oracle查询优化改写技巧与案例总结一
  13. 与秦岭有关的诗词146首
  14. linux 打包大文件,tar打包处理大文件的解压缩方法
  15. IDEA汉化包安装和卸载
  16. 如何使用Three.js为3D模型构建Color Customizer应用
  17. 计算机如何永久删除文件无法找回,怎么找回永久删除文件 找回永久删除文件方法【详细步骤】...
  18. 腾讯自选股如何实现单位小时内完成千万级数据运算
  19. 工业大数据技术与应用2017材料整理
  20. Ubuntu(护眼设置)安装屏幕色温调节软件F.lux

热门文章

  1. 使用h5的方式来实现钟表
  2. 什么是5G advanced
  3. 【JavaScript练习】实现数组按照数组项中userName中的姓名拼音排序
  4. 开场白——第一篇博客
  5. java面试宝典2013
  6. 数字经济2.0—趋势、逻辑、选择
  7. JAVA知识两百问(181~200)
  8. 帮你学会webpack
  9. 73939133——“我穿越了无数条世界线,却看不到我要的未来”
  10. FX5U 原点回归指令 DSZR