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 與併發性問題