当接到业务需求为为每张表的内容导出到csv文件时,导出功能其实并不难做,这里可以参考Java导出CSV文件 - 废物大师兄 - 博客园。
问题是,当有大量的表需要导出时,对每张表起一个线程进行操作实际上是很复杂的,而且不具备很高的复用性,因此能将导出的方法再进行一次封装,使其具备更高的重用性是有必要的。
ResultSetMetaData resultSetMetaData =resultSet.getMetaData();
int a = resultSetMetaData.getColumnCount();//返回字段数
resultSetMetaData.getColumnTypeName(i+1));返回字段类型
FileOutputStream fos =new FileOutputStream("文件地址");
OutputStreamWriter osw =new OutputStreamWriter(fos,"GBK");
CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(replace);//注意,这里的replace实际上是一个String数组类型,因为withHeader方法内的参数实际上不固定,这个方法是为我们写的csv文件表头,因为我们每张表的字段不一样,所以用数组存字段,再将其放入参数是一个好办法。
CSVPrinter csvPrinter =new CSVPrinter(osw,csvFormat);
//设置初始的数组,目前包含的表最多有四十个字段左右
String[] s = new String[42];
//初始化数组
for(int i = 0; i<s.length;i++){
s[i] = "";
}
//将字段名与字段类型相对应
Map<String,String> map = new HashMap<>();//这里的map是为了将字段名和字段类型做一个对应
for(int i = 0;i<a;i++){
s[i]=resultSetMetaData.getColumnName(i+1);
map.put(s[i],resultSetMetaData.getColumnTypeName(i+1));
}
//截取数组,多余的值不要,否则会报CSV栏目名重复错误
String[] replace =new String[a+1];
for(int i =0;i<a;i++){
replace[i] = s[i];
}
while(resultSet.next()) {
for (int i =0; i < a; i++) {
if (map.get(replace[i]) =="VARCHAR") {
replace[i] =resultSet.getString(replace[i]);
}else if (map.get(replace[i]) =="INT") {
replace[i] = String.valueOf(resultSet.getInt(replace[i]));
}else if (map.get(replace[i]) =="DATETIME")
replace[i] =resultSet.getString(replace[i]);
}
csvPrinter.printRecord(replace);
System.out.println("导出一条数据");
}
//碰到一个大坑,记录一下
在while(resultset.next){
}中,应该将数组新建在循环内部,要不然只会得到第一条数据
网友评论