2008-11-29 15 views
8

Aquí es mi instrucción actual:comodines en PreparedStatements Java

SEARCH_ALBUMS_SQL = "SELECT * FROM albums WHERE title LIKE ? OR artist LIKE ?;"; 

Está volviendo de juegos compatibles con los nombres de álbum o artista, pero no cualquier otra cosa. No puedo usar un '%' en la declaración o recibo errores.

¿Cómo agrego comodines a una declaración preparada?

(estoy usando Java5 y MySQL)

Gracias!

+0

Aquí hay una [mejor versión de la misma pregunta] (http://stackoverflow.com/q/8247970/154527). –

Respuesta

18

Coloca el% en la variable enlazada. Así lo hace

stmt.setString(1, "%" + likeSanitize(title) + "%"); 
    stmt.setString(2, "%" + likeSanitize(artist) + "%"); 

Debe añadir ESCAPE '!' para permitirle escapar caracteres especiales que importan a COMO en sus entradas.

Antes de utilizar título o artista debe desinfectar ellos (como se muestra arriba) al escapar caracteres especiales (, %, _, y [!) Con un método como este:

public static String likeSanitize(String input) { 
    return input 
     .replace("!", "!!") 
     .replace("%", "!%") 
     .replace("_", "!_") 
     .replace("[", "!["); 
} 
+1

Entonces, ¿qué pasa si la variable enlazada realmente tiene un carácter '%'? –

+0

@Eric - Entonces no necesita agregarlo. No hay nada mágico en hacerlo en setString en lugar de hacerlo en ningún otro lado. –

+4

Si su variable enlazada tiene un '%' literal, debe escapar como '\%'. Ver el método Java java.lang.String.replace(). –