2011-02-08 16 views

Respuesta

32

Usted puede utilizar String.Format

String st = "akkk %s la,ala %s "; 
String result = String.format(st, "First Val", "Second Val"); 

Como alternativa, puede utilizar posiciones numéricas

String st = "akkk %1$s la,ala %2$s "; 
String result = String.format(st, "First Val", "Second Val"); 
1

replaceFirst() es una mala idea en este caso - se espera que un primer argumento sea una expresión regular, si es segundo ar g contiene secuencias que se interpretan como directivas de procesamiento de expresiones regulares, por ejemplo. como referencias de grupo (como '$') obtendrá una excepción en una operación de base de datos trivial, dependiendo de los datos pasados ​​a la consulta.

0

Aquí está mi variación.

public class SimplePrepareStatement { 
    String vars[]; 
    String query; 

    public SimplePrepareStatement(String query) { 
     int countVars = StringUtils.countMatches(query, "?"); 
     vars = new String[countVars]; 
     this.query = query.replaceAll("\\?", "%s"); 
    } 

    public void setDouble(int i, Double arg0) { 
     vars[i-1] = "'"+arg0+"'"; 
    } 

    public void setString(int i, String arg0) { 
     vars[i-1] = "'"+arg0+"'"; 
    } 

    public void setObject(int i, String arg0) { 
     vars[i-1] = arg0; 
    } 

    public String getSQL() { 
     return String.format(query, vars); 
    } 
} 

Nota! Esto no es para uso de SQL, posibles inyecciones de SQL, solo un comportamiento similar.

@Test 
public void simplePrepareStatementTest() { 
    SimplePrepareStatement st = new SimplePrepareStatement("abc ? abc ?"); 
    st.setString(1, "a"); 
    st.setString(2, "b"); 
    assertEquals("abc 'a' abc 'b'", st.getSQL()); 
    st.setObject(1, "obj"); 
    assertEquals("abc obj abc 'b'", st.getSQL()); 
} 
Cuestiones relacionadas