java - 如何注入自定义的PreparedStatement参数

时间:2012-10-02 14:16:26

标签: java sql prepared-statement

我正在尝试实现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();
        //---

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

替换?将其变为

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

关于你的set方法,那些必须将你的新参数保存在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子字符串。