業務需求,用戶表為主鍵自增,添加完用戶之后,通過用戶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);
}