有時候當一條記錄插入之後,需要用到當前記錄的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 | 主鍵對應實體類中的屬性名字 |