Java MyBatis使用生成的ID插入所有

Java MyBatis使用生成的ID插入所有,java,oracle11g,mybatis,Java,Oracle11g,Mybatis,我正在尝试在映射器中创建一个insert all方法。 问题在于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中的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>

从dual中选择MY_SEQUENCE.nextVal
全部插入
从双重选择中选择*

我既不懂Java也不懂MyBatis

但是,在这种情况下,为什么要使用
INSERT ALL
?当您希望使用相同的insert语句将行插入不同的表时,通常使用该语句

不过,就你的情况而言——据我所知——你所做的只是(伪代码)

如果是这样的话,当“数字的序列”从我的序列中得到它的值时,就按照

insert into my_table (id)
  select my_sequence.nextval
  from dual
  connect by level <= 10;   -- it would insert 10 numbers
插入my_表(id)
选择my_sequence.nextval
来自双重

按级别连接如果我理解正确,您可以通过调用
nextValKey
为项目生成ID

问题在于,如果在同一会话中第二次调用同一select语句,mybatis将使用缓存值

如果您的查询每次都返回不同的值,则可以指示mybatis在语句执行后清除缓存(默认情况下,
select
为关闭,而
insert
update
delete
为打开):


从dual中选择MY_SEQUENCE.nextVal

我需要插入10000行(或多或少)。我可以使用哪种结构?我编辑了我的消息并添加了两个示例-看一看。
insert into my_table (id)
  select my_sequence.nextval
  from dual
  connect by level <= 10;   -- it would insert 10 numbers
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>
<select id="nextValKey" resultType="java.lang.Long" flushCache="true">
   SELECT MY_SEQUENCE.nextVal from dual
</select>