Spring Boot: CSV ファイルを MySQL データベースにアップロードして読み取る |マルチパート ファイル - BezKoder (2024)

CSV (カンマ区切り値) ファイルは、次の形式で説明されているデータを含むプレーン テキスト ファイルです。RFC4180。各行には、カンマで区切られたいくつかのフィールドがあります。ファイル全体で各行に同じ数のフィールドが含まれている必要があります。このチュートリアルでは、Spring Boot を使用して CSV ファイル データをアップロード、読み取り、MySQL データベースに保存する方法を説明します。Apache Commons CSV

関連記事:
Spring Boot マルチパート ファイルのアップロード例
Java Spring Bootで複数のファイルをアップロードする方法
Spring Boot データベースから CSV ファイルをダウンロードする例
- ドキュメンテーション:Spring Boot Swagger 3 の例

代わりに Excel ファイル:
Spring Boot: Excel ファイル データを MySQL データベースにアップロード/インポートする

導入:
Spring Boot アプリを AWS にデプロイする – Elastic Beanstalk
Docker Compose: Spring Boot と MySQL の例

コンテンツ

  • CSV ファイルをアップロードするための Spring Boot Rest API
  • Spring Boot Rest API は CSV ファイルを返します
  • テクノロジー
  • プロジェクトの構造
  • Spring Boot CSV ファイルのアップロード/ダウンロード プロジェクトのセットアップ
  • Spring データソース、JPA、Hibernate の構成
  • データモデルの定義
  • データベースを操作するためのデータ リポジトリを作成する
  • 読み取り/書き込み CSV ヘルパー クラスの実装
  • CSVファイル作成サービス
  • 応答メッセージの定義
  • CSV ファイルをアップロードするためのコントローラーの作成
  • サーブレット用のマルチパート ファイルの構成
  • ファイルアップロード例外の処理
  • 結論
  • 参考文献
  • ソースコード

CSV ファイルをアップロードするための Spring Boot Rest API

があると仮定します.csv次のようなチュートリアル データを含むファイル:

Id,Title,Description,Published1,Spring Boot Tut#1,Tut#1 説明,FALSE2,Spring Data Tut#2,Tut#2 説明,TRUE3,MySQL データベース Tut#3,Tut#3 説明,TRUE4,Hibernate Tut# 4,Tut#4 説明,FALSE5,Spring Cloud Tut#5,Tut#5 説明,TRUE6,マイクロサービス Tut#6,Tut#6 説明,FALSE7,MongoDB データベース Tut#7,Tut#7 説明,TRUE8,Spring Data JPAツタンカーメン#8,ツタンカーメン#8 説明,TRUE

以下の API を提供する Spring Boot アプリケーションを作成します。

  • CSV ファイルを Spring Server にアップロードし、データを MySQL データベースに保存する
  • MySQLテーブルから項目のリストを取得する
  • MySQL テーブル データを含む CSV ファイルのダウンロード

CSV ファイルが正常にアップロードされると、MySQL データベースのチュートリアル テーブルは次のようになります。

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (1)

チュートリアルのリストを取得すると、Spring Rest API が返されます。

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (2)

Spring Boot Rest API は CSV ファイルを返します

リクエストを送信する場合/api/csv/ダウンロード、サーバーは CSV ファイルで応答を返します。チュートリアル.csvMySQL テーブルのデータが含まれています。

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (3)

これを行う方法?
HTTP ヘッダーを設定する必要があります。

"Content-disposition" : "attachment; filename=[yourFileName]" "Content-Type" : "application/csv"

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (4)

CSV ファイルをダウンロードする手順については、チュートリアルで説明しています。
Spring Boot データベースから CSV ファイルをダウンロードする例

エクスポートされる API は次のとおりです。

メソッドURL行動
役職/api/csv/アップロードCSVファイルをアップロードする
得る/api/csv/チュートリアルデータベーステーブル内の項目のリストを取得します
得る/api/csv/ダウンロードDBデータをCSVファイルとしてダウンロード

テクノロジー

  • Java 8
  • Spring Boot 2 (Spring Web MVC を使用)
  • メイブン 3.6.1
  • Apache コモンズ CSV 1.8

プロジェクトの構造

これはこれから構築するプロジェクト ディレクトリです。

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (5)

CSVヘルパーCSVファイルの読み書き機能を提供します。

チュートリアルデータモデルクラスはエンティティとテーブルに対応しますチュートリアル
チュートリアルリポジトリを拡張するインターフェースですJPリポジトリデータを永続化するため。

CSVサービス用途CSVヘルパーチュートリアルリポジトリCSV データを MySQL に保存するメソッド、データをロードして CSV ファイルをエクスポートするメソッド、または MySQL テーブルからすべてのチュートリアルを取得するメソッド。

CSVコントローラー電話CSVサービスメソッドと Rest API のエクスポート: CSV ファイルをアップロードし、MySQL データベースからデータを取得します。

FileUploadExceptionアドバイスコントローラーがファイルのアップロードを処理するときに例外を処理します。

アプリケーションのプロパティSpring Data と Servlet Multipart ファイルの設定が含まれています。
pom.xmlSpring Boot、MySQL コネクタ、Apache Commons CSV 依存関係用。

Spring Boot CSV ファイルのアップロード/ダウンロード プロジェクトのセットアップ

使用Spring Webツールまたは開発ツール (スプリングツールスイート、日食、インテリジ) Spring Boot プロジェクトを作成します。

次に開きますpom.xmlこれらの依存関係を追加します。

org.springframework.bootspring-boot-starter-data-jpaorg.springframework.boot spring-boot-starter-weborg.apache.commonscommons-csv1.8mysqlmysql-connector-javaruntime

Spring データソース、JPA、Hibernate の構成

送信元/主要/資力フォルダ、開くアプリケーションのプロパティそしてこれらの行を書きます。

spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=falsespring.datasource.username= rootspring.datasource.password= 123456spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect# Hibernate ddl auto (作成、作成-ドロップ、検証、更新)spring.jpa.hibernate.ddl-auto= update
  • spring.datasource.ユーザー名&spring.datasource.パスワードプロパティはデータベースのインストールと同じです。
  • Spring Boot は JPA 実装に Hibernate を使用し、構成しますMySQL5InnoDBDialectMySQLデータベース用
  • spring.jpa.hibernate.ddl-autoデータベースの初期化に使用されます。値を次のように設定します。アップデート値を指定すると、定義されたデータ モデルに対応するテーブルがデータベースに自動的に作成されます。モデルに変更を加えると、テーブルの更新もトリガーされます。運用環境では、このプロパティは次のようにする必要があります。検証

データモデルの定義

私たちのデータ モデルは、ID、タイトル、説明、公開済みの 4 つのフィールドを持つチュートリアルです。
モデルパッケージを定義しますチュートリアルクラス。

モデル/チュートリアル.java

package com.bezkoder.spring.files.csv.model;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "チュートリアル")public class Tutorial { @Id @Column(name = "id") private long id; @Column(name = "title") private String タイトル; @Column(name = "説明") private String 説明; @Column(name = "published") private boolean 公開済み; public Tutorial() { } public Tutorial(long id, String title, String description, booleanpublished) { this.id = id; this.title = タイトル; this.description = 説明; this.published = 公開済み; public long getId() { ID を返します。 public void setId(long id) { this.id = id; } public String getTitle() { タイトルを返します。 public void setTitle(String title) { this.title = title; public String getDescription() { 説明を返します。 public void setDescription(String description) { this.description = 説明; public boolean isPublished() { 公開された値を返します。 public void setPublished(boolean isPublished) { this.published = isPublished; @Override public String toString() { return "チュートリアル [id=" + id + "、title=" + title + "、desc=" + description + "、published=" +published + "]"; }}

@実在物注釈は、クラスが永続的な Java クラスであることを示します。
@テーブル注釈は、このエンティティをマップするテーブルを提供します。
@Id注釈は主キー用です。
@桁注釈は、注釈付きフィールドをマップするデータベース内の列を定義するために使用されます。

データベースを操作するためのデータ リポジトリを作成する

データベースからチュートリアルを操作するためのリポジトリを作成しましょう。
リポジトリパッケージ化、作成チュートリアルリポジトリ拡張するインターフェースJPリポジトリ

リポジトリ/TutorialRepository.java

パッケージ com.bezkoder.spring.files.csv.repository;import org.springframework.data.jpa.repository.JpaRepository;import com.bezkoder.spring.files.csv.model.Tutorial;パブリック インターフェイス TutorialRepository は JpaRepository を拡張します{}

これで、JpaRepository のメソッドを使用できるようになりました。保存()findOne()findById()すべて検索()カウント()消去()deleteById()…これらのメソッドを実装せずに。

CSV ファイル内の行数 (またはチュートリアルtable) は大きくなる可能性があるため、このリポジトリをページネーションで動作するように変更して、一度に複数のみを取得したい場合があります。手順は次の場所にあります。

この JPA リポジトリの単体テストを作成する方法も次の場所にあります。
@DataJpaTest を使用した JPA リポジトリの Spring Boot 単体テスト

読み取り/書き込み CSV ヘルパー クラスの実装

次のような Apache Commons CSV クラスを使用します。CSVパーサーCSVレコードCSV形式
CSV ファイルを読み取る手順をまとめます。

  • 作成バッファリーダーから入力ストリーム
  • 作成CSVパーサーからバッファリーダーCSV形式
  • 反復処理するCSVレコードによってイテレーターCsvParser.getRecords()
  • それぞれからCSVレコード、 使用CSVRecord.get()フィールドの読み取りと解析
BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));CSVParser csvParser = new CSVParser(fileReader, CSVFormat.DEFAULT...);Iterable csvRecords = csvParser.getRecords();for (CSVRecord) csvRecord : csvRecords) { チュートリアルtutorial = new Tutorial( Long.parseLong(csvRecord.get("Id")), csvRecord.get("タイトル"), csvRecord.get("説明"), Boolean.parseBoolean(csvRecord.get (「公開済み」)) );チュートリアルリスト.add(チュートリアル);}

ヘルパーパッケージ、私たちが作成しますCSVヘルパー3 つのメソッドを持つクラス:

  • hasCSVFormat(): ファイルが CSV 形式であるかどうかを確認します
  • csvToTutorials(): 読む入力ストリームファイルの場合は、チュートリアルのリストを返します

ここに完全なコードがありますヘルパー/CSVHelper.java:

パッケージ com.bezkoder.spring.files.csv.helper;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java .util.ArrayList;import java.util.List;import org.apache.commons.csv.CSVFormat;import org.apache.commons.csv.CSVParser;import org.apache.commons.csv.CSVRecord;import org.springframework。 web.multipart.MultipartFile;import com.bezkoder.spring.files.csv.model.Tutorial;public class CSVHelper { public static String TYPE = "text/csv"; static String[] HEADERs = { "Id", "Title", "Description", "Published" }; public static boolean hasCSVFormat(MultipartFile file) { if (!TYPE.equals(file.getContentType())) { return false; true を返します。 public static List csvToTutorials(InputStream is) { try (BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8")); CSVParser csvParser = new CSVParser(fileReader, CSVFormat.DEFAULT.withFirstRecordAsHeader(). withIgnoreHeaderCase().withTrim());) { List チュートリアル = new ArrayList(); Iterable csvRecords = csvParser.getRecords(); for (CSVRecord csvRecord : csvRecords) { チュートリアル チュートリアル = new Tutorial( Long.parseLong(csvRecord.get("Id")), csvRecord.get("タイトル"), csvRecord.get("説明"), Boolean.parseBoolean( csvRecord.get("公開")) );チュートリアル.add(チュートリアル);チュートリアルを返します。 catch (IOException e) { throw new RuntimeException("CSV ファイルの解析に失敗しました: " + e.getMessage()); } }}

CSVファイル作成サービス

CSVサービスサービスクラスには次の注釈が付けられます@サービスアノテーションを使用しますCSVヘルパーチュートリアルリポジトリ2つの機能の場合:

  • 保存(MultipartFile ファイル): CSVデータをデータベースに保存します
  • すべてのチュートリアルを取得(): データベースからデータを読み取り、返します。リスト&ltチュートリアル>

サービス/CSVService.java

パッケージ com.bezkoder.spring.files.csv.service;import java.io.IOException;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import com.bezkoder.spring.files.csv.helper.CSVHelper;import com.bezkoder.spring.files.csv.model.Tutorial;import com.bezkoder.spring.files.csv .repository.TutorialRepository;@Servicepublic class CSVService { @Autowired TutorialRepository リポジトリ; public void save(MultipartFile file) { try { List チュートリアル = CSVHelper.csvToTutorials(file.getInputStream());リポジトリ.saveAll(チュートリアル); catch (IOException e) { throw new RuntimeException("CSV データの保存に失敗しました: " + e.getMessage()); public List getAllTutorials() { return repository.findAll(); }}

応答メッセージの定義

応答メッセージこれは、Rest コントローラーと例外ハンドラーで使用するクライアントへのメッセージ用です。

メッセージ/応答メッセージ.java

package com.bezkoder.spring.files.csv.message;public class ResponseMessage { private String メッセージ; public ResponseMessage(String message) { this.message = メッセージ; public String getMessage() { メッセージを返します。 public void setMessage(String message) { this.message = メッセージ; }}

CSV ファイルをアップロードするためのコントローラーの作成

コントローラパッケージ、私たちが作成しますCSVコントローラーレストアピスのクラス。
@CrossOrigin許可されるオリジンを構成するためのものです。
@コントローラ注釈は、これがコントローラーであることを示します。
@GetMapping@PostMappingアノテーションは、HTTP GET および POST リクエストを特定のハンドラー メソッドにマッピングするためのものです。

  • POST /アップロード:ファイルをアップロードする()
  • GET /チュートリアル:getAllTutorials()

- を使用しております@Autowiredの実装を注入するCSVサービスBean をローカル変数に変換します。

コントローラ/CSVコントローラー.java

パッケージ com.bezkoder.spring.files.csv.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity ;インポート org.springframework.stereotype.Controller;インポート org.springframework.web.bind.annotation.CrossOrigin;インポート org.springframework.web.bind.annotation.GetMapping;インポート org.springframework.web.bind.annotation.PostMapping;インポートorg.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.multipart.MultipartFile;import com.bezkoder.spring.files.csv.service.CSVService ;import com.bezkoder.spring.files.csv.helper.CSVHelper;import com.bezkoder.spring.files.csv.message.ResponseMessage;import com.bezkoder.spring.files.csv.model.Tutorial;@CrossOrigin(" http://localhost:8081")@Controller@RequestMapping("/api/csv")public class CSVController { @Autowired CSVService fileService; @PostMapping("/upload") public ResponseEntity UploadFile(@RequestParam("file") MultipartFile file) { String message = ""; if (CSVHelper.hasCSVFormat(file)) { try { fileService.save(file); message = "ファイルが正常にアップロードされました: " + file.getOriginalFilename(); return ResponseEntity.status(HttpStatus.OK).body(新しい ResponseMessage(メッセージ)); } catch (例外 e) { message = "ファイルをアップロードできませんでした: " + file.getOriginalFilename() + "!"; return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message)); message = "csv ファイルをアップロードしてください!"; return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(新しいResponseMessage(メッセージ)); } @GetMapping("/tutorials") public ResponseEntity> getAllTutorials() { try { List チュートリアル = fileService.getAllTutorials(); if (tutorials.isEmpty()) { return new ResponseEntity<>(HttpStatus.NO_CONTENT);新しい ResponseEntity<>(チュートリアル、HttpStatus.OK) を返します。 catch (Exception e) { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } }}

サーブレット用のマルチパート ファイルの構成

アップロードできる最大ファイルサイズを定義しましょうアプリケーションのプロパティ次のように:

spring.servlet.multipart.max-file-size=2MBspring.servlet.multipart.max-request-size=2MB
  • spring.servlet.multipart.max-file-size: 各リクエストの最大ファイル サイズ。
  • spring.servlet.multipart.max-request-size: multipart/form-data の最大リクエスト サイズ。

ファイルアップロード例外の処理

ここで、リクエストが最大アップロード サイズを超えた場合に対処します。システムはスローしますMaxUploadSizeExceededExceptionそして私たちは使うつもりです@ControllerAdvice@ExceptionHandler例外を処理するためのアノテーション。

例外/FileUploadExceptionAdvice.java

パッケージ com.bezkoder.spring.files.csv.Exception;import org.springframework.web.multipart.MaxUploadSizeExceededException;import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;import com.bezkoder.spring.files。 csv.message.ResponseMessage;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvicepublic class FileUploadExceptionAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public ResponseEntityhandleMaxSizeException(MaxUploadSizeExceededException exc) { return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage("ファイルが大きすぎます!")); }}

実行してチェックする

次のコマンドで Spring Boot アプリケーションを実行します。mvn spring-boot:run

使ってみましょう郵便屋さんいくつかのリクエストをするために。

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (6)

最大ファイルサイズ (2MB) を超えるサイズのファイルをアップロードする場合:

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (7)

結論

今日、Spring Boot を使用して CSV ファイルをアップロードして読み取り、Mysql データベースにデータを保存する Rest CRUD API を構築しました。

Apache Commons CSV を使用して CSV ファイルでデータを読み書きする方法についても説明します。JPリポジトリ定型コードを必要とせずにデータベーステーブル内の項目を取得します。

この Spring アプリケーションにページネーションを追加する場合は、次の場所に手順があります。

CSVファイルをダウンロードする場合:
Spring Boot データベースから CSV ファイルをダウンロードする例

代わりに Excel ファイルをアップロードします。
Spring Boot: Excel ファイル データを MySQL データベースにアップロード/インポートする

または、ファイルを BLOB としてデータベースにアップロードします。
Spring Boot のデータベースへのファイルのアップロード/データベースからのファイルのダウンロードの例

Spring Boot: Upload & Read CSV file into MySQL Database | Multipart File - BezKoder (8)

楽しく学習しましょう!またね。

参考文献

導入:
Spring Boot アプリを AWS にデプロイする – Elastic Beanstalk
Docker Compose: Spring Boot と MySQL の例

ソースコード

このチュートリアルの完全なソース コードは、次の場所にあります。ギットハブ

Spring Boot: CSV ファイルを MySQL データベースにアップロードして読み取る |マルチパート ファイル - BezKoder (2024)
Top Articles
Latest Posts
Article information

Author: Lakeisha Bayer VM

Last Updated:

Views: 6529

Rating: 4.9 / 5 (69 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Lakeisha Bayer VM

Birthday: 1997-10-17

Address: Suite 835 34136 Adrian Mountains, Floydton, UT 81036

Phone: +3571527672278

Job: Manufacturing Agent

Hobby: Skimboarding, Photography, Roller skating, Knife making, Paintball, Embroidery, Gunsmithing

Introduction: My name is Lakeisha Bayer VM, I am a brainy, kind, enchanting, healthy, lovely, clean, witty person who loves writing and wants to share my knowledge and understanding with you.