有没有办法不用连接对象就用Java编写sql语句?

有没有办法不用连接对象就用Java编写sql语句?,java,jdbc,Java,Jdbc,我对JDBC很陌生,所以这可能是一个非常简单的问题 我必须运行几个SQL语句,所以我正在尝试编写一个通用的“runSQLResultSet”方法,该方法接受一个StringSQL语句并返回一个ResultSet。我希望它负责打开数据库连接、执行语句、将ResultSet存储在CachedRowSetImpl对象中(以便它在连接关闭后保持不变),并关闭连接。我创建了一个这样做的方法,它可以工作 我现在的问题是,我希望能够将它用于使用变量构建的动态语句。我环顾四周,似乎我真的应该改变我的方法,采用P

我对JDBC很陌生,所以这可能是一个非常简单的问题

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


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

您缺少的是数据库连接池的概念,您永远不应该直接实例化连接,池在幕后控制数据库连接。您可以看看我的开源项目,从中获得一些关于处理JDBC的轻量级方法以及如何使用Factory和Builder模式构建动态SQL语句的启示。

如果没有DB连接,就无法创建动态SQL语句。
PreparedStatement
将在数据库中预编译,因此确实需要打开连接

您也可以只考虑动态地构建SQL字符串。在循环中生成

PreparedStatement
占位符(
事物),并使用将它们放入SQL字符串中。你也可以考虑把变量传递给你的代码> RunSqLReultStuts方法,并在那里构建。

根据评论,这里有一个例子:

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

    // ...

publicstaticvoidsetvalues(PreparedStatement PreparedStatement,Object…values)抛出SQLException{
对于(int i=0;i
如果我理解正确,您希望使用相同的查询,并在查询中插入不同的变量。您可以让方法像当前一样返回结果集,并将变量作为参数传递给方法

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;
}
然后可以将参数放入方法内部的查询中

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

这是一个基本的例子,说明了如果我正确理解了你的问题,你可能会做类似的事情。

如果我必须传递变量,它将不再是通用的。我希望能够传递包含任意数量动态变量的任何sql语句。只需将它们作为
对象[]
映射进行传递就行了。这没关系。只需使用
PreparedStatement#setObject()
。在这里可以找到一个示例(以及更多提示):检查
DAOUtil
类示例。我无法阅读博客,因为我的办公室会阻止所有博客。。。但是谢谢你的建议!成功了!(虽然我使用了一个可变长度的数组-Object…-而不是数组-Object[])
DAOUtil
类示例正好使用了这个。我已经用一些相关的文案更新了答案。正如我在一篇关于巴卢斯克答案的评论中所说的,这个方法已经不再是通用的了。我希望能够传递包含任意数量动态变量(以及可能的不同数据类型)的任何sql语句。请记住关闭您的结果集并准备好状态。谢谢!这基本上就是我实现的,正如BalusC在他的帖子和评论广告示例中所建议的那样。这样你就不能再关闭声明了。如果关闭它,则结果集将被关闭。@BalusC-我使用了相同的基本结构,但将结果集缓存在CachedRowSetImpl中。我还将conn.prepareStatement的结果存储在PreparedStatement中,而不是字符串中。但这是我的想法used@BalusC-我同意我没有给出更详细的细节。但是有很多方法可以做到这一点。。。例如,通过preparedStatement而不是字符串等。预先警告不使用preparedStatement或类似的东西构建“动态”sql语句会打开sql注入攻击的大门。@fuzzy lollipop-这就是我问这个问题的原因,而不仅仅是构建带有字符串连接的sql语句并将其作为字符串传递,这将是方便但危险的
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;
}