Mybatis Plus 提供了多種更新資料的方法,其中比較常用的有以下幾種:
- updateById(T entity):根據主鍵更新資料,如果實體中的屬性值為 null,則不更新該屬性對應的資料庫字段。
- update(T entity, Wrapper<T> updateWrapper):根據條件更新資料,其中 Wrapper<T> 是一個條件構造器,可以通過它來設定更新資料的條件。例如:
- javaCopy code
- UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("age", 18).set("name", "Tom"); userMapper.update(null, wrapper);
- 上述代碼将所有年齡為 18 歲的使用者的名字更新為 Tom。
- updateBatchById(Collection<T> entityList):批量更新資料,根據實體清單中每個實體的主鍵更新對應的資料。
- updateBatchById(Collection<T> entityList, int batchSize):批量更新資料,并且可以指定每次更新的數量。
如果想要根據差異進行更新資料,可以使用 update(T entity, Wrapper<T> updateWrapper) 方法,并在條件構造器 Wrapper<T> 中設定需要更新的屬性和條件。例如,假設有一個 User 實體類,其中有 name、age、email 三個屬性,要更新年齡為 18 歲的使用者的郵箱為 [email protected],可以按照以下方式進行更新:
javaCopy codeUpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("age", 18).set("email", "[email protected]");
userMapper.update(null, wrapper);
在條件構造器 wrapper 中,使用 eq 方法設定了更新資料的條件,即年齡為 18 歲;使用 set 方法設定了需要更新的屬性,即将郵箱設定為 [email protected]。這樣就可以根據差異進行更新資料了。
Mybatis plus 不支援根據差異更新資料,如果想實作可以根據接口自定義實作
實作差異更新可以分為以下幾個步驟:
- 查詢資料庫中原始的資料,并将其封裝成一個實體對象。
- 對比實體對象和需要更新的資料,找出不同的屬性。
- 使用條件構造器設定更新的條件,根據不同的屬性更新資料。
以下是一個簡單的實作示例:
javaCopy code// 假設有一個 User 實體類
User user = userMapper.selectById(userId); // 查詢原始資料
User updateUser = new User();
updateUser.setId(userId);
updateUser.setName("Tom");
updateUser.setAge(20);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
if (!user.getName().equals(updateUser.getName())) {
updateWrapper.set("name", updateUser.getName()); // 如果名字不同,則更新名字
}
if (user.getAge() != updateUser.getAge()) {
updateWrapper.set("age", updateUser.getAge()); // 如果年齡不同,則更新年齡
}
if (updateWrapper.isEmptyOfWhere()) {
// 如果條件為空,則不更新資料
return;
}
updateWrapper.eq("id", userId);
userMapper.update(null, updateWrapper); // 根據條件更新資料
在上述示例中,首先查詢了原始的 User 資料,并将其封裝成了一個 User 對象。然後建立了一個新的 User 對象 updateUser,并将需要更新的屬性指派給它。接下來,使用條件構造器 UpdateWrapper 設定了需要更新的屬性和條件。其中,如果原始資料和需要更新的資料在某個屬性上不同,則将該屬性添加到條件構造器中。最後,如果條件構造器不為空,則根據條件構造器更新資料。這樣就實作了差異更新。