前兩天在用MyBatis-Plus寫了一張單表的增刪改查,在寫到修改的時候,就突然蹦出一個奇怪的想法。 MyBatis-Plus的BaseMapper中有兩個關於修改的方法。如下: int updateById(@Param("et") T entity); int update(@Param("e ...
前兩天在用MyBatis-Plus寫了一張單表的增刪改查,在寫到修改的時候,就突然蹦出一個奇怪的想法。
MyBatis-Plus的BaseMapper中有兩個關於修改的方法。如下:
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
就我在想,在修改的時候,給這個entity個別欄位賦值,部分欄位不管它,在調用update方法的時候,會不會在修改完之後,資料庫的其他欄位被置為null。
開始測試
1.測試updateById方法
首先這是未修改之前的數據
點擊查看測試代碼
@Test
public void testUpdateById() {
SysUser sysUser = new SysUser();
sysUser.setId(1569971954553761794L);
sysUser.setAvatar("abc.png");
sysUser.setMobilePhoneNumber("13266669999");
int i = sysUserMapper.updateById(sysUser);
log.info("flag:{}",i);
}
這是執行完測試代碼後的數據,很明顯在修改完指定欄位的同時,其他沒有被指定的欄位沒有被修改。
再看一下該代碼所執行的sql
UPDATE ms_sys_user SET avatar=?, mobile_phone_number=? WHERE id=?
2.測試update方法
這個update方法是可以進行批量修改的,符合匹配條件的數據都會被修改。
首先這是未修改之前的數據
測試代碼中的兩種寫法等價,出來的sql都是一樣的。
點擊查看測試代碼
@Test
public void testUpdate() {
UpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("avatar","1.png")
.set("avatar","12.png");
SysUser sysUser = new SysUser();
sysUser.setEmail("[email protected]");
sysUserMapper.update(sysUser, updateWrapper);
}
@Test
public void testUpdate() {
UpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("avatar","1.png")
.set("avatar","12.png")
.set("email","[email protected]");
sysUserMapper.update(null, updateWrapper);
}
這是執行完update方法之後的數據,可以明顯的看到兩條符合匹配條件的數據都被修改了,並且其他不相關的欄位還是原來的。
執行的sql如下
Preparing: UPDATE ms_sys_user SET email=?, avatar=? WHERE (avatar = ?)
Parameters: [email protected](String), 12.png(String), 1.png(String)
綜上所試:
在執行修改方法的時候,在不指定其他欄位時候,預設只會修改實體中指定欄位的值,那些沒有被指定的欄位不會被置為null。