2017-01-23 3 views
1

У меня есть входной файл XML, который выглядит как:Чтение XML и создание нескольких таблиц

<mbean className="OperatingSystem"> 
    <attribute> 
     <attributeName>Arch</attributeName> 
     <formatter>STRING</formatter> 
    </attribute> 
    <attribute> 
     <attributeName>ProcessCpuLoad</attributeName> 
     <formatType>PERCENT</formatType> 
    </attribute> 
</mbean> 

Я создал POJO под названием 'MBeans', который выглядит следующим образом:

@XmlRootElement(name = "mbean") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Mbean 
{ 
    @XmlElement(name = "attribute") 
    private List<Attribute> attributes = null; 

    @XmlAttribute(name = "className") 
    private String className; 

    public String getClassName() { 
     return className; 
    } 
} 

Я могу успешно отменить мой XML-файл в этом POJO, и мое приложение может использовать этот объект как урожай Ded. Этот входной файл сообщает мне информацию, которую я должен извлечь из определенного MBean, который у меня есть. Есть ли способ создать несколько таблиц на основе XML-файла, так что когда я вытаскиваю указанную информацию, я могу сохранить эту информацию в указанной структуре таблицы, а затем использовать JDBC для создания таблиц SQL в моей базе данных H2?

Например, я хотел бы создать таблицы, которые выглядят как:

+------------------------+ 
|  MBeans   |  
+------+-----------------+ 
| ID | MBeanName  | 
+------+-----------------+ 
| 1 | OperatingSystem | 
+------+-----------------+ 

+--------------------------------+ 
|  Attributes    | 
+------+--------+----------------+ 
| ID | MbeanId| AttributeName | 
+------+--------+----------------+ 
| 1 | 1 | Arch   | 
+------+--------+----------------+ 
| 2 | 1 | ProcessCpuLoad | 
+------+--------+----------------+ 

+------------------------------------+ 
|  OperatingSystem.Arch  | 
+------+--------+------------+-------+ 
| ID | MbeanId| AttributeId| Value | 
+------+--------+------------+-------+ 
| 1 | 1 | 1  | amd64 | 
+------+--------+------------+-------+ 
| 2 | 1 | 1  | amd64 | 
+------+--------+------------+-------+ 

+------------------------------------+ 
| OperatingSystem.ProcessCpuLoad  | 
+------+--------+------------+-------+ 
| ID | MbeanId| AttributeId| Value | 
+------+--------+------------+-------+ 
| 1 | 1 | 2  | 0.009 | 
+------+--------+------------+-------+ 
| 2 | 1 | 2  | 0.0691| 
+------+--------+------------+-------+ 

ответ

1

я бы первым сделать:

  • отображение метода className в имени таблицы public String getTableName(String className)
  • Способ отображения attributeName in clomun name public String getColumnName(String attributeName)
  • Метод отображения formatType или formatter в типы баз данных public String getType(String formatType)

, а затем

public void createTable(Mbean bean) throws SQLException{ 
    String sql = getCreateTable(bean); 
    // execute SQL using JDBC... 
} 

private String getCreateTable(Mbean bean) { 
    String sqlStart = "CREATE TABLE " + getTableName(bean.getClassName()) + " (" ; 
    return bean.getAttributes().stream() 
     .map(attribute -> mapToColumn(attribute)) 
     .collect(Collectors.joining(", ", sqlStart, ")"); // what about primary key? 
} 

private String mapToColumn(Attribute a) { 
    return getColumnName(a.getName()) + " " + getType(/*it depends*/); 
} 
+0

спасибо! Хотя я не реализовал его так, как вы предлагали, ваше решение дало мне представление. Я создал объект под названием Table with Rows, а столбцы этой таблицы были {"ID", "MbeanID", "AttributeID", "Value"}. Затем передал этот объект методу, называемому update, способом, созданным getCreateTable(), который создавал бы необходимые таблицы sql, если они еще не существовали, или обновил существующие таблицы с помощью инструкций «insert». – Ishnark

Смежные вопросы