Mybatis中saveOrUpdateBatch实现

发布时间:2023-05-20

一、saveOrUpdateBatch介绍

saveOrUpdateBatch 是 MyBatis 框架中提供的一种批量新增或批量更新数据的方法,相比于单条新增或更新的操作,使用 saveOrUpdateBatch 可以大幅度提高数据操作的效率。 saveOrUpdateBatch 方法可以接收一个集合参数,根据集合中的数据状态进行新增或更新操作,如果数据的主键已存在,则执行更新操作,否则执行新增操作。 相比于 MyBatis 的原生操作,saveOrUpdateBatch 在提高操作效率的同时,也可以避免手动判断主键是否存在的繁琐操作。

二、使用方法

以下是 saveOrUpdateBatch 的使用方法:

/**
 * 批量新增或更新数据
 * @param list
 */
void saveOrUpdateBatch(List<T> list);

其中,T 为实体类的类型。在使用 saveOrUpdateBatch 的时候,需要注意以下几点:

  • 实体类需要有主键字段,并且主键字段需要标注为 @Id@GeneratedValue 注解
  • 需要在 Mapper.xml 中编写相应的 SQL 语句
  • 需要在 Mapper 接口的方法中添加 @Param 注解,指定传入的参数名为 list

三、实现示例

1. 实体类定义

以用户信息为例,定义一个 User 实体类,主键为 id

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String password;
    // 省略getter和setter方法
}

2. Mapper.xml 配置

Mapper.xml 中编写相应的 SQL 语句,如下所示:

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 批量新增或更新用户信息 -->
    <insert id="saveOrUpdateBatch">
        INSERT INTO user (id, name, password)
        VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.id}, #{item.name}, #{item.password})
        </foreach>
        ON DUPLICATE KEY UPDATE
        <foreach collection="list" item="item" separator=",">
            name = VALUES(name),
            password = VALUES(password)
        </foreach>
    </insert>
</mapper>

其中,ON DUPLICATE KEY UPDATE 语句表示在主键冲突的情况下执行更新操作,VALUES(name) 表示更新 name 字段为当前插入的 name 值,VALUES(password) 表示更新 password 字段为当前插入的 password 值。

3. Mapper 接口定义

定义一个 UserMapper 接口,在接口中添加 saveOrUpdateBatch 方法,如下所示:

public interface UserMapper extends BaseMapper<User> {
    /**
     * 批量新增或更新用户信息
     * @param userList 用户信息列表
     */
    void saveOrUpdateBatch(@Param("list") List<User> userList);
}

4. Java 代码调用

在 Java 代码中调用 saveOrUpdateBatch 方法,实现批量新增或批量更新,如下所示:

@Autowired
private UserMapper userMapper;
public void batchSaveOrUpdate(List<User> userList) {
    userMapper.saveOrUpdateBatch(userList);
}

四、总结

使用 MyBatis 的 saveOrUpdateBatch 方法可以快速实现批量新增或批量更新数据,提高数据操作的效率。虽然在使用过程中需要注意一些细节问题,如主键字段的设置、Mapper.xml 中 SQL 语句的编写和 Mapper 接口方法上的 @Param 注解等,但总的来说,saveOrUpdateBatch 方法的使用是非常方便的,值得推荐。