1. 程式人生 > >關於ibatis insert返回值

關於ibatis insert返回值

[什麼鬼]

ibatis在使用SqlMapClientTemplate的insert(String statementName, Object parameterObject)或insert(String statementName)的插入操作時,會返回一個Object物件,該Object其實就是我們插入時的主鍵值。

但是我返回的確實一個null。

當時我上網查了一下,大部分的人都是說給<insert>標籤內新增一個:

<selectKey resultClass="int" keyProperty="id">

... ...

</selectKey>

在MySQL中我們可以這樣實現:

<selectKey resultClass="int" keyProperty="id">

SELECT @@IDENTITY AS ID

</selectKey>

其中id(ID)必需是那個表對應的Bean屬性。

但是在Oracle中並沒有identity,而只有sequence(序列),所以這上面例子不能使用在oracle中。

[疑問] :那麼oracle該寫什麼?或者該怎麼寫?

[解決方法]:

在這裡我先直接貼解決方法:

<insert id="add">
<selectKey resultClass="int" keyProperty="id" >


SELECT seq_t_user.nextval AS id FROM dual 
</selectKey> 
insert into t_user(id,name) values(seq_t_user.currval,#name#)
</insert>

[解釋一下] :

不管在Mysql還是oracle資料庫中的insert語句都是沒有返回值的,但是,SqlMapClientTemplate的insert方法卻有返回值,那它的值從哪裡來呢?

我們一般要獲得當前表中的最新id,就恰恰是我們上面寫的<selectKey>標籤的內容:

MySQL獲取最新的id: SELECT @@IDENTITY AS ID   (用select @@identity是為了得到上一次插入記錄時自動產生的ID。

Oracle獲取最新的id:  SELECT seq_t_user.nextval AS id FROM dual (seq_t_user是一個sequence物件,seq_t_user.nextval是獲取下一個id)

所以,我們可知<selectKey>的返回值便是我們SqlMapClientTemplate中insert方法的返回值。

[說多點] :

1. 關於MySQL和Oracle的獲取最新的id的語句不一樣的問題

因為MySQL有auto_increment屬性,可以給需要自動增長的主鍵賦予這個屬性,便可以實現自動增長的效果,而這個@@identity就可以獲取得到上次操作後的產生的id。

雖然oracle沒有auto_increment屬性,但是有sequence,我們可以給表建立一個sequence,讓它實現自動增長。然後再通過sequence的屬性currval或者nextval獲取當前的id號或下一個操作的id號。

2. 關於Sequence與indentity的區別與聯絡

Sequence與indentity的基本作用都差不多。都可以生成自增數字序列。
Sequence是資料庫系統中的一個物件,可以在整個資料庫中使用,和表沒有任何關係;indentity僅僅是指定在表中某一列上,作用範圍就是這個表。