mybatis 返回主鍵注意事項
阿新 • • 發佈:2018-11-09
有時候當一條記錄插入之後,需要用到當前記錄的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 | 主鍵對應實體類中的屬性名字 |