我正在尝试实现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查询字符串。
答案 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
子字符串。