最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot接收excel數(shù)據(jù)文件去重方式

 更新時(shí)間:2024年12月12日 14:55:59   作者:jzx-sdjz  
文章主要介紹了如何在Spring?Boot中實(shí)現(xiàn)文件上傳并入庫的功能,包括讀取Excel文件、生成Entity對象、使用MergeInto語句進(jìn)行數(shù)據(jù)庫操作以及注意事項(xiàng)

springboot接收excel數(shù)據(jù)文件去重

1.創(chuàng)建測試表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL COMMENT '學(xué)號',
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `year` int(11) NOT NULL COMMENT '年份',
  `level` tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '等級',
  PRIMARY KEY (`id`, `name`, `year`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2.生產(chǎn)測試文檔

3.springboot接收文件并入庫

接收到上傳的模板文件后,首先讀取首行進(jìn)行字段名稱判斷,然后一行行的讀取excel表格中的數(shù)據(jù),生成entity對象。

如果入庫的數(shù)組大小超過1000,那就入庫一次,然后入庫使用的類似oracle的merge into語句的ON DUPLICATE KEY UPDATE

注意事項(xiàng):

  1. 因?yàn)闇y試樣例數(shù)據(jù)量小,上傳文件大小限制在springboot中沒有設(shè)置
  2. 生成的excel字段學(xué)號和年份單元格格式應(yīng)該設(shè)置為數(shù)值
    @Autowired
    private OperateDao operateDao;

    @PostMapping(value = "/add/tax")
    public String insertTaxData(@RequestParam("file") MultipartFile file) {
        try {
            String filename = file.getOriginalFilename();
            System.out.println(filename);
            InputStream tps = (file.getInputStream());
            final XSSFWorkbook tpWorkbook = new XSSFWorkbook(tps);

            Sheet sheet = tpWorkbook.getSheetAt(0);
            Row headerRow = sheet.getRow(0);
            if (headerRow.getCell(0).getStringCellValue().equals("學(xué)號")
                    && headerRow.getCell(1).getStringCellValue().equals("姓名")
                    && headerRow.getCell(2).getStringCellValue().equals("年份")
                    && headerRow.getCell(3).getStringCellValue().equals("等級")
            ) {
                int i = 1;
                boolean flag = true;
                List<StudentEntity> entityList = new ArrayList<>();
                StudentEntity studentEntity;
                while (flag) {
                    Row row = sheet.getRow(i++);
                    if (row != null) {
                        studentEntity = new StudentEntity();
                        Cell id = row.getCell(0);
                        Cell name = row.getCell(1);
                        Cell year = row.getCell(2);
                        Cell level = row.getCell(3);
                        studentEntity.setId((int) id.getNumericCellValue());
                        studentEntity.setName(name.getStringCellValue());
                        studentEntity.setYear((int) year.getNumericCellValue());
                        studentEntity.setLevel( level.getStringCellValue());
                        entityList.add(studentEntity);
                    } else {
                        flag = false;
                    }
                    if (entityList.size() > 1000) {
                        int rs = operateDao.addOrUpdateBatchTax(entityList);
                        System.out.println(rs);
                        entityList.clear();
                    }
                }
                if (entityList.size() > 0) {
                    operateDao.addOrUpdateBatchTax(entityList);
                }
                tps.close();
            } else {
                return "檢查模板是否正確";
            }
        } catch (IOException e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return "success";
    }
@Mapper
public interface OperateDao {
    Integer addOrUpdateBatchTax(List<StudentEntity> list);
}
<?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.test.springboot.dao.OperateDao">
    <insert id="addOrUpdateBatchTax" parameterType="java.util.List">
        INSERT INTO `student`(`id`, `name`, `year`, `level`)
        VALUES
        <foreach collection="list" item="tax" index="index" separator=",">
            (#{tax.id},#{tax.name},#{tax.year},#{tax.level})
        </foreach>
        ON DUPLICATE KEY UPDATE
        level =VALUES ( `level` )
    </insert>

</mapper>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)實(shí)時(shí)彈幕的示例代碼

    SpringBoot實(shí)現(xiàn)實(shí)時(shí)彈幕的示例代碼

    實(shí)時(shí)彈幕系統(tǒng)已成為現(xiàn)代視頻網(wǎng)站和直播平臺的標(biāo)準(zhǔn)功能,它讓觀眾可以在觀看視頻時(shí)發(fā)送即時(shí)評論,本文將介紹如何使用SpringBoot構(gòu)建一個(gè)實(shí)時(shí)彈幕系統(tǒng),需要的可以了解下
    2025-06-06
  • @FeignClient之name,value,url詳解

    @FeignClient之name,value,url詳解

    在FeignClient中,`name`用于指定服務(wù)的名稱,通常與服務(wù)注冊中心中的服務(wù)名關(guān)聯(lián),而`url`用于指定請求的基礎(chǔ)URL,適用于不使用服務(wù)注冊的場景,如果同時(shí)配置了`name`和`url`,則`url`會優(yōu)先生效,Feign會直接使用`url`指定的地址
    2024-11-11
  • Spring Boot集成JWT實(shí)現(xiàn)無狀態(tài)認(rèn)證與授權(quán)方式

    Spring Boot集成JWT實(shí)現(xiàn)無狀態(tài)認(rèn)證與授權(quán)方式

    本文介紹了如何在SpringBoot中集成JWT實(shí)現(xiàn)無狀態(tài)認(rèn)證與授權(quán),主要步驟包括添加依賴、配置JWT工具類、配置SpringSecurity、創(chuàng)建JWT請求過濾器、創(chuàng)建認(rèn)證和授權(quán)接口、創(chuàng)建用戶詳情服務(wù)以及配置JWT密鑰,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 創(chuàng)建SpringBoot項(xiàng)目的全過程

    創(chuàng)建SpringBoot項(xiàng)目的全過程

    文章介紹了如何在IDEA專業(yè)版中創(chuàng)建SpringBoot項(xiàng)目,并通過一個(gè)簡單的示例展示了如何使用SpringBoot輸出"hello,Springboot"
    2025-03-03
  • Java虛擬機(jī)運(yùn)行時(shí)棧的棧幀

    Java虛擬機(jī)運(yùn)行時(shí)棧的棧幀

    本節(jié)將會介紹一下Java虛擬機(jī)棧中的棧幀,會對棧幀的組成部分(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口)分別進(jìn)行介紹,最后還會通過javap命令反解析編譯后的.class文件,進(jìn)行分析方法執(zhí)行時(shí)的局部變量表、操作數(shù)棧等
    2021-09-09
  • Java普通類、抽象類、接口的應(yīng)用和區(qū)別解析

    Java普通類、抽象類、接口的應(yīng)用和區(qū)別解析

    本文詳細(xì)對比了Java普通類、抽象類和接口的區(qū)別,從定義關(guān)鍵字、繼承或?qū)崿F(xiàn)關(guān)鍵字、成員字段和方法等方面進(jìn)行分析,感興趣的朋友跟隨小編一起看看吧
    2026-06-06
  • Java Collection集合遍歷運(yùn)行代碼實(shí)例

    Java Collection集合遍歷運(yùn)行代碼實(shí)例

    這篇文章主要介紹了Java Collection集合遍歷運(yùn)行代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句詳解

    Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句詳解

    這篇文章主要為大詳細(xì)介紹了Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    這篇文章主要為大家介紹了Elasticsearch算分優(yōu)化方案之rescore_query示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java版給愛人表白的玫瑰花程序代碼

    Java版給愛人表白的玫瑰花程序代碼

    這篇文章主要講解了Java版給愛人表白的玫瑰花程序代碼,具有很好的參考價(jià)值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05

最新評論

宜兴市| 张掖市| 临沂市| 东乡县| 治多县| 兴城市| 泸溪县| 哈巴河县| 颍上县| 根河市| 岗巴县| 运城市| 喀喇沁旗| 利津县| 遂昌县| 张掖市| 栖霞市| 甘泉县| 大竹县| 南溪县| 信宜市| 梁河县| 霍邱县| 安康市| 荔波县| 东乌珠穆沁旗| 军事| 普兰县| 永康市| 克什克腾旗| 安康市| 珲春市| 柳州市| 上林县| 镇康县| 崇仁县| 华容县| 郸城县| 丁青县| 绍兴县| 日土县|