在实际操作中,批量更新操作会涉及到多条记录的同时更新,在Spring Boot中我们可以通过MyBatis等操作来完成批量更新操作,下面我们就来看看几种常用的批量更新操作的方法。
MyBatis foreach 标签在MyBatis中供应了foreach标签,这个标签便是用来完成批量操作的标签,在实际操作中我们可以利用foreach标签来遍历传入的列表,并对每一条记录实行更新操作。如下所示。
创建批量更新的Mapper接口

public interface UserMapper { void updateBatch(List<User> users);}
利用MyBatis的foreach标签进行批量更新
假设我们有一个User工具,在这个工具中包含了id和name两个字段,我们要根据id更新name字段。那我们就可以在UserMapper.xml中,通过foreach标签来实行批量更新操作,如下所示。
<update id="updateBatch" parameterType="list"> <foreach collection="list" item="user" separator=";"> UPDATE user_table SET name = #{user.name} WHERE id = #{user.id} </foreach></update>
collection="list" 指定我们要遍历的凑集。item="user" 是凑集中的每个元素,这里每个元素是 User 工具。separator=";" 表示每个 SQL 语句之间用 ; 号分隔,代表实行多条独立的更新语句。
做事层调用
在做事层中,我们可以通报一个List给updateBatch方法。
@Servicepublic class UserService { @Autowired private UserMapper userMapper; public void updateUsers(List<User> users) { userMapper.updateBatch(users); }}
利用MyBatis供应的批量更新支持
在MyBatis中,对付某些数据库也支持了批量更新操作,这样我们就可以通过SqlSession进行手动批量操作,如下所示。
利用SqlSession进行批量操作
可以在Service层中利用SqlSession来批量实行更新操作。
@Servicepublic class UserService { @Autowired private SqlSessionFactory sqlSessionFactory; public void updateUsersBatch(List<User> users) { try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); for (User user : users) { userMapper.update(user); // 假设有单个更新方法 } sqlSession.flushStatements(); // 刷新并实行批量更新 } }}
ExecutorType.BATCH会将多个SQL语句放入一个批处理中,减少JDBC调用次数,提高性能。然后利用flushStatements来实行批量操作。
JDBC 批量更新当然,除了上面的实现办法之外,我们还可以利用原生的JDBC办法,通过SqlSession获取到原生的Connection来实行批量更新。
@Servicepublic class UserService { @Autowired private SqlSessionFactory sqlSessionFactory; public void updateUsersWithJdbcBatch(List<User> users) { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { Connection connection = sqlSession.getConnection(); String sql = "UPDATE user_table SET name = ? WHERE id = ?"; try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { for (User user : users) { preparedStatement.setString(1, user.getName()); preparedStatement.setLong(2, user.getId()); preparedStatement.addBatch(); } preparedStatement.executeBatch(); // 实行批量更新 } } }}
通过 PreparedStatement.addBatch() 将所有的更新语句加入批处理中。然后executeBatch() 实行批量更新。
总结批量更新适宜大数据量时利用,它可以减少数据库的网络交互次数,提高性能。但是须要把稳批量的大小,避免一次性处理过多数据导致内存溢出。这几种方法可以根据实际项目中的场景来选择。如果更新数据量较大,可以优先考虑 MyBatis 的批处理或者 JDBC 批处理方法来提高效率。