2017-08-07 145 views
0

所以,我有我想要插入到具有以下結構的數據庫中的對象使用執行INSERT語句中的子插入語句的MyBatis

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) 
); 

ħ ow會執行一個子插入,它將採用由初始插入工作創建的ID?我假設需要一個SELECT,但我不確定如何命令將所需信息插入到每個對象的適當區域。

+0

你想一個程序? –

+0

@mehmetsahin如果這會在mybatis中起作用或很容易轉換?我會誠實地說,我不知道這個特定行動的最佳做法是什麼。 – canadiancreed

+0

Foo.id和FooTags.id不是一個序列,我認爲你通過它們? –

回答

1

我寫了2個程序;

如果你可以學習你的seq名稱爲id;

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; 

如果你不能學習你的seq名稱爲ids;

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; 

如果您通過ids;

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_tablefooTags_table。這是準確性。

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> 

屬性 「useGeneratedKeys」, 「keyProperty」 和「如果JDBC驅動程序支持getGeneratedKeys函數,則使用「keyColumn」從數據庫重新加載新生成的密鑰。或者,我們必須使用選擇查詢重新加載標識。更多信息:http://www.mybatis.org/mybatis-3/sqlmap-xml.html#insert_update_and_delete

標籤插入使用「foreach」遍歷標籤名稱(在這種情況下,我使用了一個字符串數組,但它們可能是對象)。 「內部」插入引用來自「foo」對象和「標記」的「id」,即迭代字符串。在對象的情況下,我們可以用「標籤」訪問內部字段,即「tag.name」。

使用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) 
)