我的数据库表模式类似于
DocumentID: Name1: Name2: Name3: Name4: Location1: Location2: Location3....:Organization1:..
现在我有3个Hashset可用,具有上述值(即一个用于名称,一个用于位置,一个用于组织)
在每次循环迭代中,这些hashset都会填充上面的值。
在每次迭代结束时,将删除这些散列集中的数据并创建新的数据。
现在我的问题是在每次迭代时我必须从这些hashset值填充sql表行(每次迭代只有1行)。
我无法理解的是,如果我有硬编码的字符串,而不仅仅是我可以使用类似的东西:
String sql = "INSERT INTO Table " +
"VALUES ('100', 'Zara', 'Akli', '18','100', 'Zara', 'Ali', '18')";
但是我需要迭代每个hashset并在一行中插入(如上所述)所有3个hashset的数据。我很困惑如何写这样的声明。记住我的表最初是完全空的,所以我不能使用where子句(类似于“插入..... where documentID =”23423“)
答案 0 :(得分:1)
假设您已经以这种方式创建了这些集:
long DocumentId
names {"A", "B", "C"}
location {"1", "2", "3"}
and so on...
我认为最简单的方法就是建立执行SQL的语言:
{
...
StringBuilder sb = new StringBuilder("insert into mytable (");
List<Object> params = new ArrayList<Object>();
addColumnAndValue(sb, "DocumentID", docIdYouHaveSomewhere, params);
int i = 0;
for (String name: names)
addColumnAndValue(sb, ",name" + i, name, params);
i = 0;
for (String location: locations)
addColumnAndValue(sb, ",location" + i, location, params);
// now close the thing
sb.append(") values (?");
for (i = 1; i<params.size(); i++)
sb.append(",?");
sb.append("=");
// and now sb.toString() will contain valid SQL and the param values for a PreparedStatement will be in params array-list:
PreparedStatement ps = conn.prepareStatement(sb.toString());
for (i=0; i<params.size(); i++)
ps.setObject(i+1, params.get(i));
ps.executeUpdate(); // voi là!
...
}
private void add addColumnAndValue(StringBuilder sb, String columnName, Object value, List<Object> params) {
sb.append(columnName);
params.add(value);
}
答案 1 :(得分:0)
我想你需要先在你的3&#34; HashSet&#34; s上做一些工作。
因为你说3套中的数据最终会转到数据库中的单行。所以我建议将你的3个hashset转换为Map,或者至少是一个List,其顺序与insert语句中的字段相同。以便稍后您可以按名称或索引将这些值设置为PS的参数。
我从未见过像"Insert into table values (....) where id=123"
这样的插入语句,你确定它会起作用吗?