项目需求,读取csv文件并将日志数据保存到数据库中:
首先,建表然后对应的xml、dao、实体类、service和实现类。
上实现代码:
package cn.util.controller;
import cn.util.entity.TlVacuumFurnaceLog;
import cn.util.service.vfService;
import cn.util.service.vfServiceImpl;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.SpringBeanContainer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Controller
public class testC {
@Autowired
private vfService vfService; // 对应的保存接口
/**
* 导入csv文件处理
*/
@RequestMapping("/test1312")
public void test1(){
try {
// 读取文件 “GBK”解决文件里中文乱码
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\真空炉日志20210407StatusLog.csv"), "GBK"));
reader.readLine();//第一行信息是标题信息,跳过,如果需要第一行信息,请删除这行代码
String line ;
// 定义list,方便后面批次新增 TlVacuumFurnaceLog是表实体类
List<TlVacuumFurnaceLog> result = new ArrayList<>();
// 循环每行数据
while ((line = reader.readLine()) != null) {
// 分割字符串
String item[] = line.split(",");
if (item.length >0) {
// 调用下面的方法,将每列数据赋值到对应的属性中,返回的结果新增到list内
result.add(propertiesAssignment(item));
}
}
// 保存到数据库
insertDB(result);
} catch(Exception e){
e.printStackTrace();
}
}
/**
* 将行数据中每列数据分别添加到对应的属性中,返回实体类
*/
public TlVacuumFurnaceLog propertiesAssignment(String[] item) throws Exception{
// 获取目标类class
Class<TlVacuumFurnaceLog> clazz = TlVacuumFurnaceLog.class;
// 实例化
TlVacuumFurnaceLog tlVacuumFurnaceLog = clazz.newInstance();
// 获取对象全部属性
Field[] fields = clazz.getDeclaredFields();
// 循环遍历 当前行数据的列数
for (int i = 0; i < item.length; i++) {
// 获取方法名
String methodName = "set" + fields[i+1].getName().substring(0,1).toUpperCase() + fields[i+1].getName().substring(1);
// 获取Method参数
Method method = clazz.getMethod(methodName, fields[i+1].getType());
// 判断当前属性是什么类型的,将数据进行类型转换
if ("Integer".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog,Integer.parseInt(item[i]));
} else if ("BigDecimal".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog, new BigDecimal(item[i]));
} else if ("Short".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog,Short.valueOf(item[i]));
} else if ("Double".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog,Double.valueOf(item[i]));
} else if ("Byte".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog,Byte.valueOf(item[i]));
} else if ("String".equals(fields[i+1].getType().getSimpleName())){
method.invoke(tlVacuumFurnaceLog,item[i]);
}
}
return tlVacuumFurnaceLog;
}
/**
* 保存数据到数据库
*/
public void insertDB(List<TlVacuumFurnaceLog> tlVacuumFurnaceLogs){
// 批量保存
vfService.saveBatch(tlVacuumFurnaceLogs);
}
}
csv文件:
保存的数据:
需要注意的:
- csv读取中文乱码,要加入“GBK”
- invoke方法相当于第一个参数(对象)来调用method方法,第二个参数是set方法的值,类型要和setter方法类型一致,否则会报类型不匹配错误