有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java替换特殊字符?在包含列表中特定元素的字符串中

我有一个字符串,它是一个insert语句,在这里我需要替换特殊字符?从列表中删除特定元素。 查询字符串为

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) {


                        }

如果prepared语句的执行失败,那么我需要调用一个方法,该方法获取整个集合列表,一次插入一条语句并提交。如何做到这一点?(或者)我的想法是,因为我知道数组的大小,我可以将数组分成一半大小,然后准备语句并插入它?哪一个更好更安全?有可能这样做吗

提前谢谢


共 (4) 个答案

  1. # 1 楼答案

    如果要继续使用字符串,请尝试:

    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());                        
    }
    
  2. # 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
    
  3. # 3 楼答案

    您可以使用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();
    

    但是,是的,试着使用预先准备好的声明

    另外,spring类SimpleJdbcTemplate有一个update(String sql, Object... args)方法,它将完全满足您的需求

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

  4. # 4 楼答案

    您拥有的查询字符串实际上是一个示例,说明了在JDBC中如何表示具有动态值的SQL语句。请参阅^{} documentation中的以下示例,了解通常如何用适当的值替换查询字符串中的?字符:

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

    你也可以看看Oracle的JDBC基础教程