2014-03-03 28 views
1

我有一个批处理程序,用于使用JDBC调用数据库。 我使用'ID'作为主键发送一批100个信息。如何使用Java执行多个SQL语句?

我想对数据库进行一次调用,然后在关闭连接之前执行多个SQL语句。

我参考

 // Database credentials 
     String USER = username; 
     String PASS = password; 

     Connection connec = null; 
     Statement stmt = null; 

     //STEP 2: Register JDBC driver 
     Class.forName("com.mysql.jdbc.Driver"); 

     //STEP 3: Open a connection 
     System.out.println("Connecting to a selected database..."); 
     connec = DriverManager.getConnection(DB_URL, USER, PASS); 
     System.out.println("Connected database successfully..."); 

     //STEP 4: Execute a query 
     System.out.println("Creating statement..."); 
     stmt = connec.createStatement(); 

     // Step 2: To update the database with the new count and the netppe values. 

     // Step to know whether the ID is present or not in the database 
     for(int i=0;i<identities.length;i++){ 
     String booleanString = "SELECT 1 FROM cgm_counters WHERE id = "+identities[i]; 

stmt.execute(booleanString); 
     ResultSet resultSet = stmt.getResultSet(); //result set for records 
     boolean recordFound = resultSet.next(); 
     ResultSet rs = null; 
// Retrieve the 'netppe' information. 
     if(recordFound){ 

      String sql = "SELECT * FROM cgm_counters WHERE id="+identities[i]; 
      rs = stmt.executeQuery(sql); 
      while(rs.next()){ 
       //Retrieve by column name 
       double net_ppe = rs.getDouble("spend"); 
       System.out.println("The value of the netppe :"+net_ppe); 
      } 

}// end of 'If' statement 

我想for循环做的三件事一气呵成每个ID在发布代码的部分。

1 > I want to see whether the ID is present or not in the database 
2 > If ID - present 
{ 
2 a > retrieve the 'netppe' information for that particular ID 
2 b > retrieve the 'count' information for that same ID 
2 c> Update the database with the new 'netppe' and 'count' value for the same ID 
} else { 
Insert the information for the new ID 
} 

如何执行所有语句而不必关闭每个ID的连接? JDBC和SQL的新手。任何帮助表示赞赏。

+0

使用jdbc批处理。 – Kick

+0

为什么你需要关闭每个ID的连接?你没有没有关闭连接的代码吗? – eis

+0

@eis删除了'rs.close()'语句,并且如果我没有关闭连接并执行多个语句,那么相同的步骤会工作吗? – user3188390

回答

4

好的,所以你的代码有很多问题。首先,

//STEP 2: Register JDBC driver 
Class.forName("com.mysql.jdbc.Driver"); 

您将不得不通过驱动程序实现,而不是接口本身;但好消息是,从JDBC 4.0开始,这些代码是不必要的。它已经扫描了你的类路径来为你找到驱动程序。

其次,您的连接没有关闭每个查询。你的代码中没有任何地方你打电话给connec.close()。 JDBC也不会为你关闭连接。

第三,你不需要用嵌套for循环来做到这一点!这是一个可怕的想法。你的SQL查询和JDBC的概念需要一些锐化。您可以简单地执行以下操作:

for(int i=0;i<identities.length;i++) { 
    String sql = "SELECT * FROM cgm_counters WHERE id="+identities[i]; 
    ResultSet rs = stmt.executeQuery(sql); 
    while(rs.next()){ 
     //Retrieve by column name 
     double net_ppe = rs.getDouble("spend"); 
     System.out.println("The value of the netppe :"+net_ppe); 
    } 
} 

更好的做法是执行批量查询。

String batch = "("; 
for (int i = 0; i < identities.length;i++) { 
    if (i < identities.length() - 1) 
     batch += "?, "; 
    else 
     batch += "?)" 
} 

String sql = "SELECT * FROM cgm_counters WHERE id in " + batch; 
ResultSet rs = stmt.executeQuery(sql); 
while(rs.next()) { 
    double net_ppe = rs.getDouble("spend"); 
    System.out.println("The value of the netppe :"+net_ppe); 
} 

看来你正在做前期一轮的查询,以“检查”每一个ID是否在该表中,但是这是没有必要的。如果ID不在表格中,那么您将得到一个空的结果集作为回报。空结果集没有任何问题。你的while循环永远不会运行在这种情况下,因为rs.next()将返回false。您也可以致电rs.first()查看是否为空。这种方式不会移动光标。

+0

我会执行然后标记,谢谢你的建议和帮助。希望如果我有一些问题,我会在需要时得到帮助。 – user3188390