这是运用kimi,cursor写出来的后端基础增删改查代码心得系列。
将从如何用cursor写出代码,修改cursor写出来的代码,连接数据库,上传下载代码等等方面展开。
第一集:
第二集:
上传代码:
/**
* 上传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表格的位置,可以自己去查询代码