工具類-csv文件導入數據庫思路

首先,讓我們來看下數據庫建表語句:

CREATE TABLE behavior_reports (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '報告ID',report_type VARCHAR(50) NOT NULL COMMENT '報告類型(daily, weekly, monthly)',start_date DATE NOT NULL COMMENT '開始日期',end_date DATE NOT NULL COMMENT '結束日期',total_users INT DEFAULT 0 COMMENT '總用戶數',active_users INT DEFAULT 0 COMMENT '活躍用戶數',total_visits INT DEFAULT 0 COMMENT '總訪問量',avg_duration INT DEFAULT 0 COMMENT '平均停留時長(秒)',bounce_rate DECIMAL(5,2) DEFAULT 0 COMMENT '跳出率(%)',conversion_rate DECIMAL(5,2) DEFAULT 0 COMMENT '轉化率(%)',retention_rate DECIMAL(5,2) DEFAULT 0 COMMENT '留存率(%)',report_data JSON COMMENT '詳細報告數據',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',INDEX idx_report_type (report_type),INDEX idx_date_range (start_date, end_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='行為分析報告表';

然后,引入依賴opencsv

        <dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.7.1</version></dependency></dependencies>

實現步驟

1、創建一個工具類CsvImportUtil

package com.useranalysis.util;import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
import com.useranalysis.entity.BehaviorReport;
import com.useranalysis.mapper.BehaviorReportMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;/*** CSV 數據導入工具類* 用于將 CSV 文件數據導入到數據庫中*/
@Slf4j
@Component
@RequiredArgsConstructor
public class CsvImportUtil {private final BehaviorReportMapper behaviorReportMapper;/*** 導入行為分析報告數據* @param csvFilePath CSV 文件路徑* @return 導入的記錄數*/public int importBehaviorReports(String csvFilePath) {int importCount = 0;//1、借助CSVReader讀取CSV文件try (CSVReader reader = new CSVReader(new FileReader(csvFilePath))) {// 2、跳過CSV文件的表頭reader.readNext();//3、逐行解析 CSV 文件,把每行數據轉換為 BehaviorReport 對象。String[] line;List<BehaviorReport> reports = new ArrayList<>();//4、把解析后的 BehaviorReport 對象添加到列表中while ((line = reader.readNext()) != null) {try {BehaviorReport report = parseBehaviorReport(line);reports.add(report);importCount++;//5、每100條記錄批量插入一次if (reports.size() >= 100) {behaviorReportMapper.batchInsert(reports);reports.clear();}} catch (Exception e) {log.error("解析行數據失敗: {}", String.join(",", line), e);}}//6、插入剩余不足100條的記錄if (!reports.isEmpty()) {behaviorReportMapper.batchInsert(reports);}log.info("成功導入 {} 條行為分析報告數據", importCount);} catch (IOException | CsvValidationException e) {log.error("導入 CSV 文件失敗: {}", csvFilePath, e);throw new RuntimeException("導入 CSV 文件失敗", e);}//7、返回導入的記錄數return importCount;}/*** 解析單行 CSV 數據為 BehaviorReport 對象* @param line CSV 行數據* @return BehaviorReport 對象*/private BehaviorReport parseBehaviorReport(String[] line) {DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");DateTimeFormatter timestampFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//創建 BehaviorReport 對象BehaviorReport report = new BehaviorReport();//設置 BehaviorReport 對象的屬性report.setId(Long.parseLong(line[0]));report.setReportType(line[1]);report.setStartDate(LocalDate.parse(line[2], dateFormatter));report.setEndDate(LocalDate.parse(line[3], dateFormatter));report.setTotalUsers(Integer.parseInt(line[4]));report.setActiveUsers(Integer.parseInt(line[5]));report.setTotalVisits(Integer.parseInt(line[6]));report.setAvgDuration(Integer.parseInt(line[7]));report.setBounceRate(new BigDecimal(line[8]));report.setConversionRate(new BigDecimal(line[9]));report.setRetentionRate(new BigDecimal(line[10]));report.setReportData(line[11]);report.setCreatedAt(LocalDateTime.parse(line[12], timestampFormatter));//返回 BehaviorReport 對象return report;}
} 

2、創建實體類BehaviorReport

package com.useranalysis.entity;import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.math.BigDecimal;@Data
@NoArgsConstructor
@AllArgsConstructor
public class BehaviorReport {private Long id;private String reportType;private LocalDate startDate;private LocalDate endDate;private Integer totalUsers;private Integer activeUsers;private Integer totalVisits;private Integer avgDuration;private BigDecimal bounceRate;private BigDecimal conversionRate;private BigDecimal retentionRate;private String reportData;private LocalDateTime createdAt;
} 

3、創建mapper接口BehaviorReportMapper

package com.useranalysis.mapper;import com.useranalysis.entity.BehaviorReport;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface BehaviorReportMapper {/*** 批量插入行為分析報告數據* @param reports 報告數據列表* @return 插入的記錄數*/int batchInsert(@Param("reports") List<BehaviorReport> reports);
} 

4、創建xml映射BehaviorReportMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.useranalysis.mapper.BehaviorReportMapper"><insert id="batchInsert" parameterType="java.util.List">INSERT INTO behavior_reports (id, report_type, start_date, end_date, total_users, active_users,total_visits, avg_duration, bounce_rate, conversion_rate,retention_rate, report_data, created_at) VALUES <foreach collection="reports" item="report" separator=",">(#{report.id}, #{report.reportType}, #{report.startDate},#{report.endDate}, #{report.totalUsers}, #{report.activeUsers},#{report.totalVisits}, #{report.avgDuration}, #{report.bounceRate},#{report.conversionRate}, #{report.retentionRate}, #{report.reportData},#{report.createdAt})</foreach></insert>
</mapper> 

使用方法

1、首先,確保已經創建了數據庫表

2、在需要導入數據的地方調用

@Autowired
private CsvImportUtil csvImportUtil;// 在需要導入數據的地方調用
String csvFilePath = "src/main/resources/static/CSV_test/behavior_reports.csv";
int importCount = csvImportUtil.importBehaviorReports(csvFilePath);

csv直接導入數據庫中

1、創建數據庫表

2、編寫測試類或controller接口

測試類CsvImportTest

package com.useranalysis;import com.useranalysis.util.CsvImportUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;@SpringBootTest
@ActiveProfiles("test")
public class CsvImportTest {@Autowiredprivate CsvImportUtil csvImportUtil;@Testpublic void testImportCsv() {// CSV文件路徑String csvFilePath = "src/main/resources/static/CSV_test/behavior_reports.csv";// 導入數據int importCount = csvImportUtil.importBehaviorReports(csvFilePath);// 打印導入結果System.out.println("成功導入 " + importCount + " 條記錄");}
} 

controller接口CsvImportController

package com.useranalysis.controller;import com.useranalysis.util.CsvImportUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/csv")
@RequiredArgsConstructor
public class CsvImportController {private final CsvImportUtil csvImportUtil;@PostMapping("/import")public ResponseEntity<String> importCsv() {try {String csvFilePath = "src/main/resources/static/CSV_test/behavior_reports.csv";int importCount = csvImportUtil.importBehaviorReports(csvFilePath);return ResponseEntity.ok("成功導入 " + importCount + " 條記錄");} catch (Exception e) {return ResponseEntity.internalServerError().body("導入失敗:" + e.getMessage());}}
} 

3、使用命令執行

運行測試類

mvn test -Dtest=CsvImportTest

通過api接口導入

curl -X POST http://localhost:8080/api/csv/import

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73832.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件工程之軟件開發模型(瀑布、迭代、敏捷、DevOps)

1. 瀑布模型&#xff08;Waterfall Model&#xff09; 定義與流程 瀑布模型是線性順序的開發流程&#xff0c;包含需求分析、設計、編碼、測試、維護等階段&#xff0c;每個階段完成后才能進入下一階段&#xff0c;類似“瀑布流水”逐級推進。 核心特點 嚴格階段劃分&#…

FreeRTOS與RT-Thread內存分配對比分析

一、動態內存分配策略 ?FreeRTOS ?分配算法多樣性&#xff1a;提供5種動態內存管理算法&#xff08;heap_1至heap_5&#xff09;&#xff0c;覆蓋從簡單到復雜的場景。例如&#xff1a; heap_1&#xff1a;僅支持分配不支持釋放&#xff0c;適用于固定任務棧分配。heap_4&…

202519 | Mybatis-Plus

快速入門 MyBatis-Plus&#xff08;簡稱 MP&#xff09;是 MyBatis 的增強工具&#xff0c;它在 MyBatis 的基礎上只做增強不做改變&#xff0c;簡化了開發&#xff0c;提高了效率。以下是 MyBatis-Plus 的快速入門指南&#xff0c;幫助您快速上手使用。 1. 環境準備 JDK&…

Linux C語言調用第三方庫,第三方庫如何編譯安裝

在 Linux 環境下使用 C 語言調用第三方庫時&#xff0c;通常需要先對第三方庫進行編譯和安裝。以下為你詳細介紹一般的編譯安裝步驟&#xff0c;并給出不同類型第三方庫&#xff08;如使用 Makefile、CMake 構建系統&#xff09;的具體示例。 一般步驟 1. 獲取第三方庫源碼 …

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解壓 &#xff0c;打包 語法&#xff1a;tar [主選項輔選項] 文件或者目錄 使用該命令時&#xff0c;主選項是必須要有的&#xff0c;它告訴tar要做什么事情&#xff0c;輔選項是輔助使用的&#xff0c;可以選用。 主選項&#xff1a; c 創建新的檔案文件。如果用戶想備…

Python 序列構成的數組(對序列使用+和_)

對序列使用和* Python 程序員會默認序列是支持 和 * 操作的。通常 號兩側的序列由 相同類型的數據所構成&#xff0c;在拼接的過程中&#xff0c;兩個被操作的序列都不會被 修改&#xff0c;Python 會新建一個包含同樣類型數據的序列來作為拼接的結果。 如果想要把一個序列…

[ C語言 ] | 從0到1?

目錄 認識計算機語言 C語言 工欲善其事必先利其器 第一個C語言代碼 這一些列 [ C語言 ] &#xff0c;就來分享一下 C語言 相關的知識點~ 認識計算機語言 我們說到計算機語言&#xff0c;語言&#xff0c;就是用來溝通的工具&#xff0c;計算機語言呢&#xff1f;就是我們…

【通道注意力機制】【SENet】Squeeze-and-Excitation Networks

0.論文摘要 卷積神經網絡建立在卷積操作的基礎上&#xff0c;通過融合局部感受野內的空間和通道信息來提取有意義的特征。為了增強網絡的表示能力&#xff0c;最近的一些方法展示了增強空間編碼的好處。在本研究中&#xff0c;我們專注于通道關系&#xff0c;并提出了一種新穎…

kubernetes Calico(CNI) NetworkPolicy 流量管理 設置networkpolicy 策略 下集

1、kubernetes 網絡策略&#xff08;網絡隔離策略&#xff09; Network Policy 是 Kubernetes 中用于控制 Pod 之間網絡通信的一種機制。它通過定義規則&#xff0c;限制哪些 Pod 或外部實體可以與目標 Pod 通信&#xff08;基于標簽、命名空間、端口等&#xff09;。Network …

sqlmap基礎命令總結

?注意事項:僅用于授權測試&#xff0c;避免非法使用。 目錄 ?一、基礎命令 ?二、數據庫信息獲取 ?三、繞過 WAF/IDS ?四、文件系統與系統命令 ?五、高級功能與優化 ?六、實戰示例 ?一、基礎命令 ?檢測注入點 sqlmap -u "http://target.com/index.php?id1&…

Unity光線傳播體積(LPV)技術實現詳解

一、LPV技術概述 光線傳播體積(Light Propagation Volumes)是一種實時全局光照技術&#xff0c;通過將場景中的間接光信息存儲在3D網格中&#xff0c;實現動態物體的間接光照效果。 核心優勢&#xff1a; 實時性能&#xff1a;相比傳統光照貼圖&#xff0c;支持動態場景 硬件…

SpringBoot (一) 自動配置原理

目錄 一 自動配置 1:數據源的手動配置 1:SpringBoot的自動配置 二 自動配置的完整流程&#xff1a;&#xff08;底層&#xff09; 1. 場景化依賴與Starter機制 2. 主程序入口與注解驅動 3. 自動配置類的加載與篩選 4. 自動配置類的實現邏輯 5. 自動配置的觸發與執行流…

OJ題:移動零

雙指針法 c 語言實現 void moveZeroes(int* nums, int numsSize) {int dest,cur; //創建臨時指針和目標指針destcur0;//出初始化while(cur<numsSize)//遍歷{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立兩個指針&#xff0…

pycharm終端操作遠程服務器

pycharm項目已經連接了遠程服務器&#xff0c;但是打開終端&#xff0c;卻依舊顯示的是本地的那個環境&#xff0c;也就是說沒有操作遠程的那個環境。只能再使用Xshell去操作遠程環境&#xff0c;很麻煩&#xff0c;找了下教程。 來源&#xff1a;https://blog.csdn.net/maolim…

(頭歌作業—python)3.2 個人所得稅計算器(project)

第1關&#xff1a;個人所得稅計算器 任務描述 本關任務&#xff1a;編寫一個個人所得稅計算器的小程序。 相關知識 個人所得稅繳納標準 2018 年 10 月 1 日以前&#xff0c;個稅免征額為 3500 元/月&#xff0c;調整后&#xff0c;個稅免征額為 5000 元/月&#xff0c; 7 級超…

Redis場景問題1:緩存穿透

Redis 緩存穿透是指在緩存系統&#xff08;如 Redis&#xff09;中&#xff0c;當客戶端請求的數據既不在緩存中&#xff0c;也不在數據庫中時&#xff0c;每次請求都會直接穿透緩存訪問數據庫&#xff0c;從而給數據庫帶來巨大壓力&#xff0c;甚至可能導致數據庫崩潰。下面為…

CUDA Memory Fence 函數的功能與硬件實現細節

CUDA Memory Fence 函數的功能與硬件實現細節 Memory Fence 的基本功能 CUDA中的memory fence函數用于控制內存操作的可見性順序&#xff0c;確保在fence之前的內存操作對特定范圍內的線程可見。主要功能包括&#xff1a; 排序內存操作&#xff1a;確保fence之前的內存操作在…

實戰篇Redis

黑馬程序員的Redis的筆記&#xff08;后面補一下圖片&#xff09; 【黑馬程序員Redis入門到實戰教程&#xff0c;深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive編程:什么是Reactive編程?Reactive編程思想

文章目錄 **1. Reactive編程概述****1.1 什么是Reactive編程&#xff1f;****1.1.1 Reactive編程的定義****1.1.2 Reactive編程的歷史****1.1.3 Reactive編程的應用場景****1.1.4 Reactive編程的優勢** **1.2 Reactive編程的核心思想****1.2.1 響應式&#xff08;Reactive&…

異步轉同步,實現一個消息隊列

有一個場景&#xff0c;需要實現一個消息隊列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其實考察的是怎么用同步的方式實現異步。 本文總結了四種方式實現&#xff1a;常規嵌套、prom…