2008-11-29 13 views
8

Voici mon instruction en cours SQL:caractères génériques dans Java PreparedStatements

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

Il est de retour correspond exactement aux noms d'album ou de l'artiste, mais rien d'autre. Je ne peux pas utiliser '%' dans la déclaration ou j'ai des erreurs.

Comment ajouter des caractères génériques à une instruction préparée?

(j'utilise Java5 et MySQL)

Merci!

+0

Voici une [meilleure version de la même question] (http://stackoverflow.com/q/8247970/154527). –

Répondre

18

Vous placez le% dans la variable liée. Alors vous faites

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

Vous devez ajouter ESCAPE '! pour vous permettre d'échapper à des caractères spéciaux qui importent à LIKE dans vos entrées.

Avant d'utiliser titre ou artiste vous devriez les aseptiser (comme indiqué ci-dessus) par l'échappement des caractères spéciaux (, %, _ et [!) Avec une méthode comme ceci:

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

Alors, que se passe-t-il si la variable liée contient un caractère '%'? –

+0

@Eric - Alors vous n'avez pas besoin de l'ajouter. Il n'y a rien de magique à le faire dans le setString plutôt que nulle part ailleurs. –

+4

Si votre variable liée a un '%' littéral, vous devez l'échapper en tant que '\%'. Voir la méthode Java java.lang.String.replace(). –

Questions connexes