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

Gun*_*eet 10 csv upload file spring-boot

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

任何人都可以通过描述如何做到这一点来帮助我吗?或者有没有关于如何做到这一点的文件?

Ser*_*scu 25

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

使用Spring可以很容易地解决这两个问题中的任何一个问题.

假设我们有以下实体:

@Data
@Entity
public class User {
    @Id
    private String username;
    private String phoneNumber;
    private String address;
}
Run Code Online (Sandbox Code Playgroud)

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

public interface UserRepository extends Repository<User, String> {
    void saveAll(List<User> users);
}
Run Code Online (Sandbox Code Playgroud)

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

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

这样,我们就可以创建一个简单的实用程序方法,它知道为给定的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们创建一个简单的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());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还需要一些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>
Run Code Online (Sandbox Code Playgroud)