業務需求,使用者表為主鍵自增,新增完使用者之後,通過使用者ID和角色表進行關聯。
問題:由於主鍵自增,所以在使用者新增之前是不知道ID的,當然可以通過查詢得到當前的ID,不過需要自己多一步操作。
解決方案:使用useGeneratedKeys屬性,以及keyProperty
useGeneratedKeys
(僅適用於 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由資料庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關係型資料庫管理系統的自動遞增欄位),預設值:false。
keyProperty
僅適用於 insert 和 update)指定能夠唯一識別物件的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設定它的值,預設值:未設定(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
個人理解:下圖比較詳細
可能引發問題:有時候使用批量新增操作,在service層將所有的資料通過for迴圈進行遍歷,呼叫底層的單個新增操作的方法(xml中useGeneratedKeys屬性為true),新增到第二條時,會提示主鍵已存在的異常(資料庫設定的為主鍵自增)。
原因:因為useGeneratedKeys屬性為true所以將第一條新增的資料主鍵返回了,而第二條資料沒有將id主鍵重新設定為null,直接使用第一條新增資料並返回的主鍵id,導致主鍵重複異常。
解決方案:迴圈遍歷新增時,將id設定為null即可。
for (int i = 0; i < 3; i++) {
user.setUserId(null); //將使用者id重新設定為null即可
// 新增使用者資訊
rows = userMapper.insertUser(user);
// 新增使用者崗位關聯
insertUserPost(user);
}