Mysql中如何批量插入数据?

11人浏览 / 0人评论 / 添加收藏

mysql mapper 批量插入list
在Java中使用MyBatis的Mapper接口进行批量插入时,通常有两种方式:使用foreach标签或者使用batch方法。这里我将详细介绍这两种方法。

方法1:使用<foreach>标签
你可以在MyBatis的XML映射文件中使用<foreach>标签来批量插入数据。这种方式适用于直接在XML文件中编写SQL语句的情况。

示例XML映射文件(例如UserMapper.xml):

<insert id="insertUsers" parameterType="java.util.List">
   INSERT INTO users (id, name, email)
   VALUES
   <foreach collection="userList" item="user" index="index" separator=",">
       (#{user.id}, #{user.name}, #{user.email})
   </foreach>
</insert>

使用Mapper接口调用:

public interface UserMapper {
   void insertUsers(@Param("userList") List<User> users);
}

注意:这里的红色文字部分,需要对应上,否则执行批量插入会失败。

方法2:使用MyBatis的batch方法
MyBatis也提供了内置的方法来支持批量操作,这种方式不需要在XML中写复杂的SQL语句,可以直接在Mapper接口中调用。

Mapper接口:

public interface UserMapper {
   @Options(useGeneratedKeys = true, keyProperty = "id")
   int insertUser(User user);
}

使用MyBatis的批量插入:

首先,你需要一个SqlSession,然后使用SqlSession的insert方法加上foreach循环来批量插入。例如:

try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
   UserMapper mapper = session.getMapper(UserMapper.class);
   for (User user : users) {
       mapper.insertUser(user);
   }
   session.commit();  // 提交事务以执行批量插入
}

或者,如果你使用的是Spring与MyBatis集成,你可以使用@Transactional注解和Spring的JdbcTemplate或者MyBatis的批处理功能:

@Transactional
public void batchInsertUsers(List<User> users) {
   UserMapper mapper = sqlSession.getMapper(UserMapper.class);
   for (User user : users) {
       mapper.insertUser(user);
   }
   sqlSession.commit();  // 提交事务以执行批量插入
}

性能优化建议:
批量大小:考虑数据库的批量插入限制(例如MySQL的max_allowed_packet),适当调整批量大小。

事务管理:确保在批量操作后正确提交事务。

异常处理:在批量操作中添加适当的异常处理逻辑,确保在出现错误时能够回滚事务。

使用批处理模式:在MyBatis配置中开启批处理模式可以进一步提高性能,例如在MyBatis配置文件中设置defaultExecutorType="BATCH"。

通过这些方法,你可以有效地在Java中使用MyBatis进行批量插入操作。选择最适合你项目需求的方式。

 

全部评论