mybatis源码阅读之9:批量插入数据

上一篇 mybatis源码阅读之8:获取sqlSessionFactory对象

在做项目的工程中,遇到过各种mybatis批量插入数据的需求。在各种水平的架构师提供的框架封装中,也出现了好几种对批量处理的不同封装。

根据我看过的代码,大致可以分三种情况。

第一种:代码级别循环调用同一个mapper的add/save操作。

	@Autowired
	private EnterTypeMapper enterTypeMapper;

	for(EnterTypeDO d:list) {
		enterTypeMapper.add(d);
	}

这是一种完全不负责任的做法,数据量大到一定级别时,插入很慢,而且可能导致数据库连接池资源耗尽,因为每一次调用都要获取资源,在事务尚未提交的时候,资源不会被释放。

差评

 

第二种:sql的xml中,传对象List,用sql标签foreach循环拼接sql

    <insert id="addList" parameterType="com.ddc.sample.user.domain.UserManagerDO"     useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user_manager(
            ACCOUNT, TEL
        ) VALUES 
        <foreach collection="list" item="item" index= "index" separator =",">
            (    
            #{item.account}, #{item.tel}
            )
        </foreach>

这个是最常见的写法,性能上对比上一种方法,有明显好转。看起来貌似是批处理,实际上读过mybatis全局配置的同学应该知道,默认的配置是ExecutorType.SIMPLE,他是一个普通的执行器,并不是采用mybatis提供的真正的批量处理。

一般

 

第三种:从容器中获取SqlSessionFactoryBean,通过SqlSessionTemplate获取Mapper,执行循环插入操作

	@Autowired
	private SqlSessionFactoryBean factoryBean;

	SqlSessionTemplate sqlSessionTemplate = new     SqlSessionTemplate(factoryBean.getObject(), ExecutorType.BATCH);
	MessageMapper mapper = sqlSessionTemplate.getMapper(MessageMapper.class);
	for (int i = 5; i < 100; i++) {
		MessageDO d = new MessageDO();
		d.setBizType("sendMsg");
		d.setTelNum("18005158505");
		d.setCode("0000");
		d.setMessage("dddddddd");
		d.setResult("success");
		mapper.add(d);
	}

这个是完全采用myatis提供的批处理方法,mapper.add会对所有的语句预编译,然后再执行,在性能上完胜以上两种方法。

陈独秀一般的优秀,推荐使用

 

 

上一篇 mybatis源码阅读之8:获取sqlSessionFactory对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值