如何使用 Spring Boot 将 CSV 文件导入 MYSQL
Posted
技术标签:
【中文标题】如何使用 Spring Boot 将 CSV 文件导入 MYSQL【英文标题】:How to import a CSV file to MSSQL using Springboot 【发布时间】:2021-10-28 15:30:44 【问题描述】:我正在开发一个项目,该项目具有允许用户将文件(Excel 或 CSV)导入 DB (MsSQL) 的功能。我已经阅读了互联网上的教程并遵循了它们,但问题是我的一个实体包含一个对象。
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "question_bank")
public class QuestionBank implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String content;
@Column
private String explanation;
@Column
private String option1;
@Column
private String option2;
@Column
private String option3;
@Column
private String option4;
@Column
private String answer;
@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name = "status_id")
private Status status;
@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name = "levelId")
private QuizLevel quizLevel;
status_id 和 levelId 来自于连接其他表的其他列。这是我用来从 Excel 文件中设置数据的代码
questionBank.setAnswer(excelData.get(i));
questionBank.setContent(excelData.get(i + 1));
questionBank.setExplanation(excelData.get(i + 2));
questionBank.setOption1(excelData.get(i + 3));
questionBank.setOption2(excelData.get(i + 4));
questionBank.setOption3(excelData.get(i + 5));
questionBank.setOption4(excelData.get(i + 6));
questionBank.setStatus(Integer.valueOf(excelData.get(i + 8)));
questionBank.setCourse(Integer.valueOf(excelData.get(i + 9)));
questionBank.setQuizLevel(Integer.valueOf(excelData.get(i + 10)));
IDE 说最后 3 行 setStatus、setCourse 和 setQuizLevel 是错误的,因为 Entity QuestionBank 中没有类似的函数。
如何进行此导入,如果您正在阅读并为我提供解决方案,谢谢?
【问题讨论】:
可能是我解决这个添加数据的方法有问题,如果你们知道其他方法请帮忙,非常感谢 【参考方案1】:对于最后一个对象,我猜你必须构造一个 QuizLevel 的实例,用值填充它,然后将它传递给你的 setter。
我不知道您的 csv 的结构,但如果您隔离与 QuizLevel 相关的值,则将其传递给您的 QuestionBank 实例;
QuizLevel quizLevel= new QuizLevel();
quizLevel.setValue(myValueFromCsv)
quizLevel.setOtherValue(myOtherValueFromCSV)
questionBank.setQuizLevel(quizLevel);
setCourse 和 setStatus 也是如此。
【讨论】:
【参考方案2】:您必须创建 Status 和 Quizlevel 对象的实例,然后,您可以访问或设置这些对象的相应值。您不能简单地将值设置为对象。首先创建对象实例,然后设置或获取与该对象关联的值。 此示例可能会对您有所帮助:
Post post = new Post();
User user = userServiceImpl.getCurrentUser();
post.setTitle(title);
post.setContent(content);
post.setCreatedAt(time);
post.setAuthor(user.getName());
post.setPublishedAt(time);
post.setUpdatedAt(time);
post.setExcerpt(content);
post.setIsPublished(true);
post.setAuthorId(user.getId());
String[] tagsArray = tags.split(" ");
List<Tag> tagList = new ArrayList<Tag>();
for (String tag : tagsArray)
Tag tagObject = new Tag();
if (tagService.checkTagWithName(tag))
tagList.add(tagService.getTagByName(tag));
else
tagObject.setName(tag);
tagObject.setCreatedAt(time);
tagObject.setUpdatedAt(time);
tagList.add(tagObject);
post.setTags(tagList);
postService.savePost(post);
这是我在最后一个标签对象的帖子模型类:
@Table(name = "posts")
public class Post
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "title")
private String title;
@Column(name = "excerpt")
private String excerpt;
@Column(name = "content",columnDefinition="TEXT")
private String content;
@Column(name = "author")
private String author;
@Column(name = "published_at")
private Timestamp publishedAt;
@Column(name = "is_published")
private Boolean isPublished;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@Column(name = "authorId")
private Long authorId;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "post_tags",
joinColumns = @JoinColumn(name = "post_id" , referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id"))
private List<Tag> tags;
【讨论】:
以上是关于如何使用 Spring Boot 将 CSV 文件导入 MYSQL的主要内容,如果未能解决你的问题,请参考以下文章
将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?
从 React 和 Spring Boot 上传 CSV 文件