2012-01-09 54 views
4

我試圖在數據庫中插入一個列表,但我得到了一些錯誤:org.springframework.jdbc.BadSqlGrammarException:SqlSession操作;錯誤的SQL語法[];嵌套異常是java.sql.SQLException:ORA-00913:值太多(...)。使用MyBatis插入對象列表3

,我用的代碼:

<insert id="insertListMyObject" parameterType="java.util.List" > 
INSERT INTO my_table 
    (ID_ITEM, 
    ATT1, 
    ATT2) 
    VALUES 
    <foreach collection="list" item="item" index="index" open="(" close=")" separator=","> 
    #{item.idItem, jdbcType=BIGINT}, 
    #{item.att1, jdbcType=INTEGER}, 
    #{item.att2, jdbcType=STRING} 
     </foreach> 
</insert> 

吾道CALS的方法:

SqlSessionTemplate().insert(MAPPER+".insertListMyObject", parameterList); 

凡PARAMETERLIST是:

List<MyObjects>. 

是否有人有一個關於線索這個錯誤是什麼?或者如果確實存在更好的方式來執行多重插入操作。

非常感謝!

回答

0

我不知道你是否可以用oracle INSERT聲明來做到這一點。 INSERT WITH VALUES(與子查詢不同)只允許一行的值!

爲此,請嘗試批量插入。 MyBatis示例可以找到here

0

這樣的事情在你的DAO層可能有助於

public class MyBatisDao 
{ 

    private SqlSessionFactory mSqlSessionFactory; 
    public void insertUsers(List<User> users) { 
    SqlSession session = mSqlSessionFactory.openSession(ExecutorType.BATCH); 
    try { 
     for(User user:users) 
     { 
      session.insert("com.you.insertUsers",user); 
     } 
    }catch(Exception e) { 
    } finally { 
     session.close(); 
    } 
} 

}

2

log4j的配置給MyBatis你可以找到的bug。

試圖

<insert id="insertListMyObject" parameterType="java.util.List" > 
INSERT INTO my_table 
    (ID_ITEM, 
    ATT1, 
    ATT2) 
    VALUES 
    <foreach collection="list" item="item" index="index" separator=","> 
    (#{item.idItem, jdbcType=BIGINT}, 
    #{item.att1, jdbcType=INTEGER}, 
    #{item.att2, jdbcType=STRING}) 
     </foreach> 
</insert> 
+0

在我的情況下,我相信useGeneratedKeys =「true」爲foreach中的項目創建自動ID。是否有可能檢索這些新的ID? – aloplop85 2013-07-17 14:16:45

7

設置隔板下方

separator="),(" 
0

給出我建議你使用批處理,這是好多了,這是標準的。此查詢不適用於某些數據庫(例如Oracle)。

1

通過使用以下查詢,您可以使用Mybatis和Oracle一次插入多條記錄。

<insert id="insertListMyObject" parameterType="map" > 
BEGIN 
          insert into table_name values (11,11); 
          insert into table_name2 values (11,112); 
      END; 
</insert> 

這是我如何爲oracle做的,它的工作原理。請注意,parameterType=map是沒有必要的地圖,它可以根據您的需要任何東西。