1

我正在尝试实现 PreparedStatement,它不适用于 sql DB。

假设我有以下 sql 查询:

String selectSqlQuery = "SELECT * FROM customer WHERE f1 = ? AND f2 =? AND f3 > ?";

和以下代码:

       //----

        prest = con.prepareStatement(selectSqlQuery );
        prest.setString(1, "val1");
        prest.setString(2, "val2");
        prest.setInt(3, 108);
        ResultSet rs = prest.executeQuery();
        //---

我的问题是如何实现用于注入参数的 setString 和 setInt 方法?

现在我将参数的索引和值保存到 HashMap 中,但之后我无法注入 sql 查询字符串。

4

2 回答 2

1

sql 的 java 接口的实现是特定于供应商的 jdbc 驱动程序的一部分。您可能只需要为您的数据库获取正确的 jdbc jar 文件。如果您打算编写自己的数据库驱动程序,通常只需要编写这些东西的实现......

于 2012-10-02T14:35:04.907 回答
0

由于您正在编写自己的驱动程序,因此您可以与您的班级一起玩一点。让我们改变方法。如果您有这样的查询:

"SELECT * FROM table WHERE id = ? AND name = ?"

更换?将其变成

"SELECT * FROM table WHERE id = {0} AND name = {1}"

关于您的设置方法,这些方法必须将您的新参数保存在一个Object数组中,再次与索引匹配。

Object parameterArray = new Object[1];

public boolean setString(int paramIndex, String param) {
    if(paramIndex < 0 || paramIndex > parameterArray.length)
        throw new IllegalArgumentException("Can't set parameter " + paramIndex + ", The query only has " + parameterArray.length + " parameters."); 
    parameterArray[paramIndex - 1] = param;
}

在执行查询之前,利用您的格式化字符串并设置参数:

MessageFormat messageFormat = new MessageFormat(query);
String newQuery = messageFormat.format(parameterArray);

format方法将替换括号之间{number}表示的索引中相应元素的子字符串。number

于 2012-10-02T17:35:31.747 回答