在 MyBatis 的 @Update 注解里,#{…} 里的名字 并不是 按照 “Java 字段名” 去解析,而是按照 参数名 或者 @Param 注解指定的名字 去解析。
你现在的写法:
@Update("update shopping_cart set number = #{number} where id = #{id}")
void update(ShoppingCart cart);
没有任何 @Param 注解,MyBatis 会把 唯一的参数 cart 当成一个 Map,然后按 属性名 去取值。
因此
#{id} → cart.getId()
#{number} → cart.getNumber()
能正常工作 前提是:
ShoppingCart类里真的有private Long id; private Integer number; // 以及对应的 getter- 你用的是 JDK 8+ 并且代码在编译时开启了
-parameters选项(默认 Maven/Gradle 插件都会开),或者 MyBatis 通过反射找到了 getter。
✅ 一句话总结
#{id} 就是调了 cart.getId(),MyBatis 把单个对象当成 “属性名 → 属性值” 的 Map 来用。
❗ 如果想显式指定,防止混淆
可以用 @Param 把对象整体起个别名,然后显式点属性:
@Update("update shopping_cart set number = #{sc.number} where id = #{sc.id}")
void update(@Param("sc") ShoppingCart cart);
这样可读性更高,也避免了多参数时搞混。

被折叠的 条评论
为什么被折叠?



