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进行批量插入操作。选择最适合你项目需求的方式。
全部评论