java代码将csv格式的文件导入数据库
最近接到了一个需求,将csv文件的内容通过java进行入库操作,在此记录一下整个完整的代码
主要逻辑
读取csv的每一个数据,对数据对应的对象赋值,将对象放入集合中,因为数据量大,对list进行拆分,最后分批量入库操作,关键代码如下
1、pom.xml引入依赖
1.1 关于csvRead的依赖
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
1.2 关于Lists拆分集合的依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
2、bean
@Data
public class CsvData {
private Integer id;
private String name;
private String school;
}
3、controller层代码
@RestController
public Map<String,Object> CSVImport(String fileName){
//接收返回的数据返回给前端
HashMap<String,Object> result = new HashMap<String,Object>();
CsvData csvData =null;
CsvReader r;
try{
//放文件的位置
String cvsFilePath="磁盘地址"+fileName+".csv";
r = new CsvReader(cvsFilePath,',',Charset.forName("utf-8"));
//读取表头
boolean b = r.readHeaders();
ArrayList<CsvData> list = new ArrayList<CsvData>();
while(r.readRecord()){
csvData = new CsvData();
//注意,此处的id,name,school是csv文件里的列名
csvData.setId(Integer.parseInt(r.get("id")));
csvData.setName(r.get("name"));
csvData.setSchool(r.get("school"));
list.add(csvData);
}
//等份拆分list
List<List<CsvData>> partition = Lists.partition(list,150);
//将数据分批存入数据库
for(List<CsvData> eachList:partition){
csvDataService.insertBatch(eachList);
}
result.put("success","success");
list.clear();
r.close();
}catch(Exception e){
e.printStackTrace();
}
return result;
}
4、service.serviceImpl层省略
5、dao层
public interface CSVDataDao{
void insertBatch(@Param("list") List<CsvData> list);
}
6、Mapper.xml
<insert id="insertBatch" parameterType="csvData的包名">
insert into 数据库名.表名 (id,name,school)
values
<foreach collection ="list" item ="item" separator=",">
(#{item.id},#{item.name},#{item.school})
</foreach>
</insert>