前兩天在用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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/510940.html
標籤:MySQL
上一篇:激活資料價值,探究DataOps下的資料架構及其實踐丨DTVision開發治理篇
下一篇:我操作MySQL的驚險一幕
