请教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种情况:

  1. 如果传入的是单参数且参数类型是一个List时,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组时,collection的属性值为array
  3. 如果传入的参数是多个时,需要把它们封装成一个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批量插入数据问题的主要内容,如果未能解决你的问题,请参考以下文章

ibatis批量插入怎么做

oracle的批量插入和mysql的批量插入不一致,mybatis要怎么做兼容

java批量插入数据库数据

ibatis 批量插入oracle总结

ibatis使用iterate实现批量插入insert正确写法

Mybatis+Oracle --批量插入