三种可用的插入方式:
1、反复执行单条插入语句
2、拼接sql
3、批处理执行
一、反复执行单挑插入语句
<insert id="insert" parameterType="java.util.List">
INSERT INTO tb_item VALUES
...
</insert>
反复获取数据库连接,性能低下
二、拼接sql
<insert id="insertByBatch" parameterType="java.util.List">
INSERT INTO tb_item VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.uniqueCode},#{item.createTime}</foreach>
</insert>
${}与#{}区别:
${},字符串拼接的方式,当数据过多时,${}的效率会远高于#{},但是要注意sql注入问题
三、批处理
@Transactional
public void add(List<Item> 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(i%1000==999){//每1000条提交一次防止内存溢出
session.commit();
session.clearCache();
}
}
session.commit();
session.clearCache();
}
推荐使用Mysql批处理方式进行批量的操作,需要注意,批处理不生效问题,需要加上rewriteBatchedStatements=true