首页 > 数据库 >Java 有什么工具可以快速将CSV 存入关系型数据库

Java 有什么工具可以快速将CSV 存入关系型数据库

时间:2024-07-04 20:23:20浏览次数:17  
标签:Java batch springframework 存入 org import CSV public

在Java中,有多种工具和库可以快速将CSV文件的数据导入到数据库中。以下是几种常用的方法和工具:

1. 使用OpenCSV和JDBC

OpenCSV是一个非常流行的库,可以轻松读取和写入CSV文件。结合JDBC,可以将CSV文件的数据快速存储到数据库中。

示例代码

首先,添加OpenCSV库的依赖(假设使用Maven):

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.5.2</version>
</dependency>

然后,使用以下代码将CSV文件的数据存入数据库:

import com.opencsv.CSVReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class CsvToDatabase {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:postgresql://localhost:5432/yourdatabase";
        String username = "yourusername";
        String password = "yourpassword";
        String csvFilePath = "path/to/your/file.csv";

        Connection connection = null;

        try {
            connection = DriverManager.getConnection(jdbcURL, username, password);
            connection.setAutoCommit(false);

            String sql = "INSERT INTO your_table (column1, column2, column3) VALUES (?, ?, ?)";
            PreparedStatement statement = connection.prepareStatement(sql);

            CSVReader reader = new CSVReader(new FileReader(csvFilePath));
            String[] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                statement.setString(1, nextLine[0]);
                statement.setString(2, nextLine[1]);
                statement.setString(3, nextLine[2]);
                statement.addBatch();
            }

            statement.executeBatch();
            connection.commit();
            reader.close();
            statement.close();
            connection.close();

            System.out.println("CSV data has been inserted into the database successfully.");

        } catch (Exception e) {
            e.printStackTrace();
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

2. 使用Spring Batch

Spring Batch是一个强大的批处理框架,适合处理大规模数据导入操作。它可以通过配置文件定义批处理作业,并提供事务管理和重试机制。

示例代码

首先,添加Spring Batch和其他必要依赖(假设使用Maven):

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-core</artifactId>
    <version>4.3.4</version>
</dependency>
<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-infrastructure</artifactId>
    <version>4.3.4</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.5.2</version>
</dependency>

然后,创建一个Spring Batch配置类:

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.mapping.DelimitedLineTokenizer;
import org.springframework.batch.item.file.transform.LineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public DataSource dataSource;

    @Bean
    public FlatFileItemReader<YourEntity> reader() {
        return new FlatFileItemReaderBuilder<YourEntity>()
                .name("yourEntityItemReader")
                .resource(new ClassPathResource("path/to/your/file.csv"))
                .delimited()
                .names(new String[]{"column1", "column2", "column3"})
                .fieldSetMapper(new BeanWrapperFieldSetMapper<YourEntity>() {{
                    setTargetType(YourEntity.class);
                }})
                .build();
    }

    @Bean
    public JdbcBatchItemWriter<YourEntity> writer() {
        JdbcBatchItemWriter<YourEntity> writer = new JdbcBatchItemWriter<>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.setSql("INSERT INTO your_table (column1, column2, column3) VALUES (:column1, :column2, :column3)");
        writer.setDataSource(dataSource);
        return writer;
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<YourEntity> writer) {
        return stepBuilderFactory.get("step1")
                .<YourEntity, YourEntity>chunk(10)
                .reader(reader())
                .writer(writer)
                .build();
    }
}

在这个示例中:

  1. 定义了一个FlatFileItemReader来读取CSV文件。
  2. 定义了一个JdbcBatchItemWriter来将数据写入数据库。
  3. 创建了一个Job和Step,配置了批处理流程。

3. 使用其他第三方库

除了OpenCSV和Spring Batch,还有其他第三方库可以用于将CSV文件快速导入数据库,如Apache Commons CSV和Super CSV。结合这些库和JDBC,可以实现类似的功能。

结论

根据具体需求选择合适的工具或库。如果只是简单的批量插入,可以使用OpenCSV和JDBC。如果需要处理复杂的批处理任务和大规模数据导入,Spring Batch是一个强大的选择。无论选择哪种方法,都可以通过良好的错误处理和事务管理来确保数据导入的可靠性和一致性。

标签:Java,batch,springframework,存入,org,import,CSV,public
From: https://www.cnblogs.com/gongchengship/p/18284595

相关文章

  • 以银行卡取钱的流程为例的状态模式的 java 的 demo
    好的,下面我们将用状态模式来实现一个模拟从银行卡取钱的流程。假设我们有以下几个状态:输入卡输入密码选择操作取款取卡我们通过状态模式来实现这些状态之间的切换。状态接口首先,我们定义一个状态接口ATMState://ATMState.javapublicinterfaceATMState{void......
  • JavaScript中的异步模式
    JavaScript中的异步模式JavaScript语言的执行环境是“单线程(singlethread)”,就是指一次只能完成一个任务。如果有多个任务,就必须排队,等前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯,坏处是只要有一个任务耗时很长,后面的任务......
  • Java 如何连接 ElasticSearch
    在Java中连接Elasticsearch可以使用Elasticsearch提供的官方Java客户端。Elasticsearch官方提供的Java客户端有多种,其中最常用的是RestHighLevelClient。下面是使用RestHighLevelClient连接Elasticsearch的详细步骤。1.添加依赖首先,在你的项目中添加Elasticsearch客户端的依赖......
  • Java SSH 客户端 如何删除 linux 机器上的 文件
    在Java中,可以使用SSH客户端库如JSch(JavaSecureChannel)来连接到远程Linux机器并执行命令,包括删除文件。下面是一个使用JSch库的示例,展示如何通过SSH删除远程Linux机器上的文件。步骤:添加JSch库:确保您的项目包含JSch库。如果您使用的是Maven,可以在pom.xml......
  • Java28-反射
    目录概述学习反射到底学什么获取字节码文件对象的三种方式字节码文件和字节码文件对象获取构造方法获取构造方法并创建对象获取成员变量获取成员变量并获取值和修改值获取成员方法获取成员方法并运行练习泛型擦除修改字符串的内容反射和配置文件结合动态获取利......
  • Java 中Json中既有对象又有数组的参数 如何转化成对象
    1.示例一:解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象在Java中处理JSON数据,尤其是当JSON结构中既包含对象又包含数组时,常用的库有org.json、Gson和Jackson。这里我将以Gson为例来展示如何解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象。首先......
  • Java for循环倒序输出
    1.实现一个for循环的倒序输出在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现。下面,我将给出一个详细的示例,使用数组作为数据源,通过for循环倒序输出数组中的元素。这个示例不仅可以直接运行,而且具有一定......
  • 【如何判断动作事件是否由按钮引发】基于Java-GUI
    在刚刚写GUI的时候,我突然想到怎样去判断某一个事件源是由哪一个监听器响应的,所以我来整理后编写这次总结。(❁´◡`❁)❤当然首先得需要有一个按钮对象♥JButtonbt=newJButton();//创建按钮对象╰(*°▽°*)╯♥这里存在俩种情况♥如果按钮创建和判断方法在一......
  • Java中的JSON神器,如何轻松玩转复杂数据结构
    哈喽,大家好,我是木头左!一、揭秘JSON世界的基石在Java的世界中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,都离不开JSON的身影。那......
  • Java基础:线程的三种创建方式
    一、继承Thread类定义一个类继承线程类Thread重写run()方法创建线程对象调用线程对象的start()方法创建线程Thread类的常用APIsetName(Stringname):给线程取名字getName():获取线程的名字publicstaticThreadcurrentThread():获取当前线程对象,这个代码在哪个线程中就获......