所以我有一个对象,我试图插入具有以下结构的数据库
int id
String name
Array tags
我希望将前两列插入下表
CREATE TABLE foo (
id number(20) PRIMARY KEY,
name varchar2(50) NOT NULL
);
将数组放入此表
CREATE TABLE fooTags (
id number(20) PRIMARY KEY,
fooId number(20), //foreign key to foo. I don't know what the sql is for that.
tagName varchar2(50)
);
如何执行将初始插入工作创建的id的子插入工作?我假设需要一个SELECT,但我不确定如何将所需信息插入每个对象的适当区域。
答案 0 :(得分:1)
我写了2个程序;
如果您可以了解ids的seq名称;
create or replace procedure FOO_INSERT(foo_name in varchar2, FooTags_tagName in varchar2 )
is
foo_seq_val number;
footag_seq_val number;
begin
select foo_seq.nextval into foo_seq_val from dual;
insert into foo(id,name) values (foo_seq_val, foo_name);
select footag_seq.nextval into footag_seq_val from dual;
insert into footags (id,fooid,tagName) values(footag_seq_val,foo_seq_val,FooTags_tagName);
commit;
end;
如果你无法了解ids的seq名称;
create or replace procedure FOO_INSERT_T(foo_name in varchar2, FooTags_tagName in varchar2 )
is
foo_seq_val number;
begin
insert into foo_T(name) values (foo_name);
select id into foo_seq_val from FOO_T where name =foo_name;
insert into footags_T (fooid,tagName) values(foo_seq_val,FooTags_tagName);
commit;
end;
如果您传递ID;
insert into foo (id, name) values (123,'foo_name');
insert into footags (id,fooid,tagname) select 444,id, 'tag_name' from foo ;
commit;
对于第二个过程,我假设您的foo_T.name值是唯一的,或者每行的其他值使您的ID唯一。您可以使用and ... and ..
每种方法都可以看到一个COMMIT
。因为如果出现错误,事务会回滚foo_table
和fooTags_table
的所有插入内容。这是准确的。
答案 1 :(得分:1)
我的解决方案:两个插入查询,第一个用于父对象(foo表),第二个用于他的标签(fooTags表):
<insert id="fooInsert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO foo (name) VALUES (#{name})
</insert>
<insert id="fooTagsInsert">
INSERT INTO fooTags ("fooId", "tagName") VALUES
<foreach item="tag" collection="tags" separator=",">
(#{id}, #{tag})
</foreach>
</insert>
属性&#34; useGeneratedKeys&#34;,&#34; keyProperty&#34;和&#34; keyColumn&#34;如果JDBC驱动程序支持getGeneratedKeys函数,则用于从数据库重新加载新生成的键。或者,我们必须使用select查询重新加载id。更多信息:http://www.mybatis.org/mybatis-3/sqlmap-xml.html#insert_update_and_delete
标签插入使用&#34; foreach&#34;迭代标记名称(在这种情况下,我使用了一个String数组,但它们可能是对象)。 &#34;内部&#34; insert是指&#34; id&#34;来自&#34; foo&#34; object和&#34; tag&#34;,即迭代String。如果是对象,我们可以使用&#34;标记访问内部字段。&#34;,即&#34; tag.name&#34;。
Java代码中的用法:
Foo foo = new Foo();
foo.setName("James");
foo.setTags(new String[] {"one", "two", "three"});
fooMapper.fooInsert(foo);
fooMapper.fooTagsInsert(foo);
表定义(使用PostgreSQL测试):
CREATE TABLE public.foo (
id numeric NOT NULL DEFAULT nextval('seq_foo_id'::regclass),
"name" varchar NULL,
CONSTRAINT foo_pk PRIMARY KEY (id)
)
CREATE TABLE public.footags (
id varchar NOT NULL DEFAULT nextval('seq_foo_id'::regclass),
"fooId" numeric NULL,
"tagName" varchar NULL,
CONSTRAINT footags_pk PRIMARY KEY (id),
CONSTRAINT footags_foo_fk FOREIGN KEY ("fooId") REFERENCES public.foo(id)
)