使用MyBatis 3插入对象列表

时间:2012-01-09 14:18:26

标签: java list syntax insert mybatis

我试过在数据库中插入一个列表,但是我遇到了一些错误:org.springframework.jdbc.BadSqlGrammarException:SqlSession操作;糟糕的SQL语法[];嵌套异常是java.sql.SQLException:ORA-00913:值太多(...)。

我用过的代码:

<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>

我的道歉方法:

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

parameterList为:

List<MyObjects>.

是否有人知道这个错误是什么?或者,如果确实存在多个插入操作的更好方法。

非常感谢!

6 个答案:

答案 0 :(得分:7)

将分隔符设置为下面的

separator="),("

答案 1 :(得分:2)

将log4j配置为mybatis,您可以找到错误。

试图

<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>

答案 2 :(得分:2)

通过使用以下查询,您可以使用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不一定是地图,可以根据您的需要提供任何内容。

答案 3 :(得分:0)

我想知道你是否可以用oracle INSERT语句来做到这一点。带有VALUES的INSERT(除了带有子查询的INSERT)确实只允许一行的值!

为此,请尝试批量插入。可以找到MyBatis示例here

答案 4 :(得分: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();
    }   
}

}

答案 5 :(得分:0)

我建议你使用批处理,它要好得多,而且是标准的。此查询不适用于某些数据库(例如Oracle)。