2010-05-20 14 views
7

Estoy intentando generar algunos archivos sql en mi aplicación java. La aplicación será no ejecutar cualquier instrucción SQL, solo genere un archivo con sentencias sql y guárdelo.Java: preparar una declaración sin conexión

Me gustaría usar el java.sql.PreparedStatement para crear mis declaraciones para que no tenga que validar cada cadena, etc., con mis propios métodos.

¿Hay alguna manera de usar el PreparedStatement sin la función de llamada java.sql.Connection.prepareStatement(String), porque no tengo un java.sql.Connection?

Respuesta

3

supongo que hasta que tienes una conexión de SQL, el analizador no sabrá qué reglas se aplican. Supongo que en realidad es el controlador SQL o incluso el servidor el que está compilando la declaración sql.

Suponiendo que su sql es lo suficientemente simple, ¿qué tal si usamos una conexión barata, como, por ejemplo, una conexión sqlite?

SQLite creará una nueva base de datos sobre la marcha si la base de datos a la que intenta conectarse no existe.

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

Entonces, ¿cómo puedo crear una conexión sin algo para conectar? – r3zn1k

+0

sqlite creará una nueva base de datos si no existe - agregó una prueba de código de concepto snippet – blissapp

+0

Actualización, acaba de enterarse de que las bases de datos SQLite se pueden crear en la memoria solo con la cadena de conexión "jdbc: sqlite :: memory:" – blissapp

0

Pruebe la implementación de PreparedStatement.

Ejemplo: clase YourOwnClass implementa PreparedStatement {

// 1. No aplicar todos los métodos, 2. Obtener la lógica mínima a aplicar a partir OraclePreparedStatement (classes12.jar) o sun.jdbc.odbc.JdbcOdbcCallableStatement

}

+0

Solo usar regex o algo así sería mucho más fácil ... – r3zn1k

+0

@ r3zn1k: la ventaja de implementar esto es que el código es entonces reutilizable: puede generar texto SQL o ejecutar directamente el SQL. Sin embargo, no me sorprendería si no necesitaras esa flexibilidad. :) –

0

este es un problema tortuosa vil, gracias plenamente que es bastante fácil de hacer frente a:

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

de usar, basta escribir una clase anónima que anula vacío 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! Ahora tiene una forma de trabajar con un PreparedStatement sin haberlo creado todavía. He aquí un ejemplo que muestra el texto modelo mínimo que de otro modo tendría que copiar y pegar al otro mundo, cada vez que quería escribir una declaración diferente:

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

Usted realmente no quiere ser copia pegar que en todas partes, ¿Vos si?

Cuestiones relacionadas