為了批量導(dǎo)入數(shù)據(jù),采用了csv文件存儲數(shù)據(jù),后端寫csv解析工具對數(shù)據(jù)進行讀取和解析并導(dǎo)入數(shù)據(jù)庫。
pom依賴:
<!-- csv文件解析依賴 -->
<dependency>
? ? <groupId>com.opencsv</groupId>
? ? <artifactId>opencsv</artifactId>
? ? <version>4.3.2</version>
</dependency>
1、解析csv文件工具類(通用)
public class CsvUtil {
? ? /**
? ? * 日志對象
? ? */
? ? private static final Logger LOGGER = LoggerFactory.getLogger(CsvUtil.class);
? ? /**
? ? * 解析csv文件并轉(zhuǎn)成bean
? ? * @param file csv文件
? ? * @param clazz 類
? ? * @param <T> 泛型
? ? * @return 泛型bean集合
? ? */
? ? public <T> List<T> getCsvData(MultipartFile file, Class<T> clazz) {
? ? ? ? InputStreamReader in;
? ? ? ? try {
? ? ? ? ? ? in = new InputStreamReader(file.getInputStream(), "gbk");
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? LOGGER.error(Constant.LOG_FOMAT_TYPE_TWO,
? ? ? ? ? ? ? ? ? ? ErrorCode.FILE_LOAD_ERROR.getErrorCode(),
? ? ? ? ? ? ? ? ? ? ErrorCode.FILE_LOAD_ERROR.getMessage(),
? ? ? ? ? ? ? ? ? ? e.getMessage());
? ? ? ? ? ? throw BaseException.of(ErrorCode.FILE_LOAD_ERROR.of());
? ? ? ? }
? ? ? ? HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
? ? ? ? strategy.setType(clazz);
? ? ? ? CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(in)
? ? ? ? ? ? ? ? .withSeparator(',')
? ? ? ? ? ? ? ? .withQuoteChar('\'')
? ? ? ? ? ? ? ? .withMappingStrategy(strategy).build();
? ? ? ? return csvToBean.parse();
? ? }
}
3、csv文件對應(yīng)的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文件的列名,并檢查列數(shù)據(jù)是否為空,若是csv文件中該列存在值為空的情況會報錯。
4、應(yīng)用
controller層定義restful接口:
@Transactional(rollbackFor = BaseException.class)
@PostMapping
public Map<String, String> batchInsert(MultipartFile file) {
? ? CsvUtil csvUtil = new CsvUtil();
? ? // 將csv文件內(nèi)容轉(zhuǎn)成bean
? ? List<DataAndTypeCsv> csvData = csvUtil.getCsvData(file, DataAndTypeCsv.class);
? ? ……
}