为了批量导入数据,采用了csv文件存储数据,后端写csv解析工具对数据进行读取和解析并导入数据库。
1、解析csv文件工具类(通用) public class CsvUtil { /** * 日志对象 */ private static final Logger LOGGER = LoggerFactory.getLogger(CsvUtil.class); /** * 解析csv文件并转成bean * @param file csv文件 * @param clazz 类 * @param 泛型 * @return 泛型bean集合 */ public List getCsvData(MultipartFile file, Class clazz) { InputStreamReader in; try { in = new InputStreamReader(file.getInputStream(), "gbk"); } catch (Exception e) { LOGGER.error(Constant.LOG_FOMAT_TYPE_TWO, ViasErrorCode.FILE_LOAD_ERROR.getErrorCode(), ViasErrorCode.FILE_LOAD_ERROR.getMessage(), e.getMessage()); throw BaseException.of(ViasErrorCode.FILE_LOAD_ERROR.of()); } HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy<>(); strategy.setType(clazz); CsvToBean csvToBean = new CsvToBeanBuilder(in) .withSeparator(',') .withQuoteChar('\'') .withMappingStrategy(strategy).build(); return csvToBean.parse(); } }
2、csv文件
3、csv文件对应的bean对象DataAndTypeCsv.java public class DataAndTypeCsv { /** * 字典代码 */ @CsvBindByName(column = "code") private String code; /** * 简写 */ @CsvBindByName(column = "short_name") private String shortName; /** * 名称 */ @CsvBindByName(column = "name", required = true) //是否可以为null 否 private String name; /** * 拼音或英文描述 */ @CsvBindByName(column = "remark") private String remark; /** * 父类型id */ @CsvBindByName(column = "parent_id") private Integer parentId; /** * 类型名称 */ @CsvBindByName(column = "type_name", required = true) //是否可以为null 否 private String typeName; /** * 类型id */ @CsvBindByName(column = "type_id", required = true) //是否可以为null 否 private Integer typeId; …… get、set方法 ……
bean对象通过注解@CsvBindByName(column = “”, required = true) 映射csv文件的列名,并检查列数据是否为空,若是csv文件中该列存在值为空的情况会报错。
4、应用
controller层定义restful接口: @Transactional(rollbackFor = BaseException.class) @PostMapping public Map batchInsert(MultipartFile file) { CsvUtil csvUtil = new CsvUtil(); // 将csv文件内容转成bean List csvData = csvUtil.getCsvData(file, DataAndTypeCsv.class); …… }
postman调用接口测试: