如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot下的一种导出CSV文件的代码框架

将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?

Spring Boot 读取用户上传的 csv 文件

从 React 和 Spring Boot 上传 CSV 文件

在 Spring Boot 中自动将 Rest 控制器序列化为 CSV 而不是 JSON

在 Java Spring Boot 中将 CSV 转换为 JSON 数组