Wenn Sie beispielsweise das Ergebnis verarbeiten möchten, das durch Verknüpfen von zwei übergeordneten und untergeordneten Tabellen aus der Datenbank für jeden Schlüssel extrahiert wurde. Sie können es als Liste verarbeiten, aber es sieht besser aus, wenn Sie es nach Schlüssel gruppieren, oder? (Ich persönlich mag es, weil es die Lesbarkeit verbessert. Wenn es ein Leistungsproblem gibt, kann es nicht behoben werden.) Versuchen Sie diesmal nach der Stapelerfassung mit einer nebeneinander angeordneten Liste, in Map zu konvertieren (Schlüssel: übergeordnete Tabelle, Wert: untergeordnete Tabelle).
ER
--Mitarbeiter-ID --Mitarbeitername
Wenn Sie dies durch innere Verbindung erhalten, wird es so sein. ↓
select_all.sql
select *
vom Abteilungsleiter
Inner Join Mitarbeiter Master mit Abteilungs-ID;
Bild des Erfassungsergebnisses (Liste
Abteilung | Mitarbeiter |
---|---|
Abteilung 1 | Mitarbeiter 1 |
Abteilung 1 | Mitarbeiter 2 |
Abteilung 2 | Mitarbeiter 3 |
Abteilung 2 | Mitarbeiter 4 |
Abteilung 2 | : |
Der Zweck dieser Zeit besteht darin, dies in "Map <Abteilung, Liste
--DemoService: Hauptprozess --DbMapper: Eigentlich ein OR-Mapper wie Mybatis. --DbMapperImpl: DbMapper zum Testen implementiert. --Ergebnis: Speichern Sie das Ergebnis von select_all.sql
Zur Zeit habe ich zwei list2Map7-Methoden der Version ** Java7 ** und ** Java8 (Stream API) ** erstellt. Die Ergebnisse sollten für beide gleich sein. Immerhin hat die Implementierung mit der Stream-API eine kleine Menge Code und ist leicht zu sehen. Ich möchte nichts implementieren, was nichts mit Geschäftslogik zu tun hat. Wenn Sie Ihr Bestes geben, ist list2Map8 möglicherweise leichter zu sehen. Es scheint jedoch, dass weniger lesbarer Code zusätzlich zur Service-Klasse zunimmt.
DemoService.java
package com.example.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class DemoService {
@Autowired
DbMapper mapper;
public void execute(String[] args) {
log.info("### START ###");
// select from DB
List<Result> list = mapper.select();
//Extrahierter Inhalt
list.forEach(System.out::println);
// List ⇒ LinkedHashMap
Map<Department, List<Employee>> map = list2Map8(list);
System.out.println();
//Ergebnis der Ausgabekonvertierung
for (Map.Entry<Department, List<Employee>> entry : map.entrySet()) {
System.out.println("Key:" + entry.getKey());
entry.getValue().forEach(e -> System.out.println(" Value:" + e));
}
log.info("### END ###");
}
/**
*List⇒Map-Konvertierung(java7Ver).
*
* @param list
* @return
*/
private Map<Department, List<Employee>> list2Map7(List<Result> list) {
if (list.isEmpty()) {
return Collections.emptyMap();
}
Map<Department, List<Employee>> map = new LinkedHashMap<>();
//Letzter Schlüssel
Department prevDep = null;
List<Employee> tempList = null;
for (Result result : list) {
Department dep = result.getDepartment();
//Wenn sich der Schlüssel ändert
if (!dep.equals(prevDep)) {
//Liste der Werte initialisieren
tempList = new ArrayList<>();
//Zur Karte hinzugefügt, wobei die Werte initialisiert wurden(Referenz auf Karte setzen)
map.put(dep, tempList);
//Verwenden Sie diesen Schlüssel als vorherigen Schlüssel
prevDep = dep;
}
//Fügen Sie tempList einen Wert hinzu, der auf die Map verweist
tempList.add(result.getEmployee());
}
return map;
}
/**
*List⇒Map-Konvertierung(java8Ver).
*
* @param list
* @return
*/
private Map<Department, List<Employee>> list2Map8(List<Result> list) {
// List(Wert)⇒Map(キー、Wert)Umstellung auf
Map<Department, List<Employee>> ret = list.stream()
.collect(Collectors.groupingBy(Result::getDepartment,
LinkedHashMap::new, Collectors.mapping(Result::getEmployee, Collectors.toList())));
return ret;
}
}
Ich verwende ** LinkedHashMap **, um die Akquisitionsreihenfolge beizubehalten. Es wird in HashMap nicht beibehalten. (Vielen Dank für Ihren Kommentar und die Verbesserung der Konvertierungsmethode.)
Eigentlich fühlt es sich an, als würde man Mybatis oder OR Mapper verwenden.
DbMapper.java
package com.example.demo;
import java.util.List;
import org.springframework.stereotype.Component;
@Component
public interface DbMapper {
List<Result> select();
}
Gibt Daten zum Debuggen zurück.
DbMapperImpl.java
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
@Component
public class DbMapperImpl implements DbMapper {
@Override
public List<Result> select() {
List<Result> list = new ArrayList<>();
list.add(getResult(1, 101));
list.add(getResult(1, 102));
list.add(getResult(2, 203));
list.add(getResult(3, 304));
list.add(getResult(3, 305));
list.add(getResult(3, 306));
return list;
}
private Result getResult(int did, int eid) {
Department department = new Department();
department.setDepartmentId(did);
department.setDepartmentName("System" + did + "Teilung");
Employee employee = new Employee();
employee.setEmployeeId(eid);
employee.setName("Yamada" + eid + "Ro");
employee.setDepartmentId(department.getDepartmentId());
Result result = new Result(department, employee);
return result;
}
}
Das Objekt, in dem das SELECT-Ergebnis aus der DB zuerst gespeichert wird.
Result.java
package com.example.demo;
import lombok.Data;
@Data
public class Result {
private Department department;
private Employee employee;
public Result() {
}
public Result(Department department, Employee employee) {
this.department = department;
this.employee = employee;
}
}
Abteilungsleiter. Lomboks @Data überschreibt den Hashcode und ist gleich. Gleiches gilt für den Mitarbeiterstamm. Je nach Situation ist PK das einzige zu überschreibende Feld, wenn dies tatsächlich einen Datensatz in der Tabelle darstellt. Erstellen Sie in diesem Fall Ihre eigenen, ohne @Data zu verwenden. Override ist erforderlich, da LinkedHashMap (HashMap) verwendet wird.
Department.java
package com.example.demo;
import lombok.Data;
@Data
public class Department {
private Integer departmentId;
private String departmentName;
}
Mitarbeiterstamm.
Employee.java
package com.example.demo;
import lombok.Data;
@Data
public class Employee {
private Integer employeeId;
private String name;
private Integer departmentId;
}
Es wird für jeden Schlüssel (jede Abteilung) ordnungsgemäß in eine Karte konvertiert.
Ausführungsergebnis
Result(department=Department(departmentId=1, departmentName=Systemabschnitt 1), employee=Employee(employeeId=101, name=Yamada 101ro, departmentId=1))
Result(department=Department(departmentId=1, departmentName=Systemabschnitt 1), employee=Employee(employeeId=102, name=102ro Yamada, departmentId=1))
Result(department=Department(departmentId=2, departmentName=Systemabschnitt 2), employee=Employee(employeeId=203, name=Yamada 203ro, departmentId=2))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=304, name=Yamada 304ro, departmentId=3))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=305, name=Yamada 305ro, departmentId=3))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=306, name=Yamada 306ro, departmentId=3))
Key:Department(departmentId=1, departmentName=Systemabschnitt 1)
Value:Employee(employeeId=101, name=Yamada 101ro, departmentId=1)
Value:Employee(employeeId=102, name=102ro Yamada, departmentId=1)
Key:Department(departmentId=2, departmentName=Systemabschnitt 2)
Value:Employee(employeeId=203, name=Yamada 203ro, departmentId=2)
Key:Department(departmentId=3, departmentName=Systemabschnitt 3)
Value:Employee(employeeId=304, name=Yamada 304ro, departmentId=3)
Value:Employee(employeeId=305, name=Yamada 305ro, departmentId=3)
Value:Employee(employeeId=306, name=Yamada 306ro, departmentId=3)
Lombok ist praktisch, nicht wahr?