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 Rest API が返されます。
Spring Boot Rest API は CSV ファイルを返します
リクエストを送信する場合/api/csv/ダウンロード
、サーバーは CSV ファイルで応答を返します。チュートリアル.csvMySQL テーブルのデータが含まれています。
これを行う方法?
HTTP ヘッダーを設定する必要があります。
"Content-disposition" : "attachment; filename=[yourFileName]" "Content-Type" : "application/csv"
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
プロジェクトの構造
これはこれから構築するプロジェクト ディレクトリです。
–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.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web org.apache.commons commons-csv 1.8 mysql mysql-connector-java runtime
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 を使用し、構成します
MySQL5InnoDBDialect
MySQLデータベース用 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データをデータベースに保存しますすべてのチュートリアルを取得
(): データベースからデータを読み取り、返します。リスト<チュートリアル>
サービス/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
。
使ってみましょう郵便屋さんいくつかのリクエストをするために。
最大ファイルサイズ (2MB) を超えるサイズのファイルをアップロードする場合:
結論
今日、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 アプリを AWS にデプロイする – Elastic Beanstalk
–Docker Compose: Spring Boot と MySQL の例
ソースコード
このチュートリアルの完全なソース コードは、次の場所にあります。ギットハブ。