MyBatis插入所有生成的ID

时间:2018-03-26 10:56:11

标签: java oracle11g mybatis

我正在尝试在我的mapper中创建一个插入所有方法。 问题在于foreach中的selectKey(似乎我不能使用它)。 如果我从外部调用nextVal方法,它总是返回相同的数字。

<select id="nextValKey" resultType="java.lang.Long">
 SELECT MY_SEQUENCE.nextVal from dual
</select>

<insert id="insertAll" parameterType="list">
  INSERT ALL
  <foreach collection="items" item="item" index="i">
   <![CDATA[
    into MY_TABLE (ID)
    values (
    #{item.id, jdbcType=DECIMAL}
   ]]> 
  </foreach>
  SELECT * FROM dual
</insert>

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以通过调用nextValKey生成项目的ID。

问题是如果你在同一个会话中第二次调用相同的select语句,mybatis会使用缓存值。

如果你有查询返回不同的值,每次你可以指示mybatis在语句执行后清除缓存(默认情况下,select关闭,insert,{{1} }和update):

delete

答案 1 :(得分:0)

我不懂Java也不知道MyBatis。

但是,在这种情况下,您为什么要使用insert into my_table (id) a_sequence_of_numbers ?当您想使用相同的INSERT语句将行插入到不同的表中时,通常会使用它。

在你的情况下,虽然 - 据我所知 - 你所做的只是(伪代码)

insert into my_table (id)
  select my_sequence.nextval
  from dual
  connect by level <= 10;   -- it would insert 10 numbers

如果是这样,并且“sequence_of_numbers”从my_sequence获取其值,那么只需将其作为

SQL> create table my_table (id number);

Table created.

SQL> set timing on
SQL>
SQL> insert into my_table
  2    select level from dual
  3    connect by level <= 10000;

10000 rows created.

Elapsed: 00:00:00.02
SQL>

[编辑:如何插入一堆值]

你这么简单:

SQL> insert into my_table
  2    select seqa.nextval from dual
  3    connect by level <= 10000;

10000 rows created.

Elapsed: 00:00:00.08
SQL>

或者,如果你坚持你创建的序列,

document.addEventListener("resize", initialize);