1. 程式人生 > >Mybatis自增長id處理

Mybatis自增長id處理

目錄

1.使用useGenerateKey

    <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="personId">
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert> 

或者

   @Mapper
   public interface UserMapper
   {
       @Insert("insert into tbl_user (name, age) values (#{name}, #{age})")
       @Options(useGeneratedKeys=true, keyProperty="userId", keyColumn="user_id")
       void insertUser(User user);
   } 

其中keyProperty對應的屬性為返回物件的欄位,keyColumn對應的為表字段

返回新增id在新增物件的id屬性中

這種只能使用在自增長的資料庫中,比如mysql,在oracle中就不行

2.使用select LAST_INSERT_ID()

   <insert id="insert" parameterType="Person">
           <selectKey keyProperty="personId" resultType="long">
               select LAST_INSERT_ID()
           </selectKey>
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert>

LAST_INSERT_ID 是與table無關的,如果向表a插入資料後,再向表b插入資料,LAST_INSERT_ID會改變。

LAST_INSERT_ID是基於Connection的,只要每個執行緒都使用獨立的Connection物件,LAST_INSERT_ID函式將返回該Connection對AUTO_INCREMENT列最新的insert or update*作生成的第一個record的ID。這個值不能被其它客戶端(Connection)影響,保證了你能夠找回自己的 ID 而不用擔心其它客戶端的活動,而且不需要加鎖。

注意:

使用select last_insert_id()時要注意,當一次插入多條記錄時,只是獲得第一次插入的id值,務必注意。

insert into tb(c1,c2) values (c1value,c2value),(c3value,c4value);select LAST_INSERT_ID();
或者
insert into tb(c1,c2) values (c1value,c2value);
insert into tb(c1,c2) values (c3value,c4value);
select LAST_INSERT_ID();

這兩種情況返回的都是最後插入新增的id,就是上文中新增c3value,c4value的id.

3.使用select @@IDENTITY

   <insert id="insert" parameterType="Person">
           <selectKey keyProperty="personId" resultType="long">
               select @@IDENTITY
           </selectKey>
           insert into person(name,pswd) values(#{name},#{pswd})
   </insert>

@@identity是表示的是最近一次向具有identity屬性(即自增列)的表插入資料時對應的自增列的值,是系統定義的全域性變數。一般系統定義的全域性變數都是以@@開頭,使用者自定義變數以@開頭。比如有個表A,它的自增列是id,當向A表插入一行資料後,如果插入資料後自增列的值自動增加至101,則通過select @@identity得到的值就是101。使用@@identity的前提是在進行insert操作後,執行select @@identity的時候連線沒有關閉,否則得到的將是NULL值。

4.在MySql中模擬Sequence

這個比較繁瑣,有興趣的可以看[DB][MySql]關於取得自增欄位的值、及@@IDENTITY 與併發性問題

參考:

mybatis 操作資料庫的主鍵自增長

mybatis自增長插入id

[DB][MySql]關於取得自增欄位的值、及@@IDENTITY 與併發性問題

Mysql 中獲取剛插入的自增長id的值