mybatis-plus中,
capitalInfoMapper.update(null, updateWrapper);
与
capitalInfoMapper.update( updateWrapper);
有什么区别?

在MyBatis-Plus中,这两种写法没有区别,最终效果是相同的。

让我详细解释一下:

核心区别

java

// 写法1:显式传入null作为实体参数
capitalInfoMapper.update(null, updateWrapper);

// 写法2:只传入updateWrapper
capitalInfoMapper.update(updateWrapper);

实际上,第二种写法 capitalInfoMapper.update(updateWrapper) 在编译时会自动转换为第一种写法。这是因为:

  1. 语法糖机制:MyBatis-Plus通过方法重载和默认参数实现了这个语法糖

  2. 内部实现:当你只传入一个参数时,框架会自动填充第一个实体参数为null

实际应用示例

java

UpdateWrapper<CapitalInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper
    .set("balance", balance + 100)
    .set("update_time", new Date())
    .eq("id", 1)
    .eq("status", "ACTIVE");

// 两种写法完全等价
capitalInfoMapper.update(null, updateWrapper);
// 等同于
capitalInfoMapper.update(updateWrapper);

什么时候需要传入实体对象?

java

// 如果需要同时使用实体对象和条件构造器
CapitalInfo entity = new CapitalInfo();
entity.setBalance(1000);
entity.setUpdateTime(new Date());

UpdateWrapper<CapitalInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("user_id", 123);

// 实体对象中的字段会作为SET部分,条件构造器作为WHERE部分
capitalInfoMapper.update(entity, updateWrapper);

注意事项

  1. 推荐写法:使用 capitalInfoMapper.update(updateWrapper) 更简洁

  2. 版本兼容:两种写法在所有MyBatis-Plus版本中都支持

  3. 代码可读性:第二种写法更符合直觉,明确表示只通过条件构造器更新

SQL生成对比

两种写法都会生成相同的SQL:

sql

UPDATE capital_info 
SET balance = ?, update_time = ? 
WHERE id = ? AND status = ?

总结:两者完全等价,选择哪种取决于个人编码习惯。建议使用更简洁的 update(updateWrapper) 写法。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐