Mysql8.0-load data用法【保存大量数据】:
1.查看数据库是否已开启load data:
SHOW GLOBAL VARIABLES LIKE ‘local_infile’;
2.开启load data:
set global local_infile=1;
3.项目数据源上添加参数:
springboot-mysql配置:&allowLoadLocalInfile=true
4.例子【反射+Load data】:
java代码:
private void saveData(List<BalanceExcelImportDTO> list) {
final File loadDataFile = new File(IdUtil.fastSimpleUUID() + "-temp-create.txt");
final FileWriter fileWriter = FileWriter.create(loadDataFile);
final StringBuilder builder = new StringBuilder();
balanceList.forEach(balance -> {
ReportProfitCostVO profitCostVO = reportConvert.toReportProfitCostVo(balance);
// 通过反射获取类的属性字段【ps:此处实体属性修饰符为 “public” 】
final Class<ReportProfitCostVO> clazz = ReportProfitCostVO.class;
final Field[] fields = clazz.getFields();
for (Field field : fields) {
try {
final Object value = field.get(profitCostVO);
if (value != null) {
builder.append(value);
}
builder.append("||");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
if (builder.length() > 0) {
builder.deleteCharAt(builder.length() - 1);
builder.deleteCharAt(builder.length() - 1);
}
builder.append("\n");
fileWriter.append(builder.toString());
builder.setLength(0);
});
frsReportProfitDetailTempService.saveBatchByLoadData(loadDataFile);
loadDataFile.deleteOnExit();
}
Mapper层:
void insertBatchByLoadData(@Param("path") String absolutePath);
sql:
<insert id="insertBatchByLoadData">
LOAD DATA LOCAL INFILE #{path,jdbcType=VARCHAR} INTO TABLE 表名
CHARACTER SET utf8
FIELDS TERMINATED BY '||'
LINES TERMINATED BY '\n'
(
字段,
字段,
...
)
</insert>