我对JDBC很陌生,所以这可能是一个非常直截了当的问题。
我必须运行几个SQL语句,所以我正在尝试编写一个通用的“runSQLResultSet
”方法,该方法接受String
sql语句并返回ResultSet
。我希望它能够打开数据库连接,执行语句,将ResultSet
存储在CachedRowSetImpl
对象中(以便在连接关闭后它将保持不变),然后关闭连接。我创建了一个执行此操作的方法,它可以正常工作。
我现在的问题是我希望能够将它用于使用变量构建的动态语句。我环顾四周,似乎我应该改变我的方法来取一个PreparedStatement
而不是一个普通的String
。然后我可以在另一侧构建PreparedStatement
并将其传递给方法。问题是我似乎无法在没有PreparedStatement
对象的情况下创建Connection
。我可以在准备语句之前打开连接,但这违背了我将数据库处理分解为runSQLResultSet
方法的目的。我需要一种方法来构建一个带有动态组件的SQL语句,没有连接对象,并将其传递给一个然后执行它的方法。有没有办法用PreparedStatement
做到这一点?我可以使用其他任何语句对象吗?否则 - 还有更好的方法吗?
答案 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;
}
如果我能正确理解你的问题,这就是你如何做这样的事情的一个基本例子。