Экспорт SqlRowSet в файл - PullRequest
       10

Экспорт SqlRowSet в файл

1 голос
/ 24 апреля 2019

Я хочу экспортировать результаты запроса SQL, запущенного через JDBC, в файл;и затем импортировать этот результат, в некоторый момент позже.

В настоящее время я делаю это, запрашивая базу данных через NamedParameterJdbcTemplate из Spring, который возвращает SqlRowSet, который я могу повторить.На каждой итерации я извлекаю нужные поля и выгружаю результат в файл CSV, используя PrintWriter.

final SqlRowSet rs = namedJdbcTemplate.queryForRowSet(sql,params);
while (rs.next()) {

. Проблема в том, что когда я читаю файл, они все Strings и мне нужно привести их к соответствующим типам, например Integer, String, 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();
}

Есть ли лучший способ экспортировать этот SqlRowSet вфайл, чтобы облегчить процесс импорта позже;какой-то способ сохранить схему для более легкой вставки в БД?

1 Ответ

0 голосов
/ 25 апреля 2019

Если вам нужен синтаксический анализ, один из способов справиться с этим:

  1. Создать интерфейс синтаксического анализатора Factory, скажем ParserFactory
  2. Создать интерфейс синтаксического анализа, скажем MyParser
  3. Реализация MyParser с использованием фабричного метода Pattern, то есть IntegerParser implements MyParser и т. Д.
  4. Имена классов фабрики должны быть в качестве заголовка в CSV

Таким образом, ваш код вызова будет выглядеть так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...