selectkey在mybatis中是為了解決insert資料時不支援主鍵自動生成的問題,他可以很随意的設定生成主鍵的方式。
不管selectkey有多好,盡量不要遇到這種情況吧,畢竟很麻煩。
屬性
描述
keyproperty
selectkey 語句結果應該被設定的目标屬性。
resulttype
結果的類型。mybatis 通常可以算出來,但是寫上也沒有問題。mybatis 允許任何簡單類型用作主鍵的類型,包括字元串。
order
這可以被設定為 before 或 after。如果設定為 before,那麼它會首先選擇主鍵,設定 keyproperty 然後執行插入語句。如果設定為 after,那麼先執行插入語句,然後是 selectkey 元素-這和如 oracle 資料庫相似,可以在插入語句中嵌入序列調用。
statementtype
和前面的相 同,mybatis 支援 statement ,prepared 和callable 語句的映射類型,分别代表 preparedstatement 和callablestatement 類型。
selectkey需要注意order屬性,像mysql一類支援自動增長類型的資料庫中,order需要設定為after才會取到正确的值。
像oracle這樣取序列的情況,需要設定為before,否則會報錯。
另外在用spring管理事務時,selectkey和插入在同一事務當中,因而mysql這樣的情況由于資料未插入到資料庫中,是以是得不到自動增長的key。取消事務管理就不會有問題。
下面是一個xml和注解的例子,selectkey很簡單,兩個例子就夠了:
[html] view
plain copy
<insert id="insert" parametertype="map">
insert into table1 (name) values (#{name})
<selectkey resulttype="java.lang.integer" keyproperty="id">
call identity()
</selectkey>
</insert>
上面xml的傳入參數是map,selectkey會将結果放到入參數map中。用pojo的情況一樣,但是有一點需要注意的是,keyproperty對應的字段在pojo中必須有相應的setter方法,setter的參數類型還要一緻,否則會報錯。
[java] view
@insert("insert into table2 (name) values(#{name})")
@selectkey(statement="call identity()", keyproperty="nameid", before=false, resulttype=int.class)
int inserttable2(name name);
上面是注解的形式。