3后端JAVA:上传EXCEL表格数据到数据库?代码

这是运用kimi,cursor写出来的后端基础增删改查代码心得系列。

将从如何用cursor写出代码,修改cursor写出来的代码,连接数据库,上传下载代码等等方面展开。


第一集: 

后端JAVA:Cursor与kimi如何结合?Cursor写出的代码出现哪些bug?-优快云博客

第二集:

2后端JAVA:下载数据库数据到EXCEL表格?代码-优快云博客


 

上传代码:

/**
     * 上传Excel表格数据
     * 总情况:从Excel文件中读取数据并保存到数据库
     * @param file Excel文件
     * @return 操作结果
     * @throws IOException 文件读取异常
     */
    @Transactional
    @PostMapping("/importExcel")
    @ApiOperation("上传Excel表格数据")
    public Boolean importExcel(MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();
        ExcelReader reader = ExcelUtil.getReader(inputStream);

        reader.addHeaderAlias("序号","Id");
        reader.addHeaderAlias("所在校区","campus");
        reader.addHeaderAlias( "坐落地址","address");
        reader.addHeaderAlias("房产名称(铺位号)","propertyName" );
        reader.addHeaderAlias("租户","tenantName" );
        reader.addHeaderAlias( "联系电话","contactNumber");
        reader.addHeaderAlias("租户信息","tenantInfo" );
        reader.addHeaderAlias("房屋面积(平方米)","area");
        reader.addHeaderAlias("合同年限","contractDuration");
        reader.addHeaderAlias("合同编码","contractCode");
        reader.addHeaderAlias("合同总金额","totalContractAmount" );
        reader.addHeaderAlias("合同期起","contractStartDate");
        reader.addHeaderAlias("合同期止","contractEndDate");
        reader.addHeaderAlias("应收租金年份","yearOfRentReceivable" );
        reader.addHeaderAlias("本次应收租金期起","rentalPeriodStart" );
        reader.addHeaderAlias("本次应收租金期止","rentalPeriodEnd");
        reader.addHeaderAlias( "本次应收租金","currentRentReceived");
        reader.addHeaderAlias("本次实收租金","currentRentDue" );
        reader.addHeaderAlias("本次未收租金","currentRentUnpaid");
        reader.addHeaderAlias("收取租金时间","rentReceivedDate");
        reader.addHeaderAlias("备注","remarks" );
        reader.addHeaderAlias("已上交学校租金","rentSubmittedToSchool");
        reader.addHeaderAlias("未上交学校租金","rentNotSubmittedToSchool" );
        reader.addHeaderAlias("租金上交学校时间","rentSubmissionDate" );
        reader.addHeaderAlias("应交押金","requiredDeposit" );
        reader.addHeaderAlias("已交押金","paidDeposit");
        reader.addHeaderAlias("押金进账日期","depositEntryDate" );

        List<ImportDTO> list = reader.readAll(ImportDTO.class);
        contractsService.saveContracts(list); // 插入数据
        return true;
    }

这里要注意的事项是:

1. reader.addHeaderAlias("序号","Id");   先写序号,再写Id

2.要有对应的实体类

package com.ams;

import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDate;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImportDTO {
    @TableId
    private Integer Id;
    private Integer propertyId;
    private Integer tenantId;
    private Integer contractId;
    private Integer rentalsId;


    private String contractCode;
    private LocalDate contractStartDate;
    private LocalDate contractEndDate;
    private Long contractDuration;
    private BigDecimal requiredDeposit;
    private BigDecimal paidDeposit;
    private LocalDate depositEntryDate;
    private BigDecimal totalContractAmount;


    private String campus;
    private String address;
    private String propertyName;
    private BigDecimal area;

    private LocalDate rentalPeriodStart;
    private LocalDate rentalPeriodEnd;
    private BigDecimal currentRentDue;
    private BigDecimal currentRentUnpaid;
    private BigDecimal currentRentReceived;
    private LocalDate rentReceivedDate;
    private String remarks;
    private BigDecimal rentSubmittedToSchool;
    private BigDecimal rentNotSubmittedToSchool;
    private LocalDate rentSubmissionDate;
    private String yearOfRentReceivable;

    private String tenantName;
    private String contactNumber;
    private String tenantInfo;

} 

3.对应的ServiceImpl,Service层

insert 就是最简单的mapper insert语句,这里不作展开

特别提醒,这里的contract 是最后才插入,这里还要将其他表的id也插入进去。

这里总的来看是一个多表插入形式。 

/**
     * 保存从Excel导入的合同信息
     * 总情况:将从Excel文件中读取的合同信息保存到数据库
     * @param importDTOs 导入的合同数据列表
     */
    void saveContracts(List<ImportDTO> importDTOs);
 /**
     * 保存从Excel导入的合同信息
     * 总情况:将从Excel文件中读取的合同信息保存到数据库
     * @param importDTOs 导入的合同数据列表
     */
    @Transactional
    @Override
    public void saveContracts(List<ImportDTO> importDTOs) {
        for (ImportDTO dto : importDTOs) {
            // 插入 Tenants
            Tenants tenant = Tenants.builder()
                    .tenantId(dto.getId())
                    .tenantName(dto.getTenantName())
                    .contactNumber(dto.getContactNumber())
                    .tenantInfo(dto.getTenantInfo())
                    .build();
            tenantsMapper.insert(tenant);

            // 插入 Properties
            Properties property = Properties.builder()
                    .propertyId(dto.getId())
                    .campus(dto.getCampus())
                    .address(dto.getAddress())
                    .propertyName(dto.getPropertyName())
                    .area(dto.getArea())
                    .build();
            propertiesMapper.insert(property);

            // 插入 Rentals
            Rentals rental = Rentals.builder()
                    .rentalId(dto.getId())
                    .rentalPeriodStart(dto.getRentalPeriodStart())
                    .rentalPeriodEnd(dto.getRentalPeriodEnd())
                    .currentRentDue(dto.getCurrentRentDue())
                    .currentRentUnpaid(dto.getCurrentRentUnpaid())
                    .rentReceivedDate(dto.getRentReceivedDate())
                    .remarks(dto.getRemarks())
                    .rentSubmittedToSchool(dto.getRentSubmittedToSchool())
                    .rentNotSubmittedToSchool(dto.getRentNotSubmittedToSchool())
                    .rentSubmissionDate(dto.getRentSubmissionDate())
                    .yearOfRentReceivable(dto.getYearOfRentReceivable())
                    .currentRentReceived(dto.getCurrentRentReceived())
                    .build();

            rentalsMapper.insert(rental);


            // 插入 Contracts
            Contracts contract = Contracts.builder()
                    .contractCode(dto.getContractCode())
                    .contractId(dto.getId())
                    .propertyId(dto.getId()) // 假设 propertyId 是自增的
                    .tenantId(dto.getId()) // 假设 tenantId 是自增的
                    .rentalsId(dto.getId()) // 假设 rentalId 是自增的
                    .contractStartDate(dto.getContractStartDate())
                    .contractEndDate(dto.getContractEndDate())
                    .contractDuration(dto.getContractDuration())
                    .requiredDeposit(dto.getRequiredDeposit())
                    .paidDeposit(dto.getPaidDeposit())
                    .depositEntryDate(dto.getDepositEntryDate())
                    .totalContractAmount(dto.getTotalContractAmount())
                    .build();


            contractsMapper.insert(contract);

        }
    }

 4.这里是contract的插入

/**
     * 插入新的合同信息
     * 总情况:添加新的合同记录到数据库
     * @param contract 合同对象
     */
    void insert(Contracts contract);
 <!-- 插入新合同 -->
    <insert id="insert" parameterType="com.ams.Contracts">
        INSERT INTO contracts
        (contractId, propertyId, tenantId, rentalsId,
         totalContractAmount, contractStartDate,
         contractEndDate, requiredDeposit,
         paidDeposit, depositEntryDate,
         contractDuration, contractCode)
        VALUES
            (#{contractId}, #{propertyId}, #{tenantId}, #{rentalsId},
             #{totalContractAmount}, #{contractStartDate},
             #{contractEndDate}, #{requiredDeposit},
             #{paidDeposit}, #{depositEntryDate},
             #{contractDuration}, #{contractCode})
    </insert>

 5.这里特别提醒,因为是从excel表格上传数据到数据库,excel表格中不能有其他多余的操作,比如excel表格里经常会出现,从多少×到多少这些公式什么的,都不能存在,不然会影响代码执行。因此,表格只能是最朴素的样子。

如果不清楚表格该是什么状态,可以从上一集下载下来的表格去观察

关于上传和下载还可以指定excel表格的位置,可以自己去查询代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值