Вставьте список объектов с помощью MyBatis 3

Я пытался вставить список в базу данных, но у меня возникла ошибка: 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);

Где список параметров:

List<MyObjects>.

Кто-нибудь знает, что это за ошибка? Или, если существует лучший способ выполнить операцию множественной вставки.

Большое спасибо!


person T Soares    schedule 09.01.2012    source источник


Ответы (6)


Установите разделитель, как указано ниже

separator="),("
person Frank Kemmer    schedule 24.08.2012

используя следующий запрос, вы можете вставлять несколько записей одновременно, используя Mybatis и Oracle.

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

вот как я сделал для оракула, и это работает. Обратите внимание, что parameterType=map не обязательно карта, это может быть что угодно в соответствии с вашими потребностями.

person Anas    schedule 28.04.2014

config 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>
person losingle    schedule 01.03.2012
comment
В моем случае я доверяю useGeneratedKeys=true для создания автоматических идентификаторов для элементов в foreach. Можно ли получить эти новые идентификаторы? - person aloplop85; 17.07.2013

Интересно, можно ли это сделать с помощью oracle INSERT. утверждение. ВСТАВКА со ЗНАЧЕНИЯМИ (кроме подзапроса) допускает значения только для одной строки!

Для этого попробуйте пакетную вставку. Пример MyBatis можно найти здесь.

person Arne Burmeister    schedule 09.01.2012

что-то подобное в вашем слое 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();
    }   
}

}

person Moinul Hossain    schedule 20.01.2012

Я предлагаю вам использовать пакетный режим, он намного лучше и является стандартным. Этот запрос не будет работать на некоторых базах данных (например, Oracle).

person partlov    schedule 28.12.2012