有没有办法在不使用Connection对象的情况下在Java中准备sql语句?

时间:2010-03-01 16:36:26

标签: java jdbc

我对JDBC很陌生,所以这可能是一个非常直截了当的问题。

我必须运行几个SQL语句,所以我正在尝试编写一个通用的“runSQLResultSet”方法,该方法接受String sql语句并返回ResultSet。我希望它能够打开数据库连接,执行语句,将ResultSet存储在CachedRowSetImpl对象中(以便在连接关闭后它将保持不变),然后关闭连接。我创建了一个执行此操作的方法,它可以正常工作。

我现在的问题是我希望能够将它用于使用变量构建的动态语句。我环顾四周,似乎我应该改变我的方法来取一个PreparedStatement而不是一个普通的String。然后我可以在另一侧构建PreparedStatement并将其传递给方法。问题是我似乎无法在没有PreparedStatement对象的情况下创建Connection。我可以在准备语句之前打开连接,但这违背了我将数据库处理分解为runSQLResultSet方法的目的。我需要一种方法来构建一个带有动态组件的SQL语句,没有连接对象,并将其传递给一个然后执行它的方法。有没有办法用PreparedStatement做到这一点?我可以使用其他任何语句对象吗?否则 - 还有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

public ResultSet excuteStatement(String statement, Object... params){
  statement = conn.prepareStatement(statement);
  int i = 1;
  for (Object o:params){
    statement.setObject(i++,o);
  }
  ResultSet rs = statement.executeQuery();
  return rs;
}

答案 1 :(得分:1)

如果没有数据库连接,则无法创建一个。 PreparedStatement将在数据库中进行预编译,因此确实需要一个开放的连接。

您也可以考虑动态构建SQL字符串。在循环中生成PreparedStatement占位符(?个东西)并使用String#format()将它们放入SQL字符串中。您也可以考虑将变量传递给runSQLResultSet方法并在那里构建。

根据评论,这是一个例子:

try {
    connection = database.getConnection();
    statement = connection.prepareStatement(SQL);
    setValues(statement, values);

    // ...

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

答案 2 :(得分:0)

您缺少的是数据库连接池的概念,您永远不应该直接实例化连接,池控制着幕后的数据库连接。您可以通过一种轻量级方式查看我的开源项目SQL Construction Kit以获得一些灵感来处理JDBC以及如何使用Factory和Builder模式构建动态SQL语句。

答案 3 :(得分:0)

如果我理解正确,您希望使用插入查询中的不同变量的相同查询。您可以让您的方法像当前一样返回ResultSet,并将变量作为参数传递给方法。

然后您可以将参数放入方法内的查询中。

public ResultSet getResult(String param1, String param2){
 statement = conn.prepareStatement(yourQuery);// conn must be an open connection
 statement.setString(1,param1);
 statement.setString(2,param2);
 ResultSet rs = statement.execusteQuery();
 return rs;
}

如果我能正确理解你的问题,这就是你如何做这样的事情的一个基本例子。