Java:准备一个没有连接的语句

时间:2010-05-20 12:24:11

标签: java sql

我正在尝试在我的java应用程序中生成一些sql文件。 应用程序执行任何sql语句,只需生成带有sql语句的文件并保存即可。

我想使用java.sql.PreparedStatement创建我的语句,这样我就不必用自己的方法验证每个字符串等。

有没有方法可以在没有调用PreparedStatement函数的情况下使用java.sql.Connection.prepareStatement(String),因为我没有java.sql.Connection

5 个答案:

答案 0 :(得分:3)

我猜测,在你有一个sql连接之前,解析器将不知道应用什么规则。我猜它实际上是SQL驱动程序甚至是编译sql语句的服务器。

假设你的sql足够简单,那么如何使用便宜的连接,例如sqlite连接。

如果您尝试连接的数据库不存在,SQLite将动态创建一个新数据库。

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;

}

答案 1 :(得分:3)

答案 2 :(得分:1)

不是真的。在大多数情况下准备一个语句意味着它将由DBMS编译,这是没有连接的“硬”。

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html

答案 3 :(得分:0)

尝试实施PreparedStatement。

示例:class YourOwnClass实现PreparedStatement {

// 1.实施所有方法,    2.从OraclePreparedStatement(classes12.jar)或。获取最小的逻辑  sun.jdbc.odbc.JdbcOdbcCallableStatement

}

答案 4 :(得分:0)

这是一个卑鄙的狡猾问题,谢天谢地,它很容易应对:

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

要使用,只需编写一个覆盖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!您现在可以使用PreparedStatement而无需构建它。这里有一个示例,显示了每次你想写一个不同的声明时你必须将粘贴复制到王国的最小样板:

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

你真的真的不想复制粘贴到处,对吗?