2012-10-23 133 views
0

我有一个字符串是插入语句,我需要替换特殊字符?到列表中的特定元素。 查询字符串是替换特殊字符?在与列表中的特定元素的字符串

insert into OPRS_VEHICLE(VEHICLE_ID, DEPOT_ID, SERVICE_TYPE_ID, REGISTRATION_KEY, 
          REGISTRATION_NO, IS_ACTIVE,CREATED_BY, CREATED_DATE, 
          MODIFIED_BY, MODIFIED_DATE) values(?,?,?,?,?,?,?,?,?,?) 

现在我需要更换每?字符与列表中包含值的特定元素。

我想这

int index = query.indexOf("?"); 
for (int j = 0; j < list.size(); j++) { 
    formattedQuery = query.replace(query.substring(index, index+1), 
            list.get(j).toString()); 
} 

我需要更换?与列表的相应值。

编辑

try{ 
      conn.setAutoCommit(false); 
      if(query != null){ 
       ps = conn.prepareStatement(query); 
       for (int i = 0; i < myCollection.size(); i++) { 
        List list = (List) myCollection.get(i); 
        int count = 1; 
        for (int j = 0; j < list.size(); j++) {      
         if(list.get(j) instanceof Timestamp) { 
          ps.setTimestamp(count, (Timestamp) list.get(j));  
         } else if(list.get(j) instanceof java.lang.Character) { 
          ps.setString(count, String.valueOf(list.get(j))); 
         } 
         else { 
          ps.setObject(count, list.get(j)); 
         } 
         count++; 
        } 
        try { 
         ps.execute(); 
        } catch (Exception e) { 


         } 

如果准备语句的执行失败,那么我需要调用这需要整个集合列表的方法和一次插入一个声明和承诺。这个怎么做 ? (或)我的想法是,因为我知道数组的大小,我可以将数组分成一半的大小,然后准备声明并插入它?哪一个更好更安全?有没有可能这样做?

由于提前

如果你想使用字符串保持
+1

你面临什么问题? –

+1

问题是什么? “我需要......”不是问题 – SJuan76

+10

你应该使用[一个'PreparedStatement'](http://stackoverflow.com/questions/4984747/java-preparedstatement)。 – assylias

回答

2

这样你永远不会得到格式正确的查询。因为您正在替换query字符串并将其分配给新的formattedQuery。这formattedQuery将保留所有?占位符,但是最后一个循环长度。这不会导致你的预期。

您应该实际使用PreparedStatement来设置查询中的值。
请参阅下面的示例。

PreparedStatement pst = con.prepareStatement(query); 
for (int j = 0; j < list.size(); j++) { 
    pst.setString(j + 1, list.get(j).toString()); 
} 

pst.execute.... 

回答有关更新发布

相同的代码可有轻微的变化,从列表中提交有效记录执行。
我已经部分更改了您的代码并包含了一些用于理解的注释,如下所示。
应该解决您的问题:

try { 
    conn.setAutoCommit(false); 
    if (query != null) { 
    ps = conn.prepareStatement(query); 
    for (int i = 0; i < myCollection.size(); i++) { 
     List list = (List) myCollection.get(i); 
     int count = 1; 
     for (int j = 0; j < list.size(); j++) { 
     if (list.get(j) instanceof Timestamp) { 
      ps.setTimestamp(count, (Timestamp) list.get(j));  
     } else if(list.get(j) instanceof java.lang.Character) { 
      ps.setString(count, String.valueOf(list.get(j))); 
     } else { 
      ps.setObject(count, list.get(j)); 
     } 
     count++; 
     } // for inner list 

     // now a record data is ready 
     try { 
     ps.execute(); 

     // no errors? then if you don't want to lose, commit this record. 
     // because you are fearing if there would be error in next records to be inserted. 
     conn.commit(); 
     } catch (Exception specificE) { 
     // handle specific ex here 
     } // try, catch 

     // clear current record parameters from the prepared statement. 
     // this allows to set next record parameters in loop continuation. 
     ps.clearParameters(); 
    } // for outer collection 
    } // if query 
} catch(Exception e) { 
    // handle general ex here 
} finally { 
    // close db objects if required 
} // try, catch, finally 
+0

如何在预准备语句失败时执行单个语句?那是我有一个包含数组像[[1,2,3],[1,2,3]]的列表,所以如果插入语句失败,那么我需要执行每个准备好的语句?有没有办法做到这一点? –

+0

您应该定义您的数组或一组数组以匹配查询参数的数量。然后您可以使用pst按顺序或批次插入每条记录。使用新的查询要求和您拥有的数据格式更新您的发布。然后我可以更好地建议你。 –

+0

请查看编辑部分,我已更新我的发布。谢谢 –

0

,尝试:

int index = 0; 
String formattedQuery = query; 
for (int j = 0; j < list.size(); j++) { 
    index = query.indexOf("?",index); 
    formattedQuery = formattedQuery.replaceFirst("\\?", list.get(j).toString());       
} 
5

,你必须查询字符串实际上是如何与动态值SQL语句JDBC中表示的例子。见如何你通常会用适当的值替换您的查询字符串的字符?PreparedStatement documentation下面的例子:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); 
pstmt.setBigDecimal(1, 153833.00) 
pstmt.setInt(2, 110592) 

您还可以在Oracle的JDBC基础知识教程一看here

0

您可以使用Java Formatter类,但通常使用%作为值的占位符而不是?因为它使用printf格式的字符串。

然后你就可以做,

Formatter formatter = new Formatter() 
formatter.format("INSERT INTO table_name(a_column, another_column) values(%s,%s)", value1, value2); 
String formattedString = formatter.toString(); 

但是,是的,尽量使用PreparedStatement的。

另外弹簧类SimpleJdbcTemplate有一个update(String sql, Object... args)方法,将做你想要的。

例如, jdbc.update(sql, value1, value2)