请教iBatis批量插入数据问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教iBatis批量插入数据问题相关的知识,希望对你有一定的参考价值。
参考技术A iBatis批量插入数据问题ibatis的批处理是指,将startBatch与executeBatch之间的语句一次一起提交执行,减少与数据库的交互数次,提高执行性能,如:sqlMapper.startBatch();要执行的语句……sqlMapper.executeBatch();不是你指的这样子用xml映射文件中的标签参数,还有就是你<insert id="member.batchInsert">也写错了,没有这样的写法,这个Id是用来dao层的映射用来执行crud操作的,<iterate>标签一般用于<select>标签的,它可以循环一个list或者map但循环出来的是一个对象,对象里面的属性是不可能直接循环出来的,它还没高级到能自动循环出的condition[].getName了
java批量插入数据库数据
在项目中往往需要一次向数据库中插入多条数据,如果使用for循环的方式插入,效率慢且资源消耗高
接下来看看如何批量将数据写入数据库中
一、Dao
ReportSampleDao.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<ReportSampleReqDto> samples);
二、Mapper
ReportSampleMapper.html文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.seewo.dao.dao.ReportSampleDao">
<insert id="batchAddSample">
INSERT INTO report_sample
(report_id, elapsed, label, response_code, response_message, url)
VALUES
<foreach collection="samples" item="sample" index="index" separator=",">
(
#sample.reportId,
#sample.elapsed,
#sample.label,
#sample.responseCode,
#sample.responseMessage,
#sample.url
)
</foreach>
</insert>
</mapper>
三、调用
ReportSampleImpl.java文件
@Resource
private ReportSampleDao reportSampleDao;
public Integer saveErrorSampleList(String reportId)
List<ReportSampleReqDto> 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,当然单参数也可
4.1 单参数List类型
collection的值为list时,对应的Mapper如下:
<select id="dynamicForeachTest" parameterType="java.util.List" resultType="Blog">
select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#item
</foreach>
</select>
测试代码:
@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代码
<select id="dynamicForeach2Test" parameterType="java.util.ArrayList" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#item
</foreach>
</select>
测试代码:
@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代码
<select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
select * from t_blog where title like "%"#title"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#item
</foreach>
</select>
测试代码:
@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();
以上是关于请教iBatis批量插入数据问题的主要内容,如果未能解决你的问题,请参考以下文章
oracle的批量插入和mysql的批量插入不一致,mybatis要怎么做兼容