2017-06-14 46 views
1

我插入數據庫如下。哪種方法是正確的數據插入到數據庫中

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

第一種方法。順便說一句,這與lambda無關。第二種方法是繼續覆蓋以前的語句值,只有最後一個標記將被插入。這裏是沒有拉姆達的代碼的相同版本:

getJdbcTemplate().update(INSERT_SQL, new PreparedStatementSetter() { 

     public void setValues(PreparedStatement ps) throws SQLException { 

      ps.setString(1, articleId); 
      ps.setString(2, tag); 
     } 
    });   

顯然setValues內循環沒有意義。

0

在方法1中,您生成了許多sql插入查詢,但可以在一個查詢中插入多行。

查詢語法:

INSERT INTO 
ARTICLE_TAG_RELATION(ARTICLE_ID, TAG_ID) VALUES (?, ?), (?, ?), (?, ?), (?, ?), ... 

您需要的ArrayList list持有條款ArticleID和標籤的字符串數組。在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]); 
    } 
相關問題