2010-05-20 3 views
7

J'essaie de générer des fichiers sql dans mon application Java. L'application va pas exécuter des instructions SQL, il suffit de générer un fichier avec des instructions SQL et enregistrez-le.Java: préparer une instruction sans connexion

Je voudrais utiliser le java.sql.PreparedStatement pour créer mes instructions afin que je n'ai pas à valider chaque chaîne etc. avec mes propres méthodes.

Existe-t-il un moyen d'utiliser le PreparedStatement sans la fonction java.sql.Connection.prepareStatement(String) d'appel, parce que je n'ai pas un java.sql.Connection?

Répondre

3

Jetez un oeil à cette bibliothèque Java: http://openhms.sourceforge.net/sqlbuilder/

+0

Cette bibliothèque importe le paquet "com.healthmarketscience.common.util" qui n'est pas inclus ... – r3zn1k

+0

Vous devez faire un petit tour: http://openhms.sourceforge.net/common-util/ – PeterMmm

+0

Meilleure solution. Merci beaucoup! – r3zn1k

3

Je devine que jusqu'à ce que vous avez une connexion SQL, l'analyseur ne saura pas quelles sont les règles à appliquer. Je devine que c'est en fait le pilote SQL ou même le serveur qui compile l'instruction sql.

En supposant que votre SQL est assez simple, alors que diriez-vous d'utiliser une connexion bon marché, comme, par exemple, une connexion sqlite. SQLite créera une nouvelle base de données à la volée si la base de données à laquelle vous essayez de vous connecter n'existe pas.

public Connection connectToDatabase() { 

// connect to the database (creates new if not found) 
try { 
    Class.forName("org.sqlite.JDBC"); 
    conn = DriverManager.getConnection("jdbc:sqlite:mydatabase.db"); 

    // initialise the tables if necessary 
    this.createDatabase(conn); 
} 
catch (java.lang.ClassNotFoundException e) { 
    System.out.println(e.getMessage()); 
} 
catch (java.sql.SQLException e) { 
    System.out.println(e.getMessage()); 
} 

return conn; 

} 
+0

Alors, comment puis-je créer une connexion sans que je me connecte? – r3zn1k

+0

sqlite créera une nouvelle base de données si elle n'existe pas - ajouté un extrait de code de preuve de concept – blissapp

+0

Update, vient d'apprendre que les bases de données SQLite peuvent être créées en mémoire uniquement avec la chaîne de connexion "jdbc: sqlite :: memory:" – blissapp

0

Essayez d'implémenter PreparedStatement.

Exemple: classe YourOwnClass implémente PreparedStatement {

// 1. Ne mettre en œuvre toutes les méthodes, 2. Obtenez la logique minimale à mettre en œuvre à partir OraclePreparedStatement (classes12.jar) ou sun.jdbc.odbc.JdbcOdbcCallableStatement

}

+0

Utiliser simplement regex ou quelque chose comme ça serait beaucoup plus facile ... – r3zn1k

+0

@ r3zn1k: L'avantage de cette implémentation est que le code est réutilisable: il peut générer du texte SQL ou directement exécuter le SQL. Cependant, je ne serais pas surpris si vous n'aviez pas besoin de cette flexibilité. :) –

0

ce problème sournoise ignobles, merci entièrement il est assez facile de faire face à:

public class PreparedStatementBuilder 
{ 
    private String sql; // the sql to be executed 

    public PreparedStatementBuilder(final String sql) { this.sql = sql; } 

    protected void preparePrepared(final PreparedStatement preparedStatement) 
      throws SQLException 
    { 
     // this virtual method lets us declare how, when we do generate our 
     // PreparedStatement, we want it to be setup. 

     // note that at the time this method is overridden, the 
     // PreparedStatement has not yet been created. 
    } 

    public PreparedStatement build(final Connection conn) 
      throws SQLException 
    { 
     // fetch the PreparedStatement 
     final PreparedStatement returnable = conn.prepareStatement(sql); 
     // perform our setup directives 
     preparePrepared(returnable); 
     return returnable; 
    } 
} 

Pour utiliser, il suffit d'écrire une classe anonyme qui remplace preparePrepared void (PreparedStatement):

final String sql = "SELECT * FROM FOO WHERE USER = ?"; 
    PreparedStatementBuilder psBuilder = new PreparedStatementBuilder(sql){ 
     @Override 
     protected void preparePrepared(PreparedStatement preparedStatement) 
      throws SQLException 
     { 
      preparedStatement.setString(1, "randal"); 
     }}; 
    return obtainResultSet(psBuilder); 

Presto! Vous avez maintenant un moyen de travailler avec un PreparedStatement sans l'avoir encore construit. Voici un exemple montrant la boilerplate minimale que vous auriez autrement à copier coller au règne vienne, chaque fois que vous vouliez écrire une déclaration différente:

public ResultSet obtainResultSet(final PreparedStatementBuilder builder) 
     throws SQLException { 
    final Connection conn = this.connectionSource.getConnection(); 
    try 
    { 
     // your "virtual" preparePrepared is called here, doing the work 
     // you've laid out for your PreparedStatement now that it's time 
     // to actually build it. 
     return builder.build(conn).executeQuery(); 
    } 
    finally 
    { 
     try { conn.close(); } 
     catch (SQLException e) { log.error("f7u12!", e); } 
    } 
} 

Vous avez vraiment ne voulez vraiment pas être coller copie que partout, le faites vous?

Questions connexes