Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение данных из xml и запись их в БД 
:(
    Опции темы
Grelloo
Дата 29.6.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Ситуация следующая:
Ко мне приходит xml, я распарсиваю его и получаю
property, value, type
Пример: property = "Name", value = "Dima", type = "String"
Создаю массивы этих данных property[], value[], type[] и засовываю в ArrayList. Далее эти массивы разбираю с помощью PreparedStatement и засовываю в БД
     
Код

   String sql = "insert into "+table+" (";
        try {
        for(int i=0; i<list.size(); i++){
            sql = sql + property[i] + ", ";
        }
        sql = sql.substring(0, sql.length()-2) + ") values (";
        for(int i=0; i<list.size(); i++){
            sql = sql + "?, ";
        }
        sql = sql.substring(0, sql.length()-2) + ")";
        System.out.println(sql);
        PreparedStatement ps = c.prepareStatement(sql);
        for(int i=0; i<list.size(); i++){
            System.out.print(data[i] + " ");
            ps.setObject(i+1, data[i]);
        }
            int p = ps.executeUpdate();


Это работает, но хотелось бы чего-то менее грамоздкого  

Это сообщение отредактировал(а) Grelloo - 29.6.2006, 15:20
PM MAIL ICQ   Вверх
powerOn
Дата 29.6.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Ты используешь PreparedStatement, так зачем же несколько раз его создавать? PreparedStatement - это преварительно компилируемый запрос, создай его один раз:

Код

PreparedStatement ps = c.prepareStatement("insert into ? (?,?) values (?,?)");


а в цикле только значения подставляй. К примеру:

Код

PreparedStatement ps = c.prepareStatement("insert into ? (?, ?) values (?, ?)");

ps.setString(1, tableName);
ps.setString(2, prorertyColunm);
ps.setString(3, valueColunm);

for(int i = 0 ; i < recordCount; i++) {
     ps.setString(4, property[i]);
     ps.setString(5, value[i]);
     ps.executeUpdate();
}


так можно избавиться от грамозких операций со сложением строк.

  

Это сообщение отредактировал(а) MoonCat - 29.6.2006, 15:57


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
batigoal
Дата 29.6.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Grelloo, 
Цитата(MoonCat @  29.6.2006,  16:56 Найти цитируемый пост)
так можно избавиться от грамозких операций со сложением строк.

...которые, к тому же, очень вредны, потому что их планы не кешируются на уровне БД. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Grelloo
Дата 29.6.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Property должны быть в качестве названий столбцов и их чило заранее неизвестно, а здесь
Код

ps.setString(2, prorertyColunm);
ps.setString(3, valueColunm);

совсем другие столбцы property и values
База выглядит следующим образом
property1 property2 .. propertyN
value 1     value2      .. valueN
value 1     value2      .. valueN 
PM MAIL ICQ   Вверх
batigoal
Дата 29.6.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Тогда PreparedStatement для тебя бесполезен. Либо вставляй в пустые колонки null'ы. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Grelloo
Дата 29.6.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



У меня массивы property[] и value[] заполнены значениями и не содержат null. Каждому poperty соответствует свой value. Почему же я не могу использовать PreparedStatment? 
PM MAIL ICQ   Вверх
batigoal
Дата 29.6.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Grelloo @  29.6.2006,  17:45 Найти цитируемый пост)
Почему же я не могу использовать PreparedStatment?  

Можешь, просто это не даст тебе прироста в случае динамических запросов. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
powerOn
Дата 29.6.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(Grelloo @  29.6.2006,  17:29 Найти цитируемый пост)
совсем другие столбцы property и values
База выглядит следующим образом
property1 property2 .. propertyN
value 1     value2      .. valueN
value 1     value2      .. valueN  


У тебя таблица не нормальзованна, её лучше на 2 разбить.

На :

propertyName, Value, ObjID

и :
ObjID, ObjName


где ObjName - объект который обладает определенными свойствами из превой таблицы. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Grelloo
Дата 29.6.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Так, мне кажется я не совсем полность изложил свою задачу и поэтому происходит непонимание.
Как я уже говорил приходит файл xml и из него вытаскивается property и value, которые являются первым уровнем от корневого элемента. То есть имеется следующая структура (это описание класса засунутого в xml):
Код

<root>
  <object>
     <property1>value1<property1>
     <property2>value2<property1>
     .......
     <propertyN>valueN</propertyN>
  </object>
<root>

Теперь зная propery и value надо создать одну строку в базе данных, где каждому property соответствует свое value. Причем primary key задается сразу и является одним из property. 
PM MAIL ICQ   Вверх
powerOn
Дата 29.6.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Сколько таких xml файлов? (Сколько обектов?)
Число свойств фиксированно или нет? Они могут быть пустыми? 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Grelloo
Дата 30.6.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



В каждом xml файле может содеражться несколько тегов <object>, причем у каждого object свой класс
Код

<object class = "class1">
</object>
<object class = "class2">
</object>

В зависимости от атрибута class выбирается parser class (с помощью HashMap), который будет обрабатывать данный тег <object>
Код

class1 ParserClass1
class2 ParserClass2

Кажый ParserClass заранее знает все property, которые ему придут. Соответственно если property пустое, то присваивается значение null.  

Это сообщение отредактировал(а) Grelloo - 30.6.2006, 10:02
PM MAIL ICQ   Вверх
powerOn
Дата 30.6.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Я так понимаю, что у тебя есть несколько объектов, каждый из которых обладает пременным числом свойств (в зависимости от класса), некоторые из которых могут быть пустыми. (?) Так чем тебе не подходит такая структура БД:

2 таблицы, в первой: 
1) id (счетчик) объекта 
2) имя класса. 

Во второй: 
1) id объетка (из первой таблицы)
2) имя свойства и 
3) значение свойства. 

Связь между записями по идентификатору объекта. 
ИМХО, так нормализованней будет. К тому же и Java код заметно упростится. Если свойство какого либо равно null, то и записи о нем просто нет. Единственный недостаток - все записи будут строками, даже числа. 
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Grelloo
Дата 30.6.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Нет у меня для каждого class будет своя таблица в БД. Как мне лучше организовать PreparedStatement для этого случая? 
PM MAIL ICQ   Вверх
powerOn
Дата 30.6.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(Grelloo @  30.6.2006,  11:35 Найти цитируемый пост)
Нет у меня для каждого class будет своя таблица в БД. Как мне лучше организовать PreparedStatement для этого случая?  


для каждой таблицы свой "заточенный" PreparedStatement. Сколько таблиц (сколько возможных запросов на добавление) - столько PreparedStatement. Либо как в ты делал - сложение строк для формирования запроса, но тогда все плюсы PreparedStatement пропадут и скорости в выполнении запросов ты не получишь. Задесь можно смело использовать просто Statement.

P.S.: ... либо 2 простых запроса в PreparedStatement на добавление любого объекта, при моей организации БД.

 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Grelloo
Дата 30.6.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Все-таки как-то странно получается: если заранее неизвестно сколько будет столбцов в таблице, то подготовить PreparedStatment достаточно сложно, т. к. приходится явно указывать все символы "?". Может есть другие варианты? 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1266 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.