在项目中往往需要一次向数据库中插入多条数据,如果使用for循环的方式插入,效率慢且资源消耗高
接下来看看如何批量将数据写入数据库中
一、DaoReportSampleDao.java文件
import com.seewo.module.report.dto.ReportSampleReqDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface ReportSampleDao {
void batchAddSample(@Param("samples") List samples);
}
二、Mapper
ReportSampleMapper.html文件
三、调用INSERT INTO report_sample (report_id, elapsed, label, response_code, response_message, url) VALUES ( #{sample.reportId}, #{sample.elapsed}, #{sample.label}, #{sample.responseCode}, #{sample.responseMessage}, #{sample.url} )
ReportSampleImpl.java文件
@Resource
private ReportSampleDao reportSampleDao;
public Integer saveErrorSampleList(String reportId){
List reportSamples = new ArrayList<>();
// ...
reportSampleDao.batchAddSample(reportSamples);
}
四、foreach collection的用法
foreach元素的属性主要有item,index,collection,open,separator,close
item:集合中每一个元素进行迭代时的别名index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置open:该语句以什么开始separator:在每次进行迭代之间以什么符号作为分隔符close:以什么结束
在使用foreach时最关键也最容易出错的是collection属性,该属性是必须指定的,在不同情况下collection属性的值不一样,有3种情况:
- 如果传入的是单参数且参数类型是一个List时,collection属性值为list如果传入的是单参数且参数类型是一个array数组时,collection的属性值为array如果传入的参数是多个时,需要把它们封装成一个Map,当然单参数也可
collection的值为list时,对应的Mapper如下:
select * from t_blog where id in #{item}
测试代码:
@Test
public void dynamicForeachTest() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
List ids = new ArrayList();
ids.add(1);
ids.add(3);
ids.add(6);
List blogs = blogMapper.dynamicForeachTest(ids);
for(Blog blog : blogs)
System.out.println(blog);
session.close();
}
4.2 单参数array数组类型
collection为array时,对应的Mapper代码
测试代码:
@Test
public void dynamicForeach2Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
int[] ids = new int[] {1,3,6,9};
List blogs = blogMapper.dynamicForeach2Test(ids);
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
4.3 参数封装成Map类型
collection的值为ids,是传入的参数Map的key,对应的Mapper代码
测试代码:
@Test
public void dynamicForeach3Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
final List ids = new ArrayList();
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(6);
ids.add(7);
ids.add(9);
Map params = new HashMap();
params.put("ids", ids);
params.put("title", "中国");
List blogs = blogMapper.dynamicForeach3Test(params);
for(Blog blog : blogs)
System.out.println(blog);
session.close();
}



