Как хранить данные Map <String, LinkedList <Object>> в таблице базы данных? - PullRequest
0 голосов
/ 03 сентября 2018

Моя карта хранит строку в качестве ключа и LinkedList объектов в качестве значений. Теперь мне нужно сохранить эти данные в таблице базы данных. Мои данные карты что-то вроде -

Ключ: значение

id : [2, 3, 4, 5]

name : [Rohit, Iravati, Uttam, Sushil]

jobrole : [Software Engineer, Software Engineer, Manager, Director]

salary : [100, 100, 100, 100]

И моя структура таблицы -

[ID, имя, JOBROLE, зарплата]

Я не понимаю, как я должен читать данные с карты, чтобы создать ниже заданные запросы для сохранения этих данных карты в таблице -

  • insert into DBROLTA.Employee(id, name, jobrole, salary) values(2, 'Rohit', 'Software Engineer','100');

  • insert into DBROLTA.Employee(id, name, jobrole, salary) values(3, 'Iravati', 'Software Engineer','100');

  • insert into DBROLTA.Employee(id, name, jobrole, salary) values(4, 'Uttam', 'Manager','100');

Может кто-нибудь, пожалуйста, помогите мне.

Ответы [ 4 ]

0 голосов
/ 03 сентября 2018

Это плохой способ сделать это, но ваша текущая структура данных не оставляет мне много вариантов.

public static void main(String[] args) {

    //GIVEN
    Map<String, LinkedList<Object>> data = new HashMap<>();
    data.put("id", Stream.of(1, 2, 3)
            .collect(Collectors.toCollection(LinkedList::new)));
    data.put("name", Stream.of("a", "b", "c")
            .collect(Collectors.toCollection(LinkedList::new)));
    data.put("jobrole", Stream.of("x", "y", "z")
            .collect(Collectors.toCollection(LinkedList::new)));
    data.put("salary", Stream.of(10.0, 20.0, 30.0)
            .collect(Collectors.toCollection(LinkedList::new)));

    //Let's fix your data structure first
    Employee[] employeesArr = null;
    for (Map.Entry<String, LinkedList<Object>> entry : data.entrySet()) {
        int count = 0;
        if (employeesArr == null) {
            employeesArr = new Employee[entry.getValue().size()];
            for (int i = 0; i < employeesArr.length; i++) {
                employeesArr[i] = new Employee();
            }
        }
        switch (entry.getKey()) {
            case "id":
                for (Object o : entry.getValue()) {
                    employeesArr[count++].setId((Integer) o);
                }
                break;
            case "name":
                for (Object o : entry.getValue()) {
                    employeesArr[count++].setName((String) o);
                }
                break;
            case "jobrole":
                for (Object o : entry.getValue()) {
                    employeesArr[count++].setRole((String) o);
                }
                break;
            case "salary":
                for (Object o : entry.getValue()) {
                    employeesArr[count++].setSalary((Double) o);
                }
                break;
        }
    }

    //employeesArr is a much better data structure
    for (int i = 0; i < employeesArr.length; i++) {
        //use PreparedStatement or an ORM
        System.out.println("insert into DBROLTA.Employee(id, name, jobrole, salary) values ("
                + employeesArr[i].getId() + ", '"
                + employeesArr[i].getName() + "', '"
                + employeesArr[i].getRole() + "', "
                + employeesArr[i].getSalary()
                + ");");
    }

}

Employee.java

public class Employee {
    private int id;
    private String name;
    private String role;
    private double salary;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    //other getters/setters
}
0 голосов
/ 03 сентября 2018

Не требуется хранить ключ и соответствующий массив значений на карте, хранить ключ как идентификатор и пользовательский объект как значение.

где пользовательский объект - это объект с идентификатором свойств, именем, заданием и зарплатой.

Создание карты и сохранение пользовательских объектов в соответствии с идентификатором. Таким образом, вы можете легко извлекать объекты и создавать операторы SQL и выполнять их.

 Map<Interger, CustomObject> = new HashMap<Integer, CustomObject>

Для выполнения нескольких вложенных запросов используйте методы пакетной вставки и пакетного выполнения, чтобы избежать нескольких обращений к базе данных.

см. Как выполнить несколько операторов SQL из Java для операций пакетного обновления.

0 голосов
/ 03 сентября 2018
public static void main(String[] args) {
    Map<String, LinkedList<Object>> map = new HashMap<>();
    LinkedList<Object> data = new LinkedList<>();
    data.add(2);
    data.add(3);
    map.put("id", data);

    data = new LinkedList<>();
    data.add("Rohit");
    data.add("Iravati");
    map.put("name", data);

    data = new LinkedList<>();
    data.add("SE");
    data.add("SSE");
    map.put("jobrole", data);

    data = new LinkedList<>();
    data.add(100);
    data.add(200);
    map.put("salary", data);

    for (int i = 0; i < map.get("id").size(); i++) {
        Object id = map.get("id").get(i);
        Object name = map.get("name").get(i);
        Object jobrole = map.get("jobrole").get(i);
        Object salary = map.get("salary").get(i);
        // TODO Use above values to create your query.
        System.out.println(id + "-" + name + "-" + jobrole + "-" + salary);
    }

}
0 голосов
/ 03 сентября 2018

вы можете использовать цикл for для перебора всех ваших данных и построения строки запроса по одной

может быть что-то вроде этого

for(int j = 0; j < mapOfData.get("ID").length(); j++){
     strID = mapOfData.get("ID").get(j);
     strName = mapOfData.get("Name").get(j);

     query = "INSERT INTO TABLE VALUES (" + strID + ", " + strName + ")";
}

вы перебираете всю длину вашей карты (учитывая, что на карте НЕТ пропущенных данных), получаете доступ к каждому из связанных списков и получаете значение оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...