mybatis batch 批处理insert 自增主键 存在问题

批处理,mybatis有2中方式

1 foreach

2 batch


分析下batch存在的问题

		SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
				.openSession(ExecutorType.BATCH, false);
		
		InspectTemplateMapper inspectTemplateMapper = session.getMapper(InspectTemplateMapper.class);
		//设置每次提交的数量
		int size = insertList.size();
		int count =0 ;
		//这里要多线程处理(4个线程的线程池)
		try {
			for (int i = 0; i < size; i++) {
				
				inspectTemplateMapper.insertSelective(insertList.get(i));
				count++;
				if (i % 1000 == 0 ) {
					// 手动每1000个一提交,提交后无法回滚
					session.commit();
					// 清理缓存,防止溢出
					session.clearCache();
				}
			}
		} catch (Exception e) {
			// 没有提交的数据可以回滚
			session.rollback();
		} finally {
			session.close();
		}
		return count;

这里我用的自增主键,每次事物提交,会报出java.sql.BatchUpdateException: Field 'device_id'(主键) doesn't have a default value

查询了很多资料,有人说batch批处理只有最后一条会有自增主键,或者说mysql自增主键只有在一个事物提交时,会产生一个(个人猜想)

亲测:

批处理list只有一条数据时传入

仍然报错,否定了之前的猜想,batch不会返回自增主键

如果想要批处理还要用自增主键,在xml用foreach 设置 useGeneratedKeys="true"  keyProperty="id" 即可

你可能感兴趣的:(java后台,思路,数据库)