在使用主鍵自增時,插入數據庫後可能須要獲得自增的主鍵值,而後使用這個值進行一些其餘的操做。如下創建一個insert方法和mapper.xml
/**
*新增用戶--使用useGeneratedKeys方式
*/
int insert2(System sysUser);
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)
values( #{userName},#{userPassword},#{userEamil},
#(userInfo),#{headImg,jdbcType= BLOB},
#(createTime,jdbcType= TIMESTAMP))
</insert>
useGeneratedKeys 設置爲true後,MyBatis會使用JDBC的getGeneratedKeys方法來取出由數據庫內部生成的主鍵。得到主鍵值後將其賦值給keyProperty配置的id屬性。當須要設置多個屬性時,使用逗號隔開,這種狀況下一般還須要設置keyColumn屬性,按照順序指定數據庫的列,這裏列的值會和keyProperty配置的屬性一一對應。因爲要使用數據庫返回的主鍵值,因此SQL上下兩部分的列中去掉了id列和對應的#{id}屬性。
使用selectKey返回主鍵的值
以上回寫主鍵的方法只是適用於支持主鍵自增的數據庫。有些數據庫(Oracle)不提供主鍵自增的功能,而是使用序列獲得一個值,而後將這個值賦值給id,再將數據插入數據庫。對於這種狀況,能夠採用另一種方式:使用<select>標籤來獲取主鍵的值,這種方式不只適用於不提供主鍵自增功能的數據庫,也適用於提供主鍵自增功能和數據庫。如下語句是用於MySql
<insert id="insert">
insert into sys_user(user_name,user_password,user_email,
user_info,head_img,create_time)
values(
#{userName},#{userPassword},#{userEmail},
#{userInfo},#{headImg,jdbcType=BLOB},
#{createTime,jdbcType= TIMESTAMP})
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
selectKey標籤的keyColumn,keyProperty和上面useGeneratedKeys的用法含義相同,這裏的resultType用於設置返回值類型。order屬性的設置和使用的數據庫有關。
order屬性,在MySQL數據庫中,order屬性設置的值是AFTER,由於當前記錄的主鍵值在insert語句執行成功後才能獲取到。而在Oracle數據中,order的值設置爲BEFORE,這是由於Oracle中須要先從序列獲取值,而後將值做爲主鍵插入到數據庫中。這個和不一樣數據庫,自增id生成的方式不一樣有關係。MySQL數據庫,若是把表的主鍵設爲auto_increment類型,數據庫就會自動爲主鍵賦值。而在Oracle是爲每張表的主鍵建立一個單獨的序列,而後從這個序列中獲取自動增長的 標識符,把它賦值給主鍵。
使用上述方法,select標籤內的語句與不一樣的數據庫有關,不一樣的數據庫,支持的語句不同。