MyBatis 使用生成的 ID 插入所有
MyBatis insert all with generated ID
我正在尝试在我的映射器中创建一个 insert all 方法。
问题出在 foreach 中的 selectKey(似乎我无法使用它)。
如果我从外部调用 nextVal 方法,它 returns 总是相同的数字。
<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>
我不知道 Java 也不知道 MyBatis
但是,为什么要在这种情况下使用 INSERT ALL
?它通常用于当您要使用相同的 INSERT 语句将行插入不同的表时。
在你的情况下,据我所知 - 你所做的只是(伪代码)
insert into my_table (id) a_sequence_of_numbers
如果是这样,并且 "sequence_of_numbers" 从 my_sequence 获取它的值,那么就按
那样做
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>
如果我理解正确的话,您可以通过调用 nextValKey
.
为项目生成 ID
问题是如果你在同一个会话中第二次调用相同的select语句,mybatis使用了缓存值。
如果你每次查询returns不同的值你可以指示mybatis在语句执行后清除缓存(默认情况下,select
关闭,[=13=开启], update
和 delete
):
<select id="nextValKey" resultType="java.lang.Long" flushCache="true">
SELECT MY_SEQUENCE.nextVal from dual
</select>
我正在尝试在我的映射器中创建一个 insert all 方法。 问题出在 foreach 中的 selectKey(似乎我无法使用它)。 如果我从外部调用 nextVal 方法,它 returns 总是相同的数字。
<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>
我不知道 Java 也不知道 MyBatis
但是,为什么要在这种情况下使用 INSERT ALL
?它通常用于当您要使用相同的 INSERT 语句将行插入不同的表时。
在你的情况下,据我所知 - 你所做的只是(伪代码)
insert into my_table (id) a_sequence_of_numbers
如果是这样,并且 "sequence_of_numbers" 从 my_sequence 获取它的值,那么就按
那样做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>
如果我理解正确的话,您可以通过调用 nextValKey
.
问题是如果你在同一个会话中第二次调用相同的select语句,mybatis使用了缓存值。
如果你每次查询returns不同的值你可以指示mybatis在语句执行后清除缓存(默认情况下,select
关闭,[=13=开启], update
和 delete
):
<select id="nextValKey" resultType="java.lang.Long" flushCache="true">
SELECT MY_SEQUENCE.nextVal from dual
</select>