后端代码实现读取csv文件并存入数据库

Java,使用的是若依框架,直接给完整的代码,然后测试类有最好,只是其中的一个功能

有项目吗,直接发给我,给你加上你要的功能。

ok

pom依赖

<dependency>

        <groupId>cn.hutool</groupId>

        <artifactId>hutool-all</artifactId>

        <version>5.4.4</version>

</dependency>

代码

package com.ruoyi.web.controller.xxxxx;

import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.xxx.domain.*;
import com.ruoyi.xxx.service.*;
import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * CSV数据导入.
 *
 * @author China110
 * @version 2022/08/22
 */
@Slf4j
@RestController
@RequestMapping("/datainit")
public class DataInitController {

    public static final String[] searchList = {"\"", "\uFEFF"};
    public static final String[] replaceList = {"", ""};

    //初始化系统数据
    @Autowired
    private XxxService xxxService;
    @ApiOperation("导入xxx数据")
    @GetMapping("/xxx")
    public AjaxResult importXxx(String filePath) {
        if (StringUtils.isBlank(filePath)) {
            return AjaxResult.error("文件地址不能为空");
        }
        AtomicInteger add = new AtomicInteger();
        AtomicInteger update = new AtomicInteger();
        List<CsvRow> csvRows = this.readCsvFile(filePath);
        csvRows.forEach(row -> {
            List<String> rawList = row.getRawList();
            Room room = this.toRoom(rawList);
            if (roomService.getById(room.getId()) != null) {
                this.xxxService.updateById(room);
                update.addAndGet(1);
            } else {
                this.xxxService.save(room);
                add.addAndGet(1);
            }
        });
        log.info("新增xxx数据:{}", add.get());
        log.info("修改xxx数据:{}", update.get());
        return AjaxResult.success("数据处理完成");
    }
    /**
     * 读取 csv 文件
     */
    public static List<CsvRow> readCsvFile(String readCsvFilePath) {

        // 创建 CSV Reader 对象, 参数说明(读取的文件路径,分隔符,编码格式)
        CsvReader csvReader = new CsvReader(Paths.get(readCsvFilePath), StandardCharsets.UTF_8, null);
        // 读取除表头外的内容
        CsvData read = csvReader.read();
        return read.getRows();
    }

    public static Room toRoom(List<String> fields) {
        Xxx room = new Xxx();

        String idStr = StringUtils.replaceEach(stringValied(fields.get(0)), searchList, replaceList);
        String createDateStr = stringValied(fields.get(17));
        String creator = stringValied(fields.get(18));
        String updateDateStr = stringValied(fields.get(19));
        String updater = stringValied(fields.get(20));
        String deleteDateStr = stringValied(fields.get(21));
        String deleter = stringValied(fields.get(22));
        room.setId(Long.valueOf(idStr));
        room.setCreateDate(parseLocalDateTime(createDateStr, fmtHms));
        room.setCreator(creator);
        room.setUpdateDate(parseLocalDateTime(updateDateStr, fmtHms));
        room.setUpdater(updater);
        room.setDeleteDate(parseLocalDateTime(deleteDateStr, fmtHms));
        room.setDeleter(deleter);
        return room;
    }
    public static LocalDateTime parseLocalDateTime(String localDateTimeStr, DateTimeFormatter fmt) {
        if (StringUtils.isBlank(localDateTimeStr) || StringUtils.equalsAny(localDateTimeStr, "NULL", "null")) {
            return null;
        }
        LocalDateTime localDateTime = null;
        try {
            localDateTime = LocalDateTime.parse(localDateTimeStr, fmt);
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        } finally {
            return localDateTime;
        }
    }
    public static String stringValied(String param) {
        if (StringUtils.isBlank(param) || StringUtils.equalsAny(param, "NULL", "null")) {
            return null;
        }
        return param;
    }
}

很简单,如下:

package cn.util.controller;

import cn.util.entity.TlVacuumFurnaceLog;
import cn.util.service.vfService;
import cn.util.service.vfServiceImpl;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.SpringBeanContainer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Controller
public class testC {

    @Autowired
    private vfService vfService; // 对应的保存接口

    /**
     * 导入csv文件处理
     */
    @RequestMapping("/test1312")
    public void test1(){
        try {
            //  读取文件 “GBK”解决文件里中文乱码
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\真空炉日志20210407StatusLog.csv"), "GBK"));
            reader.readLine();//第一行信息是标题信息,跳过,如果需要第一行信息,请删除这行代码
            String line ;
            
            // 定义list,方便后面批次新增 TlVacuumFurnaceLog是表实体类
            List<TlVacuumFurnaceLog> result = new ArrayList<>();
            // 循环每行数据
            while ((line = reader.readLine()) != null) {
            // 分割字符串
                String item[] = line.split(",");
                if (item.length >0) {
                // 调用下面的方法,将每列数据赋值到对应的属性中,返回的结果新增到list内
                    result.add(propertiesAssignment(item));
                }
            }
            // 保存到数据库
            insertDB(result);
        } catch(Exception e){
            e.printStackTrace();
        }
    }


    /**
     * 将行数据中每列数据分别添加到对应的属性中,返回实体类
     */
    public TlVacuumFurnaceLog propertiesAssignment(String[] item) throws Exception{
        // 获取目标类class
        Class<TlVacuumFurnaceLog> clazz = TlVacuumFurnaceLog.class;
        // 实例化
        TlVacuumFurnaceLog tlVacuumFurnaceLog = clazz.newInstance();

        // 获取对象全部属性
        Field[] fields = clazz.getDeclaredFields();
        // 循环遍历 当前行数据的列数
        for (int i = 0; i < item.length; i++) {
            // 获取方法名
            String methodName = "set" + fields[i+1].getName().substring(0,1).toUpperCase() + fields[i+1].getName().substring(1);
            // 获取Method参数
            Method method = clazz.getMethod(methodName, fields[i+1].getType());
            // 判断当前属性是什么类型的,将数据进行类型转换
            if ("Integer".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Integer.parseInt(item[i]));
            } else if ("BigDecimal".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog, new BigDecimal(item[i]));
            } else if ("Short".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Short.valueOf(item[i]));
            } else if ("Double".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Double.valueOf(item[i]));
            } else if ("Byte".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,Byte.valueOf(item[i]));
            } else if ("String".equals(fields[i+1].getType().getSimpleName())){
                method.invoke(tlVacuumFurnaceLog,item[i]);
            }

        }

        return tlVacuumFurnaceLog;
        }


        /**
         * 保存数据到数据库
         */
        public void insertDB(List<TlVacuumFurnaceLog> tlVacuumFurnaceLogs){
           // 批量保存    
           vfService.saveBatch(tlVacuumFurnaceLogs);
        }
    }

需要注意的:
csv读取中文乱码,要加入“GBK”
invoke方法相当于第一个参数(对象)来调用method方法,第二个参数是set方法的值,类型要和setter方法类型一致,否则会报类型不匹配错误

Java,使用的是若依框架 , 为什么你不喜欢查看若依的API?
API里面提供了详细的操作方法

img

https://blog.csdn.net/qq_52785473/article/details/121916954JAVA使用JDBC插入数据库数据(十分方便好用,成功连接数据库后只需建相应的表填好路径和表名即可),这是我的博客,可以参考下