2010-05-20 11 views
7

Próbuję wygenerować niektóre pliki sql w mojej aplikacji java. Aplikacja będzie nie wykonać żadnych instrukcji sql, wystarczy wygenerować plik z instrukcjami sql i zapisz go.Java: Przygotowanie instrukcji bez połączenia

Chciałbym użyć java.sql.PreparedStatement, aby utworzyć moje instrukcje, tak, że nie muszę sprawdzać poprawności każdego łańcucha itp. Za pomocą własnych metod.

Czy istnieje sposób użycia funkcji PreparedStatement bez wywoływania funkcji java.sql.Connection.prepareStatement(String), ponieważ nie mam java.sql.Connection?

Odpowiedz

3

Zgaduję, że dopóki masz połączenie sql, parser nie będzie wiedział, co do zastosowania zasady. Zgaduję, że to w rzeczywistości sterownik SQL, a nawet serwer, który kompiluje instrukcję sql.

Zakładając, że twój sql jest wystarczająco prosty, to może skorzystać z taniego połączenia, na przykład połączenia sqlite.

SQLite utworzy nową bazę danych w locie, jeśli baza danych, z którą próbujesz się połączyć, nie istnieje.

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

Jak mogę utworzyć połączenie bez czegoś, z czym można się połączyć? – r3zn1k

+0

sqlite utworzy dla ciebie nową bazę danych, jeśli jej nie ma - dodał fragment kodu uzasadnienia koncepcji koncepcji – blissapp

+0

Aktualizacja, dowiedziałem się, że bazy danych SQLite mogą być tworzone w pamięci tylko za pomocą ciągu połączenia "jdbc: sqlite :: memory:" – blissapp

0

Spróbuj wprowadzić w życie PreparedStatement.

przykład: Klasa YourOwnClass realizuje PreparedStatement {

// 1. Do realizacji wszystkich metod, 2. Znajdź minimalną logiczny do realizacji z OraclePreparedStatement (classes12.jar) lub sun.jdbc.odbc.JdbcOdbcCallableStatement

}

+0

Samo użycie wyrażenia regularnego lub czegoś podobnego byłoby znacznie łatwiejsze ... – r3zn1k

+0

@ r3zn1k: Zaletą implementacji jest to, że kod jest następnie ponownie użyty: może wygenerować tekst SQL lub bezpośrednio wykonać SQL. Jednak nie byłbym zaskoczony, gdybyś nie potrzebował tej elastyczności. :) –

0

to nikczemnego przebiegły problemu, dziękuję w pełni to dość łatwe do radzenia sobie z:

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; 
    } 
} 

Aby skorzystać, wystarczy napisać anonimowy klasy, który zastępuje void preparePrepared (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! Masz teraz sposób na pracę z PreparedStatement bez zbudowania go. Oto przykład pokazujący minimalne boilerplate chcesz inaczej trzeba skopiować pasta do królestwa przyjść, za każdym razem chciałem napisać inny oświadczenie:

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); } 
    } 
} 

Naprawdę naprawdę nie chcą być kopia wklejanie, że wszędzie, czy ty?

Powiązane problemy