我想将通过JDBC触发的SQL查询的结果导出到文件中;然后稍后再导入该结果。
我当前正在通过NamedParameterJdbcTemplate
中的Spring
查询数据库来执行查询,该查询返回一个SqlRowSet
我可以迭代。在每次迭代中,我都提取所需的字段,然后使用CSV
将结果转储到PrintWriter
文件中。
final SqlRowSet rs = namedJdbcTemplate.queryForRowSet(sql,params);
while (rs.next()) {
问题是,当我读回文件时,它们都是String
,我需要将它们转换为正确的类型,例如Integer
,String
,{{1 }}等
Date
是否有更好的方法将此while (line != null) {
String[] csvLine = line.split(";");
Object[] params = new Object[14];
params[0] = csvLine[0];
params[1] = csvLine[1];
params[2] = Integer.parseInt(csvLine[2]);
params[3] = csvLine[3];
params[4] = csvLine[4];
params[5] = Integer.parseInt(csvLine[5]);
params[6] = Integer.parseInt(csvLine[6]);
params[7] = Long.parseLong(csvLine[7]);
params[8] = formatter.parse(csvLine[8]);
params[9] = Integer.parseInt(csvLine[9]);
params[10] = Double.parseDouble(csvLine[10]);
params[11] = Double.parseDouble(csvLine[11]);
params[12] = Double.parseDouble(csvLine[12]);
params[13] = Double.parseDouble(csvLine[13]);
batchParams.add(params);
line = reader.readLine();
}
导出到文件中,以方便以后的导入过程;某种方式存储模式以便更轻松地插入数据库?
答案 0 :(得分:0)
如果您担心解析,那么一种解决方法是
Factory
界面,例如说ParserFactory
MyParser
MyParser
,即Pattern
等实现了IntegerParser implements MyParser
。这样,您的调用代码看起来像
List<String> headerRow = reader.readLine().split(";"); // Get the 1st row here
Map<String, MyParser> parsers = new HashMap<>();
for(int i = 0; i < headerRow.length(); i++) {
if(!parser.containsKey(headerRow[i]))
parsers.put(headerRow[i], ParserFactory.get(headerRow[i]));
}
line = reader.readLine();
while (line != null) { // From 2nd row onwards
String[] row = line.split(";");
Object[] params = new Object[row.length()];
for(int i = 0; i<row.length(); i++) {
params[i] = parser.get(headerRow[i]).parse(row[i]);
}
batchParams.add(params);
line = reader.readLine();
}
您可能希望将解析器映射的创建提取到它自己的方法中。或者让您的ParserFactory
以headerRow
作为参数,并返回相应的解析器。像
List<String> headerRow = reader.readLine().split(";"); // Get the 1st row here
Map<String, MyParser> parsers = ParserFactory.getParsers(headerRow);