com.baomidou.mybatisplus.extension.service.IService.saveOrUpdate
@version 乐观锁机制
// 执行saveOrUpdate操作
//
// 注意: 如果在entity中version字段加了@version.
// 在使用saveOrUpdate这个方法时.一定要注意使用version字段.它在sql的where后会加version...那么
// 当传入的version值和数据库不一致时.则无法命中到数据.
// 这时saveOrUpdate在操作数据时updateById返回false.这时候saveOrUpdate就会去执行save操作.这样导致脏数据出现的情况.
// 切记
// 执行saveOrUpdate操作
//
// 注意: 如果在entity中version字段加了@version.
// 在使用saveOrUpdate这个方法时.一定要注意使用version字段.它在sql的where后会加version...那么
// 当传入的version值和数据库不一致时.则无法命中到数据.
// 这时saveOrUpdate在操作数据时updateById返回false.这时候saveOrUpdate就会去执行save操作.这样导致脏数据出现的情况.
// 切记
boolean res = userService.saveOrUpdate(userInfo);
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveOrUpdate的实现方法
/**
* <p>
* TableId 注解存在更新记录,否插入一条记录
* </p>
*
* @param entity 实体对象
* @return boolean
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveOrUpdate(T entity) {
if (null != entity) {
Class<?> cls = entity.getClass();
TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
if (null != tableInfo && StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
Object idVal = ReflectionKit.getMethodValue(cls, entity, tableInfo.getKeyProperty());
if (StringUtils.checkValNull(idVal)) {
return save(entity);
} else {
/*
* 更新成功直接返回,失败执行插入逻辑
*/
return updateById(entity) || save(entity);
}
} else {
throw ExceptionUtils.mpe("Error: Can not execute. Could not find @TableId.");
}
}
return false;
}