例如,我有一个由用户名,电话号码和地址组成的Users实体。 我想从csv文件中读取所有这些字段并将其存储在数据库的相应表中吗?
有人可以通过描述如何帮助我吗?还是有任何有关此操作的文档?
答案 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/