如何从csv文件读取数据并将其存储在数据库中?春季靴

时间:2018-06-22 11:32:24

标签: file csv spring-boot upload

例如,我有一个由用户名,电话号码和地址组成的Users实体。 我想从csv文件中读取所有这些字段并将其存储在数据库的相应表中吗?

有人可以通过描述如何帮助我吗?还是有任何有关此操作的文档?

2 个答案:

答案 0 :(得分:11)

我假设您希望用户从某个UI上传文件。根据构建UI的确切方式,您可以:

使用Spring可以很容易地解决这两个问题。

假设我们具有以下实体:

@Data
@Entity
public class User {
    @Id
    private String username;
    private String phoneNumber;
    private String address;
}

我们定义了一个Spring Data存储库来访问数据库:

public interface UserRepository extends Repository<User, String> {
    void saveAll(List<User> users);
}

对于CSV反序列化,我建议使用Jackson。 Jackson随附了Spring Boot,但我们需要在pom中添加CSV的数据格式扩展名:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
    </dependency>

这样,我们可以创建一个简单的实用程序方法,该方法知道为给定的POJO类读取CSV:

public class CsvUtils {
    private static final CsvMapper mapper = new CsvMapper();
    public static <T> List<T> read(Class<T> clazz, InputStream stream) throws IOException {
        CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
        ObjectReader reader = mapper.readerFor(clazz).with(schema);
        return reader.<T>readValues(stream).readAll();
    }
}

然后我们创建一个简单的Rest Controller来处理上载:

@RestController
public class UserController {
    private final UserRepository repository;

    public UserController(UserRepository repository) {
        this.repository = repository;
    }

    @PostMapping(value = "/upload", consumes = "text/csv")
    public void uploadSimple(@RequestBody InputStream body) {
        repository.saveAll(CsvUtils.read(User.class, body);
    }

    @PostMapping(value = "/upload", consumes = "multipart/form-data")
    public void uploadMultipart(@RequestParam("file") MultipartFile file) {
        repository.saveAll(CsvUtils.read(User.class, file.getInputStream());
    }
}

如果您还需要一些HTML来进行上传,则以下代码段是一个最小的工作示例:

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file" />
    <input type="submit" name="submit" value="Submit" />
</form>

答案 1 :(得分:0)

您可以使用openCSV轻松实现这一目标。 对于已知的POJO用户,您只需将CSV列(在您的情况下为标题)映射到POJO中的相应字段即可。

只需将以下内容添加到您的依赖项中,但是请为您的应用程序检查最新版本。

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

此链接指导您完成https://www.geeksforgeeks.org/mapping-csv-to-javabeans-using-opencsv/