SpringBoot+MybatisPlus+Mysql实现批量插入万级数据多种方式与耗时对比
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class YourEntityService implements IService<YourEntity> {
@Autowired
private YourEntityMapper yourEntityMapper;
@Override
public boolean saveBatch(List<YourEntity> list) {
// 方式1:使用MyBatis Plus提供的saveBatch方法
long startTime1 = System.currentTimeMillis();
boolean result1 = yourEntityMapper.insertBatch(list);
long endTime1 = System.currentTimeMillis();
System.out.println("方式1耗时:" + (endTime1 - startTime1) + "ms");
// 方式2:使用MyBatis的openSession方法手动控制事务
long startTime2 = System.currentTimeMillis();
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
YourEntityMapper mapper = sqlSession.getMapper(YourEntityMapper.class);
for (YourEntity entity : list) {
mapper.insert(entity);
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
long endTime2 = System.currentTimeMillis();
System.out.println("方式2耗时:" + (endTime2 - startTime2) + "ms");
// 方式3:使用MyBatis的openSession方法手动控制事务,并使用批量插入的SQL语句
long startTime3 = System.currentTimeMillis();
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
YourEntityMapper mapper = sqlSession.getMapper(YourEntityMapper.class);
mapper.insertBatchSql(list); // 假设YourEntityMapper有一个insertBatchSql方法,直接使用批量插入的SQL
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
long endTime3 = System.currentTimeMillis();
System.out.println("方式3耗时:" + (endTime3 - startTime3) + "ms");
return result1;
}
}
在这个代码示例中,我们展示了三种不同的批量插入数据的方式:
- 使用MyBatis Plus提供的saveBatch方法。
- 使用MyBatis的openSession方法手动控制事务,并在循环中使用普通的insert方法。
- 使用MyBatis的openSession方法手动控制事务,并调用一个自定义的批量插入的SQL语句方法。
在实际使用时,你需要根据你的具体数据库表结构和性能要求选择合适的方式。通过记录每种方式的耗时,可以对三种方式进行性能对比。
评论已关闭