葡京网投哪个正规 > 首页 > 使用JDBC进行批处理,批量更新问题的解决方法

原标题:使用JDBC进行批处理,批量更新问题的解决方法

浏览次数:161 时间:2020-05-08

Statement 和PreparedStatement的问题 Statement sm = cn.createStatement(); sm.addBatch(sql1); sm.addBatch(sql2); ... sm.executeBatch() 用Statement的好处就是每次可以直接传一个SQL语句进去,不用管那么多。可是在数据量比较大的时候,应该会对效率有影响。不建议使用。 PreparedStatement ps教程 = cn.preparedStatement(sql); { ps.setXXX(1,xxx); ... ps.addBatch(); } ps.executeBatch(); PreparedStatement是会预编译的,只要一条SQL,不断动态设值,然后addBatch(),在数据量大的时候比较好,非常建议使用。 还有就是JDBC的驱动问题,很多同志可能还是在用2000的驱动呢,没有用批量更新的程序没有多大问题,可是一旦用了批量更新,出现很多问题, 反正数据库教程很卡,慢。还可以更新不了哦。 我强烈建议大家更新JDBC驱动。 但是如果出现 SQLServerException: sp_cursoropen/sp_cursorprepare: 该语句参数只能是一个批或带有单个 SELECT 语句的存储过程,且不带 FOR BROWSE、COMPUTE BY 或变量赋值。 应该就是JDBC的版本问题,1.0的驱动有这个问题,好像不支持批量更新,我建议大家使用1.2 我测试过了,完全没有问题! 提供一些数据连接参数 jdbc.driverClassName:com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url:jdbc:sqlserver://127.0.0.1:1444;databaseName=fax;selectMethod=cursor;

1、java数据库操作基本流程

2.2、采用PreparedStatement.addBatch()方式实现批处理的优缺点

  采用PreparedStatement.addBatch()实现批处理
    优点:发送的是预编译后的SQL语句,执行效率高。
    缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。

  关于JDBC批处理的内容就总结这么多。

 

  要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
  JDBC实现批处理有两种方式:statement和preparedstatement

  • 释放数据库连接

2.1、使用PreparedStatement完成批处理范例

  测试代码如下:

图片 1

 1 package me.gacl.demo;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import me.gacl.utils.JdbcUtils;
 7 import org.junit.Test;
 8 
 9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用prepareStatement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */ 
16 public class JdbcBatchHandleByPrepareStatement {
17 
18     @Test
19     public void testJdbcBatchHandleByPrepareStatement(){
20         long starttime = System.currentTimeMillis();
21         Connection conn = null;
22         PreparedStatement st = null;
23         ResultSet rs = null;
24         
25         try{
26             conn = JdbcUtils.getConnection();
27             String sql = "insert into testbatch(id,name) values(?,?)";
28             st = conn.prepareStatement(sql);
29             for(int i=1;i<1000008;i++){  //i=1000  2000
30                 st.setInt(1, i);
31                 st.setString(2, "aa" + i);
32                 st.addBatch();
33                 if(i%1000==0){
34                     st.executeBatch();
35                     st.clearBatch();
36                 }
37             }
38             st.executeBatch();
39         }catch (Exception e) {
40             e.printStackTrace();
41         }finally{
42             JdbcUtils.release(conn, st, rs);
43         }
44         long endtime = System.currentTimeMillis();
45         System.out.println("程序花费时间:" + (endtime-starttime)/1000 + "秒!!");
46     }
47 }

图片 2

  更新语句,返回数字,表示该更新影响的记录数。

二、使用PreparedStatement完成批处理

  该Statement取得的ResultSet就是可滚动的

一、使用Statement完成批处理

  1、使用Statement对象添加要批量执行SQL语句,如下:

1 Statement.addBatch(sql1);
2 Statement.addBatch(sql2);
3 Statement.addBatch(sql3);

  2、执行批处理SQL语句:Statement.executeBatch();
  3、清除批处理命令:Statement.clearBatch();

  多用于jsp中

1.1、使用Statement完成批处理范例

  1、编写测试的SQL脚本创建表

1  create table testbatch
2 (
3      id int primary key,
4      name varchar(20)
5 );

  2、编写测试代码,如下所示:

图片 3

 1 package me.gacl.demo;
 2 
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.Statement;
 6 import me.gacl.utils.JdbcUtils;
 7 import org.junit.Test;
 8 
 9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用Statement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */ 
16 public class JdbcBatchHandleByStatement {
17 
18     @Test
19     public void testJdbcBatchHandleByStatement(){
20         Connection conn = null;
21         Statement st = null;
22         ResultSet rs = null;
23         try{
24             conn = JdbcUtils.getConnection();
25             String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
26             String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
27             String sql3 = "insert into testbatch(id,name) values(3,'CCC')";
28             String sql4 = "insert into testbatch(id,name) values(4,'DDD')";
29             String sql5 = "update testbatch set name='gacl' where id=1";
30             String sql6 = "insert into testbatch(id,name) values(5,'FFF')";
31             String sql7 = "delete from testbatch where id=2";
32             st = conn.createStatement();
33             //添加要批量执行的SQL
34             st.addBatch(sql1);
35             st.addBatch(sql2);
36             st.addBatch(sql3);
37             st.addBatch(sql4);
38             st.addBatch(sql5);
39             st.addBatch(sql6);
40             st.addBatch(sql7);
41             //执行批处理SQL语句
42             st.executeBatch();
43             //清除批处理命令
44             st.clearBatch();
45         }catch (Exception e) {
46             e.printStackTrace();
47         }finally{
48             JdbcUtils.release(conn, st, rs);
49         }
50     }
51 }

图片 4

  Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);

1.2、采用Statement.addBatch(sql)方式实现批处理的优缺点

  采用Statement.addBatch(sql)方式实现批处理:
    优点:可以向数据库发送多条不同的SQL语句。
    缺点:SQL语句没有预编译。
    当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:

1 Insert into user(name,password) values('aa','111');
2 Insert into user(name,password) values('bb','222');
3 Insert into user(name,password) values('cc','333');
4 Insert into user(name,password) values('dd','444');

  3、提交

  3、处理执行结果

  PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

  可滚动、更新的记录集

  2、几个常用的重要技巧:

  ResultSet的方法:

  String jndi = "jdbc/db";
  Context ctx = (Context) new InitialContext().lookup("java:comp/env");
  DataSource ds = (DataSource) ctx.lookup(jndi);
  Connection cn = ds.getConnection();

  批量更新

  例子:

  String className,url,uid,pwd;
  className = "oracle.jdbc.driver.OracleDriver";
  url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
  uid = "system";
  pwd = "manager";
  Class.forName(className);
  Connection cn = DriverManager.getConnection(url,uid,pwd);

  一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。

  2)用jndi(java的命名和目录服务)方式

  Statement sm ;
  sm = cn.createStatement(insert into user...);
  sm.executeUpdate();
  sm.close();

  cn.close();

  2、执行一系列sql语句

  一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection

  sm = cn.createStatement("insert into corp...);
  sm.executeUpdate();
  sm.close();

  cn.rollback();

  Statement sm = cn.createStatement();
  sm.addBatch(sql1);
  sm.addBatch(sql2);
  ...
  sm.executeBatch()

  1)用DriverManager取数据库连接

  2、执行sql语句

  1)用Statement来执行sql语句

  2、创建PreparedStatement时指定参数

  1、创建可滚动、更新的Statement

  java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果

  2)用PreparedStatement来执行sql语句

  cn.commit();

  例子

  1、取得数据库连接

  String sql;
  Statement sm = cn.createStatement();
  sm.executeQuery(sql); // 执行数据查询语句(select)
  sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();

  4、如果发生异常,那么回滚

  批量更新

  一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有

  1、Statement

  1、关闭Connection的自动提交

  cn.setAutoCommit(false);

  事务的处理

  ResultSet.absolute(9000);

  事务处理

  可滚动、更新的记录集

  2、getInt("id")或getSting("name"),返回当前游标下某个字段的值。

  String sql;
  sql = "insert into user (id,name) values (?,?)";
  PreparedStatement ps = cn.prepareStatement(sql);
  ps.setInt(1,xxx);
  ps.setString(2,xxx);
  ...
  ResultSet rs = ps.executeQuery(); // 查询
  int c = ps.executeUpdate(); // 更新

  1、next(),将游标往后移动一行,如果成功返回true;否则返回false。

  2、PreparedStatement

  3、释放连接。

  查询语句,返回记录集ResultSet。

  PreparedStatement ps = cn.preparedStatement(sql);
  {
  ps.setXXX(1,xxx);
  ...
  ps.addBatch();
  }
  ps.executeBatch();

本文由葡京网投哪个正规发布于首页,转载请注明出处:使用JDBC进行批处理,批量更新问题的解决方法

关键词:

上一篇:取最大值和最小值语句,摘自sql官方文档葡京网投哪个正规:

下一篇:葡京网投哪个正规:Server的MDF文件的方法