mysql批量insert正确方式 mybatis批量insert数据动态表明


数据库使用的是SQLServer,JDK版本1.8,运行在SpringBoot环境下 对比3种可用的方式
反复执行单条插入语句xml拼接sql批处理执行先说结论:少量插入请使用反复插入单条数据,方便 。数量较多请使用批处理方式 。(可以考虑以有需求的插入数据量20条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要) 。
无论何时都不用xml拼接sql的方式 。
代码 拼接SQL的xml newId()是sqlserver生成UUID的函数,与本文内容无关
INSERT INTO tb_item VALUES(newId(),#{item.uniqueCode},#{item.projectId},#{item.name},#{item.type},#{item.packageUnique},#{item.isPackage},#{item.factoryId},#{item.projectName},#{item.spec},#{item.length},#{item.weight},#{item.material},#{item.setupPosition},#{item.areaPosition},#{item.bottomHeight},#{item.topHeight},#{item.serialNumber},#{item.createTime}Mapper接口Mapper 是 mybatis插件tk.Mapper 的接口,与本文内容关系不大public interface ItemMapper extends Mapper {int insertByBatch(List itemList);} Service类
@Servicepublic class ItemService {@Autowiredprivate ItemMapper itemMapper;@Autowiredprivate SqlSessionFactory sqlSessionFactory;//批处理@Transactionalpublic void add(List itemList) {SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);ItemMapper mapper = session.getMapper(ItemMapper.class);for (int i = 0; i < itemList.size(); i) {mapper.insertSelective(itemList.get(i));if(i00==999){//每1000条提交一次防止内存溢出session.commit();session.clearCache();}}session.commit();session.clearCache();}//拼接sql@Transactionalpublic void add1(List itemList) {itemList.insertByBatch(itemMapper::insertSelective);}//循环插入@Transactionalpublic void add2(List itemList) {itemList.forEach(itemMapper::insertSelective);}} 测试类
@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ApplicationBoot.class)public class ItemServiceTest {@AutowiredItemService itemService;private List itemList = new ArrayList<>();//生成测试List@Beforepublic void createList(){String json ="{n"""areaPosition": "TEST",n"""bottomHeight": 5,n"""factoryId": "0",n"""length": 233.233,n"""material": "Q345B",n"""name": "TEST",n"""package": false,n"""packageUnique": "45f8a0ba0bf048839df85f32ebe5bb81",n"""projectId": "094b5eb5e0384bb1aaa822880a428b6d",n"""projectName": "项目_TEST1",n"""serialNumber": "1/2",n"""setupPosition": "1B柱",n"""spec": "200

    推荐阅读