mybatis 返回主鍵注意事項

有時候當一條記錄插入之後,需要用到當前記錄的id,

方法有二:

一:插入當前記錄之後,在根據條件去表中查詢;

二:插入記錄時直接返回主鍵;

第一種方法就不說了,我就說說第二種方法:
 

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT
        INTO ke_pack_send(
        id,
        device_id,
        content,
        grade,
        flag,
        update_time,
        mark,mark_name
        ) VALUES (
        #{id},
        #{deviceId},
        #{content},
        #{grade},
        #{flag},
        #{updateTime},
        #{mark},
        #{markName}
        )
    </insert>

  • 注:

  • 1、添加記錄能夠返回主鍵的關鍵點在於需要在<insert>標籤中添加以下三個屬性<insert useGeneratedKeys="true" keyProperty="id" keyColumn="id"></insert>。

  • useGeneratedKeys:必須設置爲true,否則無法獲取到主鍵id。

  • keyProperty:設置爲POJO對象的主鍵id屬性名稱。

  • keyColumn:設置爲數據庫記錄的主鍵id字段名稱

  • 2、新添加主鍵id並不是在執行添加操作時直接返回的,而是在執行添加操作之後將新添加記錄的主鍵id字段設置爲POJO對象的主鍵id屬性

useGeneratedKeys設置爲true,keyProperty設置爲主鍵對應實體類的屬性值,如果是聯合主鍵那麼屬性名用逗號隔開;insert時,返回的是新增記錄的主鍵值、update時返回的時更新記錄的主鍵值;

但是在插入時如果出現主鍵衝突,此方法經測試是無效的。

	<insert id="insert" useGeneratedKeys="true" keyProperty="id">
		INSERT
		INTO village(
		city,
		area,
		village,
		company_id,
		office_id,
		type,
		create_by
		)
		VALUES (
		#{city},
		#{area},
		#{village},
		#{companyId},
		#{officeId},
		#{type},
		#{createBy.id}
		)ON
		DUPLICATE KEY
		UPDATE no=no
	</insert>

此時是沒辦法返回到主鍵的。

但是可以使用以下方法:


	<insert id="insertUserOffice">
		<selectKey keyProperty='no' resultType='java.lang.String'
			order='AFTER'>
			SELECT
			no
			FROM user
			WHERE phone = #{phone}
		</selectKey>
		INSERT INTO user(
		name,
		phone,
		card
		) VALUES (
		#{name},
		#{phone},
		#{card}
		)on duplicate
		key
		update		
		name = #{name}
	</insert>

參數屬性:

屬性名 作用
resultType selectKey指定sql返回值類型
order 執行順序,after,表示後執行,before,表示先執行
keyProperty 主鍵對應實體類中的屬性名字

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章