mybatis两种批量插入的实现

原创
2017/12/11 12:18
阅读数 1.4W

一、拼接sql的方式(非正解)

     1、在mapper文件中写一个insertBatch方法。

<insert id="insertBatch">
		insert into user(name,age,is_delete) 
		<foreach collection="users" item="user" open="VALUES" close=";" separator=",">
			(#{user.name},#{user.age},#{user.isDelete})
		</foreach>
</insert>

    2、在接口中声明方法

       

3、编写测试方法

    

	
	@Test
	public void test08(){
		SqlSession sqlSession = getSqlSession();
		IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
		
		List<User> users=new ArrayList<>();
		for(int i=0;i<10000;i++){
			users.add(new User(null,"赵敏"+i,i,"镇雄"+i,false));
		}
		long begin=System.currentTimeMillis();
		int insertBatch = mapper.insertBatch(users);
		long end=System.currentTimeMillis();
		System.out.println(end-begin);
		System.out.println(insertBatch);
		sqlSession.close();
	}

4、查看测试结果

    

注:这种实现方式非正解,我测试了1w条数据的时候差不多需要一秒多时间,可是当我改成10w条的时候,直接ka着不会动了。这种方式是把所有数据拼成一条sql传递给数据库,这种方式,当sql长时是存在问题的,而且,这种方式也只限于mysql,oracle不支持这种方式。之所以这么写,是因为我待的一家公司的一个经理,自称是国内互联网it界精英用了这种方式,所以我就来举个例子。

 

二、使用ExecutorType.BATCH创建SqlSession

    1、测试代码

@Test
	public void test09(){
		SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
		IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
		
		long begin=System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			mapper.insert(new User(null,"赵敏"+i,i,"镇雄"+i,false));
		}
		long end=System.currentTimeMillis();
		System.out.println(end-begin);
		sqlSession.close();
	}

2、测试结果

        

注:这种方式在测试1w条的时候虽然看起来比拼接sql慢一点,但在插入10w条的时候不会卡死,差不多就是插入1w条的10倍,所以时间复杂度是O(n)。推荐使用mybatis提供的ExcecutorType.BATCH。

 

展开阅读全文
打赏
3
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
3
分享
返回顶部
顶部