我正在插入数据库,如下所示。
private static final String INSERT_SQL = "INSERT INTO
ARTICLE_TAG_RELATION(ARTICLE_ID, TAG_ID) VALUES (?, ?)";
private final JdbcTemplate template;
//method 1
void addTags(String articleId, List<String> tags) {
// TODO Auto-generated method stub
for(String tag:tags){
template.update(INSERT_SQL, ps-> {
ps.setString(1, articleId);
ps.setString(2, tag);
});
}
}
//method 2
void addTags(String articleId, List<String> tags) {
template.update(
INSERT_SQL,
(/*PreparedStatement*/ ps) -> {
for(String tag:tags){
ps.setString(1, articleId);
ps.setString(2, tag);
}
});
}
哪个方法正确1或2.或者两者都相同。我也不太了解第二种方法。
答案 0 :(得分:0)
第一种方法。顺便说一下,这与lambdas无关。第二种方法是继续覆盖先前的语句值,并且只插入最后一个标记。这是没有lambda的相同版本的代码:
getJdbcTemplate().update(INSERT_SQL, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, articleId);
ps.setString(2, tag);
}
});
显然在setValues中循环没有意义。
答案 1 :(得分:0)
在方法1中,您生成了许多sql插入查询,但您可以在一个查询中插入多行。
查询语法:
INSERT INTO
ARTICLE_TAG_RELATION(ARTICLE_ID, TAG_ID) VALUES (?, ?), (?, ?), (?, ?), (?, ?), ...
您需要ArrayList list
,它包含articleId和tag的String数组。在java 7中,它将是:
int position=1;
for (int i=0;i<list.size();i++) {
String[] articleTag = list.get(i);
preparedStatement.setString(position++,articleTag[0]);
preparedStatement.setString(position,articleTag[1]);
}