如何在数据库中批量插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在数据库中批量插入数据相关的知识,希望对你有一定的参考价值。

如何在数据库中批量插入数据,其中有日期字段,即根据日期进行循环,将一段时间内的各天插入数据

参考技术A 可以使用oracle sql loader批量导入数据:
 生成测试数据的EXCEL文件,把EXCEL文件另存为CSV(逗号分隔)(*.csv),控制文件设置为用逗号分隔。
  示例:
  LOAD DATA
  INFILE ‘d:\car.csv’
  APPEND INTO TABLE t_car_temp
  FIELDS TERMINATED BY ","
  (phoneno,vip_car)
  保存为input.ctl
  最后在命令行下输入:
  C:\>sqlldr userid=system/manager
  control=input.ctl(在unix环境下亦同)
  默认日志文件名为:input.log
  默认坏记录文件为:input.bad
参考技术B 你可以将两个日期之前的天数求出来,然后作为控制循环的次数,然后定义个起始日期,循环里对这个日期进行递增。
像下面这样 :
DECLARE
V_DATE DATE;
V_DAYS NUMBER;
V_DATE_BEGIN DATE;
V_DATE_END DATE;
BEGIN
V_DATE_BEGIN := TO_DATE('20101101',
'yyyymmdd');
V_DATE_END := TO_DATE('20100301',
'yyyymmdd');
V_DAYS := V_DATE_END - V_DATE_BEGIN;
FOR I IN 1 .. V_DAYS
LOOP
V_DATE := V_DATE_BEGIN + I;
insert into tablename values (v_days) ;
END LOOP;
END;本回答被提问者和网友采纳
参考技术C 只能循环插入数据, 参考技术D 应该使用insert into语句,我也是菜鸟一枚,只知道这么多咯

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();
 

以上是关于如何在数据库中批量插入数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 中的批量插入

mysql批量插入时,如何不插入重复数据

MySql批量插入时,如何不插入重复的数据

如何从 R 在 MongoDB 中批量插入文档?

mysql批量插入数据

批量插入数据