在 MyBatis 框架中,updateByPrimaryKey
和 updateByPrimaryKeySelective
是两种常用的更新数据的方法,它们的主要区别在于如何处理非主键字段的 NULL
值。
1. updateByPrimaryKey
- 方法功能:根据主键更新记录的所有字段,不管字段值是否为
NULL
。 - 行为:如果某个非主键字段被设置为
NULL
,那么数据库中的对应字段也会被更新为NULL
。 - SQL 示例:
在这个例子中,如果UPDATE table_name SET column1 = #{column1}, column2 = #{column2}, ... WHERE id = #{id};
column1
的值为NULL
,那么数据库中该记录的column1
也会被更新为NULL
。
2. updateByPrimaryKeySelective
- 方法功能:根据主键更新记录,但只更新那些非
NULL
的字段。 - 行为:如果某个非主键字段被设置为
NULL
,那么该字段不会被包含在更新语句中,即数据库中的对应字段保持不变。 - SQL 示例(伪代码表示逻辑):
在这个例子中,如果UPDATE table_name SET column1 = #{column1} IF column1 IS NOT NULL, column2 = #{column2} IF column2 IS NOT NULL, ... WHERE id = #{id};
column1
的值为NULL
,那么更新语句中不会包含column1 = NULL
,数据库中的column1
字段值保持不变。
使用场景
updateByPrimaryKey
:适用于你需要确保所有字段都被更新,即使它们的值是NULL
。updateByPrimaryKeySelective
:适用于你只想更新那些被明确赋值的字段,而保持NULL
字段不变的情况,这在部分更新数据时特别有用,可以避免不必要的字段被更新为NULL
。
示例代码
假设你有一个 User
对象,并且对应的 MyBatis Mapper 接口如下:
public interface UserMapper {
int updateByPrimaryKey(User user);
int updateByPrimaryKeySelective(User user);
}
-
使用
updateByPrimaryKey
:User user = new User(); user.setId(1); user.setName(null); // 这会将数据库中的 name 字段更新为 NULL userMapper.updateByPrimaryKey(user);
-
使用
updateByPrimaryKeySelective
:User user = new User(); user.setId(1); user.setName(null); // 数据库中的 name 字段不会被更新 userMapper.updateByPrimaryKeySelective(user);
总结来说,选择哪种方法取决于你的具体需求。如果你希望保留字段的原有值(特别是当它们为 NULL
时),应该使用 updateByPrimaryKeySelective
。如果你需要确保所有字段都被覆盖(包括设置为 NULL
),则使用 updateByPrimaryKey
。
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18558130