mybatis進行插入操作時,如果表的主鍵是自增的,針對不同的資料庫相應的操作也不同。基本上經常會遇到的就是 oracle sequece 和 mysql 自增主鍵,至於其他的手動生成唯一主鍵的問題在這裡就不討論了,這裡主要說明下在mybatis中對於自增主鍵的配置。
如果考慮到插入資料的主鍵不作為其他表插入資料的外來鍵使用,那麼可以考慮使用這種方式。
oracle sequence 配置
當插入語句如上配置時,那麼針對如下語句id=
'table_name'
>
test_user
id=
'table_sequence'
>
seq_test_user_id.nextval
id=
"insert"
parametertype
="user"
>
insert into
refid
="table_name"
/>
(id,name,age)
values (
refid
="table_sequence"
/>
,#, # )
user
user
=new
user
();
user
.setname
("test"
);
user
.setage(24
);
.
insert
(user
);
system
.out
.println
(user.id
);// user.id 為空
user.id
為空,也就是說如上的配置並不能在完成插入操作後將插入時的主鍵值存放到儲存的物件中。
mysql自增主鍵配置
由於mysql資料庫中,可以設定表的主鍵為自增,所以對於mysql資料庫在mybatis配置插入語句時,不指定插入id欄位即可。主鍵的自增交由mysql來管理。
同樣,針對mysql如此配置mybaits,插入完成後id=
'table_name'
>
test_user
id=
"insert"
parametertype
="user"
>
insert into
refid
="table_name"
/>
(name,age)
values (#, # )
user.id
為空。
上述的情況能滿足大部分情況,但有時候我們會遇到類似一對多的那種表結構,在插入多端資料時,需要獲取剛剛儲存了的一段的主鍵。那麼這個時候,上述的配置就無法滿足需要了。為此我們需要使用mybatis提供的來單獨配置針對自增逐漸的處理。
oracle sequence 配置
當使用了id=
'table_name'
>
test_user
id=
'table_sequence'
>
seq_test_user_id.nextval
id=
"insert"
parametertype
="user"
>
keyproperty
="id"
resulttype
="int"
order
="before"
>
select
refid
="table_sequence"
/>
from dual
insert into
refid
="table_name"
/>
(id,name,age)
values ( #, #, # )
後,在實際的插入操作時,mybatis會執行以下兩句sql:
在執行插入 語句2 之前,會先執行 語句1 以獲取當前的id值,然後mybatis使用反射呼叫
select
seq_test_user_id
.nextval
from
dual
;// 語句1
insert
into(id
,name
,age
)values (?,
?,?);// 語句2
user
物件的setid
方法,將語句1 查詢出的值儲存在user
物件中,然後才執行 語句2 這樣就保證了執行完插入後
user
user
=new
user
();
user
.setname
("test"
);
user
.setage(24
);
.
insert
(user
);
system
.out
.println
(user.id
);// user.id 不為空
user.id
是有值的。
mysql自增主鍵配置
針對於mysql這種自己維護主鍵的資料庫,可以直接使用以下配置在插入後獲取插入主鍵,
當然,由於mysql的自增主鍵可以通過sql語句id=
'table_name'
>
test_user
id=
"insert"
usegeneratedkeys
="true"
keyproperty
="id"
parametertype
="user"
>
insert into
refid
="table_name"
/>
( name, age )
values ( #, # )
select
last_insert_id
();
來獲取的。因此針對mysql,mybatis也可配置如下:
只不過該中配置需要額外的一條查詢sql!id=
'table_name'
>
test_user
id=
"insert"
parametertype
="user"
>
keyproperty
="id"
resulttype
="int"
order
="before"
>
select last_insert_id()
insert into
refid
="table_name"
/>
(id,name,age)
values ( #, #, # )
當資料插入操作不關心插入後資料的主鍵(唯一標識),那麼建議使用 不返回自增主鍵值 的方式來配置插入語句,這樣可以避免額外的sql開銷.
當執行插入操作後需要立即獲取插入的自增主鍵值,比如一次操作中儲存一對多這種關係的資料,那麼就要使用 插入後獲取自增主鍵值 的方式配置.
mybatis自增主鍵配置
url mybatis進行插入操作時,如果表的主鍵是自增的,針對不同的資料庫相應的操作也不同。基本上經常會遇到的就是 oracle sequece 和 mysql 自增主鍵,至於其他的手動生成唯一主鍵的問題在這裡就不討論了,這裡主要說明下在mybatis中對於自增主鍵的配置。size x large...
mybatis自增主鍵配置
mybatis進行插入操作時,如果表的主鍵是自增的,針對不同的資料庫相應的操作也不同。基本上經常會遇到的就是 oracle sequece 和 mysql 自增主鍵,至於其他的手動生成唯一主鍵的問題在這裡就不討論了,這裡主要說明下在mybatis中對於自增主鍵的配置。不返回自增主鍵值 如果考慮到插入...
mybatis配置oracle的主鍵自增長
mysql sqlserver等資料庫本身帶有主鍵自增長像auto increment的功能可以直接使用 usegeneratedkeys true 來實現,比如下面的配置 id add usegeneratedkeys true keyproperty id parametertype auth ...