2016-01-12 3 views
0

Lorsque nous concaténons des chaînes statiques à la compilation à l'aide de l'opérateur +, le compilateur les joint et stocke une nouvelle chaîne statique à sa place.Comment faire de la chaîne avec des fragments de différentes stratégies statiques?

Maintenant, j'ai un modèle de stratégie qui fournit des fragments SQL qui devraient être concaténés dans une instruction SQL plus grande. Toutes les pièces sont statiques, mais comme il y a des appels de méthode impliqués, la jointure à la compilation ci-dessus ne se produit pas.

Exemple:

class MagicDao { 
    void Object daoMethod(GetStuff cmd) { 
     String sql = "select ... where " + cmd.getWhereClause() + " order by ..."; 
     // ... 
    } 
} 

public interface GetStuff { 
    String getWhereClause(); 

    Object[] getParameters(); 
} 

class GetFunStuff implements GetStuff { 
    public String getWhereClause() { 
     return " abc = ? "; 
    } 

    // ... 
} 

Je me demande est-il un modèle/truc qui fera la concaténation de chaîne SQL de compilation à nouveau tout en conservant la simplicité/lisibilité du code ci-dessus.

(Si la mise en cache est la seule solution, pourrait-on suggérer un lisible, thread-safe une doublure?)

(Motivation pour ce faire: faire des choses statiques sauvera des déchets innombrables sont créés chaque seconde lors de la construction de la chaîne processus et fait gagner du temps à la recherche la chaîne dans le cache PreparedStatement)

+0

Pourquoi êtes-vous préoccupé par cette concaténation au moment de la compilation? Comment cela affecte-t-il le code que vous avez? ** Combien de temps ** cela économise-t-il? –

Répondre

0

Je ne sais pas vraiment comment vous faire des requêtes SQL, mais vous pouvez envisager d'utiliser JDBC PreparedStatement, comme:.

PreparedStatement pstmt = con.prepareStatement("select ... where ? order by ..."); 
pstmt.setString(1, cmd.getWhereClause()); 

dans ce cas, votre String sera précompilé

+1

Il n'est pas possible d'avoir des fragments SQL (qui ne sont pas une valeur simiple) comme paramètres de requête ... –