使用 MyBatis 3 插入对象列表

发布于 2024-12-26 03:40:50 字数 824 浏览 2 评论 0原文

我尝试在数据库中插入列表,但出现一些错误: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>

我的 dao 调用方法:

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

参数列表在哪里:

List<MyObjects>.

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

非常感谢!

I've tried to insert a list in a database but I've got some the error: org.springframework.jdbc.BadSqlGrammarException: SqlSession operation; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00913: too many values (...).

The code that I've used:

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

My dao cals the method:

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

Where the parameterList is:

List<MyObjects>.

Does someone have a clue about what's this error? Or if does exists a better way to do multiples inserts operation.

Many thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

强者自强 2025-01-02 03:40:50

设置分隔符如下所示

separator="),("

Set the separator as given below

separator="),("
笨死的猪 2025-01-02 03:40:50

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

by using following query you may insert multiple records at a time using Mybatis and Oracle.

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

this is how i did for oracle and it works. Note that parameterType=map is not necessary a map it can be anything according to your needs.

不爱素颜 2025-01-02 03:40:50

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

config log4j to mybatis ,you can find the bugs.

trying

<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>
念三年u 2025-01-02 03:40:50

我想知道您是否可以使用 oracle INSERT 来完成此操作陈述。带 VALUES 的 INSERT(除了带有子查询的 INSERT)确实只允许一行值!

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

I wonder if you can do this with an oracle INSERT statement. The INSERT with VALUES (other than the one with the subquery) does allow values for one row only!

To do so, try a batch insert. An MyBatis example can be found here.

活泼老夫 2025-01-02 03:40:50

你的 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();
    }   
}

}

something like this in your DAO layer might help

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();
    }   
}

}

梦忆晨望 2025-01-02 03:40:50

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

I suggest you to use batch, it is much better, and it is standard. This query will not work on some databases (Oracle for example).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文