Вставьте список объектов, используя MyBatis 3 - PullRequest
4 голосов
/ 09 января 2012

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

List<MyObjects>.

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

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

Ответы [ 6 ]

7 голосов
/ 25 августа 2012

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

separator="),("
2 голосов
/ 28 апреля 2014

, используя следующий запрос, вы можете вставлять несколько записей одновременно, используя 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 не является необходимой картой, это может быть что угодно в соответствии с вашими потребностями.

2 голосов
/ 01 марта 2012

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>
0 голосов
/ 28 декабря 2012

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

0 голосов
/ 20 января 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();
    }   
}

}

0 голосов
/ 09 января 2012

Интересно, можете ли вы сделать это с помощью оператора oracle INSERT . INSERT with VALUES (кроме значения с подзапросом) допускает значения только для одной строки!

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

...