有時候咱們不單單是經過返回 int 影響行數來肯定數據是否插入成功就好了,由於咱們老是會用到這個剛剛插入的自增主鍵,好比主子表入庫,子表須要主表的 id,那這個時候咱們再去數據庫查就顯得有點 low 了~java
關於數據庫中主鍵的生成無非就兩種,一種是 int 類型的自增,一種是 varchar 類型的非自增(例如:UUID)。數據庫
在 Mybatis 中,提供了 selectKey 來幫咱們獲取新增的主鍵,同時經過 selectKey 能夠很容易的實現自增仍是非自增規則的需求。ide
首先看一下 Mybatis 中 selectKey 的屬性說明:ui
屬性 | 描述 |
---|---|
keyProperty | selectKey 語句結果應該被設置的目標屬性(也就是自增的主鍵字段,好比id)。 |
resultType | 結果的類型,好比java.lang.Integer,java.lang.String等。MyBatis 一般能夠算出來,可是寫上也沒有問題。MyBatis 容許任何簡單類型用做主鍵的類型,包括字符串。 |
order | 這能夠被設置爲 BEFORE 或 AFTER。若是設置爲 BEFORE,那麼它會首先選擇主鍵,設置 keyProperty 而後執行插入語句。若是設置爲 AFTER,那麼先執行插入語句,而後是 selectKey 元素-這和如 Oracle 數據庫類似,能夠在插入語句中嵌入序列調用。 |
statementType | 和前面的相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型,分別表明 PreparedStatement 和 CallableStatement 類型。 |
下面從 Oracle 跟 MySQL 分別舉例說明。對象
<insert id="insertUserInfo" parameterType="club.sscai.entity.UserInfo"> <selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE"> select SEQ_T_USER_INFO.NEXTVAL from dual insert into "T_USER_INFO" <trim prefix="(" suffix=")" suffixOverrides=","> ID,USER_NAME,PASSWORD,PHONE,STATUS, <if test="remark != null"> REMARK, if> CREATE_TIME,UPDATE_TIME,UPDATE_BY <trim prefix="values (" suffix=")" suffixOverrides=","> #{id,jdbcType=DECIMAL}, #{userName,jdbcType=VARCHAR}, #{PASSWORD,jdbcType=VARCHAR},#{PHONE,jdbcType=VARCHAR},#{status,jdbcType=CHAR}, <if test="remark != null"> #{remark,jdbcType=VARCHAR}, if> #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}
如上代碼主要是向 T_USER_INFO 表插入用戶數據,parameterType 值傳入的是實體對象,這裏也能夠是 map 或者是其餘對象。rem
其中 的 keyProperty 值對應生成主鍵的字段,resultType 表示要返回的主鍵的類型,在這裏我用的 Integer 類型,你也能夠用 String,只要跟實體的字段對應便可。order 屬性須要注意一下,不一樣於支持自增類型的 MySQL 等數據庫,Oracle 須要設置設置爲 after 才能取到正確的值,可是若是要從序列化中取值,則須要設置爲 befor,不然會報錯,我上邊的代碼是從序列中取值因此設置爲 befor。字符串
標籤內的 SEQ_T_USER_INFO 表示該表的序列化,關於建立表序列化代碼以下(SEQ_T_USER_INFO 名稱隨便起,儘可能規範便可):string
create sequence SEQ_T_USER_INFO minvalue 1 maxvalue 9999999999999999999999999999 start with 1 increment by 1 cache 20;
字符串 uuid 類型非自增主鍵, selectKey 以下:it
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE"> select sys_guid() from dual
<insert id="insertUserInfo" parameterType="club.sscai.entity.UserInfo" > <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.string"> select uuid() insert into T_USER_INFO (id, user_name, PASSWORD,PHONE,STATUS,REMARK,CREATE_TIME,UPDATE_TIME,UPDATE_BY) values (#{id},#{userName},#{password},#{phone},#{status},省略...) insert>
上方是 MySQL 經過 select uuid() 就能獲得 uuid 字符串,實現 UUID 字符串形式的主鍵生成。若是須要 int 類型則以下所示:table
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> select LAST_INSERT_ID() selectKey>
至此,關於主鍵生成基本已經完事了,再額外補充關於 order = befor、after 的應用。
若是你使用的是 UUID() 這種形式的,建議選擇 order = befor,而 order = after 更適合返回自增(int)類型的主鍵。