我试过在数据库中插入一个列表,但是我遇到了一些错误: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>.
是否有人知道这个错误是什么?或者,如果确实存在多个插入操作的更好方法。
非常感谢!
答案 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)
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)。