原文: https://blog.csdn.net/Sun_of_Rainy/article/details/81564433
在insert語句中,在Oracle經常使用序列、在MySQL中使用函數來自動生成插入表的主鍵,而且需要方法能返回這個生成主鍵。使用myBatis的selectKey標簽可以實現這個效果。
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。取消事務管理就不會有問題。
<insert id="insertSelective" parameterType="com.huatek.compass.frame.entity.Role">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
select replace(uuid(),'-','') from dual
</selectKey>
insert into sys_role
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="active != null">
active,
</if>
<if test="comment != null">
comment,
</if>
<if test="role != null">
role,
</if>
<if test="groupId != null">
group_id,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=VARCHAR},
</if>
<if test="active != null">
#{active,jdbcType=INTEGER},
</if>
<if test="comment != null">
#{comment,jdbcType=VARCHAR},
</if>
<if test="role != null">
#{role,jdbcType=VARCHAR},
</if>
<if test="groupId != null">
#{groupId,jdbcType=VARCHAR},
</if>
</trim>
</insert>
